65.9K
CodeProject 正在变化。 阅读更多。
Home

基于OpenGL ES 2.0 3D引擎、支持Lua、Bullet和Vorbis的单点触控休闲3D游戏

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (7投票s)

2012年11月6日

CPOL

5分钟阅读

viewsIcon

53903

downloadIcon

3376

Android-x86 原生游戏引擎 - 无 JNI。

1. Android x86项目存档链接

2. Android x86版CasualGame.apk链接

3. ARM版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来说,这个问题只会变得更糟,因为它甚至不是标准引擎支持的平台。

这是我在开发这款游戏时面临的主要障碍。我删除了对预编译库的依赖,并用实际的库源代码替换了它们。我已添加(并静态链接)到引擎的库源代码包括:

  1. Lua 5.2,用于脚本。 (关于如何在Android上编译Lua,请参考此处 - http://stackoverflow.com/questions/12299659/compiling-lua-lib-for-android-success-but-strange-segfaults

  2. Bullet 2.7

  3. OpenAL - 由于这是一个NativeActivity项目,因此过程很复杂。在阅读了这篇博文后,我被引导到正确的方向:http://blog.tewdew.com/post/6852907694/using-jni-from-a-native-activity

  4. PNG

  5. Zlib

  6. Vorbis

开发设置

  1. Win7 x64 主机,Fedora 16 客户机。即**Linux开发环境**

  2. Android SDK r2.0.0.3, NDK r8b, API 15 (x86)

  3. Eclipse 3.7(带ADT、CDT和Sequoyah)

  4. DS5 ARM Debugger Community Edition(适用于Android Native Activity调试的最佳工具)

  5. Ant(仅用于资源打包)

  6. Maya 2013

  7. AVD(API 15,启用了GPU仿真)

步骤如下
  1. 解压压缩包后,您将得到2个Android NDK项目和一个external-deps文件夹。这些是构建此游戏所必需的最基本组件,并且包含上述所有修改。
    1. **gameplay**,这是游戏引擎
    2. **CasualGame**,这是游戏
    请检查*Application.mk*和*Android.mk*文件。原始文件已分别重命名为*Application.mk.orig*和*Android.mk.orig*。
  2. 从Eclipse内部,将两个项目**导入**为**“将现有项目导入工作区”**。这将保留构建这些项目所需的所有设置。请记住从**android**子文件夹导入,否则Eclipse将无法将这些项目识别为Android NDK项目。
  3. 首先构建gameplay项目。这将把引擎构建为静态库,即*gameplay/android/obj/local/x86*文件夹中的*libgameplay.a*。
  4. 接下来,构建CasualGame项目。这将把游戏构建为共享库,即*libCasualGame.so*。
  5. 现在我们已经构建了代码的本地部分。接下来,我们需要将游戏资源添加到apk中。这可以通过ant从命令行完成。
  6. 导航到CasualGame项目的android子文件夹,然后键入**android update project -t 1 -p . -s**
  7. 接下来键入**ant debug install。**这将生成包含我们的NDK代码的apk,并将游戏资源插入其中。因此,我们得到了**CasualGame.apk**。
  8. 现在回到Eclipse,像普通Android NDK应用程序一样运行/调试项目。

关注点

成功创建了一个游戏,并将一个精简、功能丰富的游戏引擎移植到了Android x86平台。太棒了!!太棒了!!太棒了!!

如果您遇到任何障碍,请告诉我。我会尽力提供帮助。**: )**

历史

v1.0 - gameplay for Android x86。

v1.1(进行中)- 基于此框架优化3D RacerDemo。添加2D纹理打包和动画工具。

© . All rights reserved.