基于OpenGL ES 2.0 3D引擎、支持Lua、Bullet和Vorbis的单点触控休闲3D游戏
Android-x86 原生游戏引擎 - 无 JNI。
2. Android x86版CasualGame.apk链接
免责声明
本文是我们的“玩转Android:Android游戏应用大赛”的一部分,有不同的要求和不那么严格的准则。
引言
这是一款可在模拟器和设备上玩耍的简单游戏。你能打破我x86模拟器的最佳时间19秒吗? :)
您需要触摸飞船下方的区域使其上升。一旦升空,触摸飞船的左侧使其向右移动。尝试一下控制,直到您掌握窍门。打破我的记录!!!
对于有Android NDK开发经验的人来说,我的开发设置和过程的简要说明应该足以构建代码。
对于Android NDK开发新手,您需要浏览一些网络上和CodeProject上的基础Android **NDK**教程。 :)
我非常期待您对这个代码库以及其开发设置(因为这是Android NDK开发中一件棘手的事情)的任何问题或建议。
灵感与动力
我的工作基于RIM为BB10开发的、采用Apache 2.0许可的‘gameplay’引擎。
虽然游戏本身看起来很简单,但它涵盖了关键概念,例如使用Bullet进行3D物理模拟、从Maya(或Max)导入资源以及动态光照计算。
同样重要的是,我想提请大家注意用于创建此游戏的强大引擎。
我的大部分工作都集中在将这个游戏引擎移植、修改和增强到Android x86平台。
基于我在跨平台智能手机游戏开发方面的专业经验、发现和学习,我可以自信地说,这个框架作为Android x86游戏开发的一个精简而功能丰富的开源技术集合,达到了最佳的平衡。
重要提示:此代码库仅包含C和C++代码。不含Java代码。它依赖于Android的Native Activity功能。
游戏实现细节
此游戏的基本目标是以最短的时间驾驶飞船通过固定的距离。
艺术资源是在Maya中建模的。它们被保持得简单。屋顶和地板网格重复使用以创建长隧道。隧道使用了简单的纹理。动态光照被用来增强场景的吸引力。
控制(算法)
1. 玩家触摸飞船附近的屏幕以启动油门。
2. 手指与飞船中心之间的距离决定油门的大小。
3. 手指与飞船水平轴之间的角度决定推力角度。
4. 如果没有施加输入,飞船将因重力而下落。
5. 为了增加趣味性,飞船会根据油门大小进行旋转,并调整排气辉光。
6. 音调的音高也与油门大小成正比。
游戏中的3D模型、字体和声音最初被导出为FBX、ttf和wav格式。然而,它们通过gameplay-encoder被编码为gpb格式以供引擎使用。
字体加载
Font *_font = Font::create( "res/airstrip.gpb" );
场景和模型加载
/ / contains spaceship, roof, ground etc..
Bundle *bundle = Bundle::create( "res/spaceship.gpb" );
_scene = bundle->loadScene();
/ / get a handle to the spaceship
Node *_shipNode = _scene->findNode( "pSpaceShip" );
SAFE_RELEASE( bundle );
使用着色器库中的着色器
material = _shipNode->getModel()->setMaterial( "res/shaders/colored,vert", " res/shaders/colored.frag", SPECULAR, 0 );
访问场景中的活动相机
_scene->getActiveCamera()->setAspectRatio( 1.5 );
相机移动
void SpaceshipGame::updateCamera() { if (_finished) return; / / Keep the camera focused on the ship const Vector3& cameraPos = _cameraNode->getTranslation(); const Vector3& shipPos = _shipGroupNode->getTranslation(); float diff = cameraPos.x - shipPos.x; if (diff > CAMERA_RANGE_BACK) { _cameraNode->translateX(-(diff - CAMERA_RANGE_BACK)); } else if (diff < -CAMERA_RANGE_FRONT) { _cameraNode->translateX(-(diff + CAMERA_RANGE_FRONT)); } }
游戏渲染
void SpaceshipGame::render( float elapsedTime ) { clear( CLEAR_COLOR_DEPTH, Vector4::zero(), 1.0, 0 ); / / for opaque drawing _scene->visit( this, &SpaceshipGame::drawScene, ( void * ) 0 ); / / for transparent drawing _scene->visit( this, &SpaceshipGame::drawScene, ( void * ) 1 ); _font->drawText( "Click to Play again", getWidth() / 2 - 175, getHeight() / 2 - 40, Vector4::one(), _font->getSize() ); }
处理游戏结束
void SpaceshipGame::resetGame()
{
_time = 0;
_finished = false;
_velocity.set(0, 0);
_shipGroupNode->setTranslation(_initialShipPos);
_cameraNode->setTranslation(_initialCameraPos);
}
琐事!!
在BB10以外的平台上使用标准引擎面临的最大挑战是,引擎的所有外部依赖项都以预编译库的形式提供。对于Android x86来说,这个问题只会变得更糟,因为它甚至不是标准引擎支持的平台。
这是我在开发这款游戏时面临的主要障碍。我删除了对预编译库的依赖,并用实际的库源代码替换了它们。我已添加(并静态链接)到引擎的库源代码包括:
Lua 5.2,用于脚本。 (关于如何在Android上编译Lua,请参考此处 - http://stackoverflow.com/questions/12299659/compiling-lua-lib-for-android-success-but-strange-segfaults)
Bullet 2.7
OpenAL - 由于这是一个NativeActivity项目,因此过程很复杂。在阅读了这篇博文后,我被引导到正确的方向:http://blog.tewdew.com/post/6852907694/using-jni-from-a-native-activity
PNG
Zlib
Vorbis
开发设置
Win7 x64 主机,Fedora 16 客户机。即**Linux开发环境**
Android SDK r2.0.0.3, NDK r8b, API 15 (x86)
Eclipse 3.7(带ADT、CDT和Sequoyah)
DS5 ARM Debugger Community Edition(适用于Android Native Activity调试的最佳工具)
Ant(仅用于资源打包)
Maya 2013
AVD(API 15,启用了GPU仿真)
- 解压压缩包后,您将得到2个Android NDK项目和一个external-deps文件夹。这些是构建此游戏所必需的最基本组件,并且包含上述所有修改。
- **gameplay**,这是游戏引擎
- **CasualGame**,这是游戏
- 从Eclipse内部,将两个项目**导入**为**“将现有项目导入工作区”**。这将保留构建这些项目所需的所有设置。请记住从**android**子文件夹导入,否则Eclipse将无法将这些项目识别为Android NDK项目。
- 首先构建gameplay项目。这将把引擎构建为静态库,即*gameplay/android/obj/local/x86*文件夹中的*libgameplay.a*。
- 接下来,构建CasualGame项目。这将把游戏构建为共享库,即*libCasualGame.so*。
- 现在我们已经构建了代码的本地部分。接下来,我们需要将游戏资源添加到apk中。这可以通过ant从命令行完成。
- 导航到CasualGame项目的android子文件夹,然后键入**android update project -t 1 -p . -s**
- 接下来键入**ant debug install。**这将生成包含我们的NDK代码的apk,并将游戏资源插入其中。因此,我们得到了**CasualGame.apk**。
- 现在回到Eclipse,像普通Android NDK应用程序一样运行/调试项目。
关注点
成功创建了一个游戏,并将一个精简、功能丰富的游戏引擎移植到了Android x86平台。太棒了!!太棒了!!太棒了!!
如果您遇到任何障碍,请告诉我。我会尽力提供帮助。**: )**
历史
v1.0 - gameplay for Android x86。
v1.1(进行中)- 基于此框架优化3D RacerDemo。添加2D纹理打包和动画工具。