zip文件还包含编译的“MonkeyGame-debug”。可以在模拟器中运行的二进制文件。在“game.build”文件夹中有一个HTML5 build。在Chrome浏览器中运行MonkeyGame.html来测试游戏。 Introduction  有一些RAD跨平台游戏开发工具/引擎支持x86平台上的Android,如下所示:http://software.intel.com/en-us/blogs/2012/03/13/game- engines-forandroid 我们将使用Monkey game engine为基于Intel架构的设备构建一款新的基于ndandriod的游戏。它的优点是在ARM和x86架构上为Android预先编译了NativeGL共享库,否则我们将不得不使用NDK工具链来重新编译它们。您可以在附带源代码的“jni”文件夹中找到这些文件。Android packager在.apk中包含了x86和ARM共享库,在部署期间,根据目标设备是ARM还是x86安装必要的库。因此,生成的.apk是跨平台兼容的,不需要为这两种不同的体系结构进行本机重新编译。 背景 记忆游戏是一个变化的经典游戏,你揭开两张牌,以找到匹配的对。当所有配对都被揭开时,游戏结束。目标是用最少的步数暴露所有对。在游戏的这种变化中使用了一副部分的扑克牌。 游戏特点:24张卡用于增加难度。基于声音和粒子效果的动画卡 游戏状态classCollision类程序性字体代class 最适合的类使用硬编码的虚拟分辨率缩放比率和不同的实际设备方面决议——非常重要,因为Android设备碎片是一个主要issue 渐变classParticle引擎class  Highscore课程class 我选择这个游戏作为教学工具对于本文because 它包含所有必要的游戏元素和清楚地展示了游戏的实时特性循环和设计原则的使用。它是一款2D游戏,因为对于现代的基于触摸屏的移动设备来说,与2D精灵交互提供了一个更直观的界面。 技术信息 一些要求的快速原型,该引擎有: 快速调试-编译-运行周期可以在任何标准兼容的HTML5浏览器中执行。OnCreate()、OnUpdate()和OnRender()方法很好地定义了游戏循环。脚本语言是面向对象的。它具有用于精灵操作和游戏数据结构的基本语言构造。自动垃圾收集。 使用的代码 GameState变量循环状态机通过其各个阶段。它在start处被初始化到STATE_MENU。这个变量还控制代码的更新和呈现部分。 隐藏,复制Code

Method SetState (state:Int)     GameState = state     Select GameState           Case STATE_MENU               //The initial menu layer           Case STATE_PLAYING               //The game layer           Case STATE_PAUSED               //The game layer paused           Default               Print "ERROR: Unknown game state!"     EndEnd

让我们检查输入和更新游戏状态: 在OnUpdate()方法中,我们调用碰撞类的Card[i]. update()方法。取决于指针是否与卡精灵碰撞,它返回卡的可见或隐藏状态。如果单击了两张卡片,则增加try计数。 隐藏,复制Code

Case STATE_PLAYING//check for two card clicks. show cards that were clicked by hiding corresponding cardback For Local i : Int = 0 Until NUM_CARDS  Card[i].Update()  If Card[i].Pressed = True And Card[i].Visible = True And click < 2 Then     Card[i].Visible = False    savecard[click] = i    click = click + 1        If click = 2 Then        slowdown = Millisecs()        turns = turns + 1   //increment tries after two cards have been clicked        End If    PlaySound boom   End If                     Next

如果找到一对匹配的牌,我们将不覆盖这些牌,否则,如果这对牌不匹配,我们将使相应的牌背面可见并再次隐藏这些牌。1.5秒的延迟允许玩家看到两张牌有足够长的时间来发现它们不匹配。 隐藏,复制Code

If click = 2  Then            If coinplace[savecard[0]] = coinplace[savecard[1]] Then  //a matching pair is found    click =0    Else                   If  Millisecs()-slowdown > slowlimit Then  // wait before covering cards again              Card[savecard[0]].Visible = True      Card[savecard[1]].Visible = True      click =0                          // reset to accept clicks on next two cards       Endif                EndifEnd IfLocal drawncard:Bool = FalseFor Local i : Int = 0 Until NUM_CARDS    If Card[i].Visible = True Then                    drawncard = True    End If                NextIf drawncard = False Then Restart()    // If no cards are left to uncover End game

当因为碰撞类返回backcard可见状态为False而没有一张卡被backcard覆盖时,drawncard布尔值将状态更改为False,游戏结束。 抖一下这些卡片: 没有动画的游戏没有多少乐趣。我们来做花瓶吧。int变量n起了作用。n = -1*n在+1和-1之间切换。DrawImage()方法具有旋转和缩放参数。我们调整卡片精灵在+1度和-1度之间的旋转来创建振动卡片效果。 隐藏,收缩,复制Code

