本文将介绍一款可以在模拟器和设备上运行的简单游戏。这款游戏的目标是在最短的时间内驾驶太空飞船通过一段固定的距离。游戏的灵感来源于Apache 2.0许可的'gameplay'引擎,该引擎最初是为黑莓10开发的。尽管游戏看起来简单,但它涵盖了3D物理、从Maya导入资产以及动态光照计算等关键概念。
游戏的控制逻辑如下:玩家需要触摸屏幕靠近飞船的区域以激活推进器。飞船升空后,触摸飞船左侧使其向右移动。玩家需要通过实验来掌握控制技巧。此外,游戏还包含了一些有趣的元素,如飞船的旋转和根据推进器大小调整排气光晕。
对于熟悉Android NDK开发的开发者来说,本文将提供足够的开发环境和流程细节,以便构建代码。对于新手,建议先学习一些基本的Android NDK教程。
游戏的实现细节包括:使用Maya建模的艺术资产,简单的纹理用于隧道,动态光照用于增加场景的趣味性。控制算法包括:触摸屏幕激活推进器、手指与飞船中心的距离决定推进器大小、手指与飞船水平轴的角度决定推进角度等。
游戏的3D模型、字体和声音最初以FBX、ttf和wav格式导出,然后通过gameplay-encoder编码为gpb格式以供引擎使用。字体加载和场景模型加载的代码如下:
Font *_font = Font::create( "res/airstrip.gpb" );
Bundle *bundle = Bundle::create( "res/spaceship.gpb" );
_scene = bundle->loadScene();
Node *_shipNode = _scene->findNode( "pSpaceShip" );
SAFE_RELEASE( bundle );
游戏渲染和相机移动的代码如下:
void SpaceshipGame::render(float elapsedTime) {
clear( CLEAR_COLOR_DEPTH, Vector4::zero(), 1.0, 0 );
_scene->visit(this, &SpaceshipGame::drawScene, (void*)0);
_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::updateCamera() {
if (_finished) return;
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::resetGame() {
_time = 0;
_finished = false;
_velocity.set(0, 0);
_shipGroupNode->setTranslation(_initialShipPos);
_cameraNode->setTranslation(_initialCameraPos);
}
在开发过程中,最大的挑战是将标准引擎用于BB10以外的平台,因为引擎的所有外部依赖都是以预构建库的形式提供的。对于Android x86来说,问题更加严重,因为Android x86甚至不是标准引擎支持的平台。
为了解决这个问题,移除了对预构建库的依赖,并用库的实际源代码替换了它们。添加到引擎中(并静态链接)的库源代码包括Lua 5.2(用于脚本编写)、Bullet 2.7、OpenAL、PNG、Zlib和Vorbis。
开发环境包括Windows 7 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(仅用于资产打包)。
构建游戏的步骤如下:解压存档后,将得到两个Android NDK项目和一个external-deps文件夹。这些是构建游戏所需的基本要素,包括上述所有修改。首先在Eclipse中导入这两个项目,然后构建gameplay项目,这将构建引擎作为静态库libgameplay.a。接下来,构建CasualGame项目,这将构建游戏作为共享库libCasualGame.so。最后,通过命令行使用ant将游戏资产添加到apk中。
通过这些步骤,最终得到了CasualGame.apk。现在可以在Eclipse中像普通的Android NDK应用程序一样运行/调试项目。