//refactored because the renderscreen method appeared to work in the pause state, and halts // game update, except for cards vibratingMethod RenderScreen()     Cls             // for a resolution of 800x600 render cards in 6 columns and 4 rows, starting at         // x offset 33 pixels and y offset 30 pixels     For Local i:Int =  0 Until NUM_CARDS              DrawImage coins[coinplace[i]], 33+((i Mod 6)*100), 30 +(Int(i/6)*140)     Next                            //as n toggle between +-1, the card sprites oscillate(animation) between +-1 degree    //if collision check returns visible attribute show cardback else hide it     For Local i : Int = 0 Until NUM_CARDS                              If Card[i].Visible = True                                              n = -1*n            DrawImage (card, Card[i].PositionX, Card[i].PositionY, n*1.0, 1.0, 1.0)      Else        DrawImage (cardclick, Card[i].PositionX, Card[i].PositionY, 0, 1.0, 1.0)      End If     Next                             DrawImage (sidebar, 620, 0)     DrawImage pointer.image, pointer.x, pointer.y                            font.Draw( turns, 710, 290, 3, 3, 0.5, 1.0 )  //render the procedural font for number of tries    End

下载中的代码有大量注释,几乎不需要解释,但是类成员和方法在下面有详细说明。 MyGame类: 方法:实例化游戏对象-图像,声音,成员和变量。 OnUpdate()方法:轮询/中断检查鼠标/触摸屏/键盘输入,并相应地改变游戏状态和对象状态。 方法:根据游戏的菜单状态、游戏状态或暂停状态以及游戏对象的状态属性来渲染图形。 碰撞类:获取触摸/鼠标坐标d碰撞精灵,并为相应的精灵对象返回可见或隐藏的属性。 字体类:这是一种顺序生成字体只渐变类:吞世代雪碧对象,缓解他们或使用不同的equationsParticle类:产生粒子接触后,“删除”粒子生命expiresHighscore类:各种高分升序或降序orderTimer类:延迟和synchronization ,最适合的类:提供硬编码的“虚拟”分辨率,并缩放图形到不同的屏幕分辨率(纵横比),而不会导致沿着x,y屏幕空间坐标轴失真。 黑色边框将出现在if的左/右或顶部/底部 物理设备的纵横比与“虚拟”纵横比不同。屏幕方向改变。面临的问题 对于功率较小的移动设备,我尝试实现一个粒子引擎,因为集成的粒子类占用的资源有点多。编译器不喜欢我在游戏循环的特定点创建一个精灵对象列表!但我相信,只要有时间,一定会有解决办法的。最后实现了粒子类。粒子精灵是在OnCreate()方法中静态创建的。我们不是在粒子生命结束后销毁精灵对象,而是通过在数组中动态交换来“删除”它们。我也非常想念集成调试器的开发和测试 最初的开发/调试是在浏览器中完成的,以获得快速的周转时间。 在一台1024x600、7英寸的Android平板电脑上进行了可伸缩性和实际运行时性能测试。 最后的测试是在Android模拟器中的x86 AVD上进行的。 虽然HTML5编译很流畅,但在Android目标上测试时,在从碰撞类返回图形对象句柄时抛出了一个空对象异常,但实现了一个合适的解决方案。 游戏运行在x86 AVD的Android模拟器 感谢所有在Monkey coder论坛上的家伙,当问题出现时,他们总是随时准备帮助我们。 结束 源代码可供您使用,我希望您可以在x86 Android平台上自己的游戏中进一步使用它。如需澄清或解释,请提问。另外,如果你发现任何需要纠正的地方,请告诉我。您可以尝试通过改变参数和粒子引擎使用不同吐温类,看看他们工作只History  10/11/2012  1.1.0——添加highscores和计时器class8/11/20121.0.1 -添加渐变类开始按钮的前端现在看起来多达宽松政策到位——添加粒子引擎类——点击卡片生成particles5/11/2012  MemoryGame 1.0.0 , Do , -在线全球高分避免功能creep , 本文转载于:http://www.diyabc.com/frontweb/news30596.html

更多相关文章

  1. 【Android2D游戏开发之四】Android(安卓)游戏框架(一个游戏角色在
  2. 开关飞行模式
  3. Android(安卓)Intent.FLAG_ACTIVITY_NEW_TASK的说明
  4. Android(安卓)游戏开发必备的基础知识
  5. Android(安卓)fragment生命周期解析
  6. ColorStateList按钮文字变色
  7. Android(安卓)飞行模式的设置(打开/关闭飞行模式,获取飞行状态状
  8. android 绘制图片的一部分
  9. Android(安卓)标题栏和状态栏随ScrollView滑动颜色改变轻松实现

随机推荐

  1. 使用libevent实现最简单的android http-s
  2. MediaRecorder流程分析
  3. Android 7.0 自动安装APK及拍照崩溃问题
  4. android中常用的方法备忘
  5. Android笔记1——Android SDK自带的工具
  6. Android(安卓)ListView 下拉刷新 上拉更
  7. Android(安卓)studio升级后ndk项目编译打
  8. Android 调用 Web Service
  9. android动画入门篇
  10. android:imeOptions 标签