十一、附录 a:MagneTank 源代码

本章提供了游戏中使用的所有职业的简短描述和参考资料MagneTankT2。MagneTank 可在谷歌 Play 商店(http://play.google.com/store/apps/details?)上获得 id=ifl.games.MagneTank ,原名安卓市场 ,源代码可以在本书的代码包中找到。游戏包括瞄准坦克的炮塔,触摸炮塔应该指向的地方,并在同一位置敲击以射击炮塔。为了演示支持物理的车辆,可以通过首先触摸油箱,然后向所需方向滑动,将油箱拉到左侧或右侧。

游戏的课程分布在以下主题中:

  • 游戏级职业
  • 输入类
  • 图层类
  • 经理课程
  • 菜单类
  • 活动和引擎类别

下图是 MagneTank 第二关的游戏内截图:

Source Code for MagneTank

游戏级职业

这些职业出现在游戏的可玩部分:

ManagedGameScene.java

MagneTank 的ManagedGameScene类建立在第 5 章场景和图层管理中的ManagedGameScene类的基础上,增加了一个阶梯式加载屏幕,显示游戏为每个关卡加载了什么。使用加载步骤背后的想法与加载游戏之前显示一帧的加载屏幕相同,很像SceneManager类在显示新场景时的功能,但是加载屏幕会针对每个加载步骤进行更新,而不是在首次显示加载屏幕时只更新一次。

本课程基于以下食谱:

  • 将文本应用于图层第 2 章使用实体**
  • 创建场景管理器第五章场景和图层管理**
  • 什么是更新处理器?第 7 章中的与更新处理器一起工作

游戏等级. java

GameLevel职业将所有其他游戏中的职业聚集在一起,形成了 MagneTank 的可玩部分。它处理每个实际游戏关卡的构建和执行。它扩展了一个定制的ManagedGameScene类,该类包含了一系列LoadingRunnable对象,这些对象以允许在屏幕上显示关卡构建的每个进程的步骤来创建关卡。GameLevel类还使用GameManager类来测试输赢情况,从而确定每个游戏级别的完成与否。

本课程基于以下食谱:

  • 理解和设计实体第 2 章使用实体**
  • 第二章与实体合作中用精灵将场景带入生活
  • 将文本应用于图层第 2 章使用实体**
  • 覆盖第 2 章中的【管理日期】方法与实体一起工作
  • 第二章中使用修改器和实体修改器处理实体
  • 使用视差背景创建透视第三章设计你的菜单**
  • 介绍第四章中的相机对象使用相机
  • 第 4 章中用绑定的摄像头限制摄像头区域使用摄像头
  • 第四章使用相机中,使用变焦相机仔细观察
  • 将平视显示器应用于摄像机第 4 章中的使用摄像机
  • 第五章场景和图层管理中自定义管理的场景和图层
  • 第 6 章物理学应用中的 Box2D 物理学扩展介绍
  • 什么是更新处理器?第 7 章中的与更新处理器一起工作
  • 创建雪碧池第 8 章最大化性能**

加载可运行.java

LoadingRunnable类充当Runnable对象,同时也更新ManagedGameScene类中的加载屏幕。每个ManagedGameScene类中都有一个ArrayList类型的LoadingRunnable对象,让开发人员可以控制向玩家显示多少加载进度。重要的是要注意,虽然在 MagneTank 中加载屏幕的更新不是处理器密集型的,但是更复杂、图形复杂的加载屏幕可能会对 eah 级别的加载时间造成很大影响。

Levels.java

Levels类保存了游戏中可以玩的所有关卡的数组,以及检索特定关卡的辅助方法。

BouncingPowerBar.java

BouncingPowerBar级向玩家显示一个弹跳指示器,指示车辆的每次射击威力有多大。它将指示器的可见位置转换为一个分数值,然后应用三次曲线,在试图实现最强有力的射击时增加更多的挑战。下图显示了由三个独立图像构建的电源条的外观:

BouncingPowerBar.java

BouncingPowerBar课程基于以下食谱:

  • 理解和设计实体第 2 章使用实体**
  • 第二章与实体合作中用精灵将场景带入生活
  • 覆盖第 2 章中的【管理日期】方法与实体一起工作
  • 将平视显示器应用到相机上第 2 章与实体一起工作**

磁库. java

MagneTank类创建并控制游戏所基于的车辆。它使用关节将 Box2D 车身拼接在一起,创建了一个启用物理功能的车辆,并通过BoundTouchInputs使用玩家的输入来控制车辆的每个部分如何移动和运行。下图显示了建造前后的 MagneTank:

MagneTank.java

MagneTank课程基于以下食谱:

  • 理解和设计实体第 2 章使用实体**
  • 第二章与实体合作中用精灵将场景带入生活
  • 使用相对旋转第 2 章中的与实体一起工作
  • 覆盖第 2 章中的【管理日期】方法与实体一起工作
  • 第 4 章中用绑定的摄像头限制摄像头区域使用摄像头
  • 第 6 章物理学应用中的 Box2D 物理学扩展介绍
  • 了解不同体型第六章物理学应用**
  • 通过在第 6 章物理学应用中指定顶点来创建独特的物体
  • 使用力、速度和扭矩第 6 章物理学的应用**
  • 第 6 章物理学应用中的关节工作
  • 什么是更新处理器?第 7 章中的与更新处理器一起工作
  • 第 10 章中应用基于精灵的阴影,从安德工程中获取更多

磁力仪. java

MagneticCrate类扩展了MagneticPhysObject类。它创造和处理各种类型的板条箱,可从 MagneTank 车发射。每个板条箱都以平铺精灵的形式显示,平铺精灵的图像索引设置为板条箱的类型。MagneticCrate课程利用了来自物理世界ContactListener的 Box2DpostSolve()方法。下图显示了游戏中可用的各种大小和类型的板条箱:

MagneticCrate.java

MagneticCrate课程基于以下食谱:

  • 理解和设计实体第 2 章使用实体**
  • 第二章与实体合作中用精灵将场景带入生活
  • 覆盖第 2 章中的【管理日期】方法与实体一起工作
  • 第 6 章物理学应用中的 Box2D 物理学扩展介绍
  • 了解不同体型第六章物理学应用**
  • 使用第 6 章物理学应用中的预求解和后求解
  • 什么是更新处理器?第 7 章中的与更新处理器一起工作

MagneticOrb.java

MagneticOrb职业在 MagneTank 当前的抛射体周围创造一个视觉效果。它以相反的方向旋转两个漩涡图像(见下图),以产生球形力的错觉。MagneticOrb类随着射弹的装填和射击而形成和消失。

MagneticOrb.java

MagneticOrb课程基于以下食谱:

  • 理解和设计实体第 2 章使用实体**
  • 第二章与实体合作中用精灵将场景带入生活
  • 使用相对旋转第 2 章中的与实体一起工作
  • 覆盖第 2 章中的【管理日期】方法与实体一起工作

磁物理对象. java

MagneticPhysObject类扩展了PhysObject类,允许 MagneTank 车抓取或释放物体。当被抓住时,物体受到反重力以及将物体拉向磁坦克炮塔的力。

MagneticPhysObject课程基于以下食谱:

  • 第 6 章中介绍 Box2D 物理扩展,物理应用
  • 了解不同体型第六章物理学的应用
  • 使用力、速度和扭矩第 6 章物理学的应用
  • 对特定物体施加反重力第 6 章物理学的应用
  • 什么是更新处理器?第 6 章使用更新处理器

MechRat.java

MechRat类扩展了PhysObject类,以利用postSolve()方法,该方法在与另一个支持物理的对象碰撞时被调用。如果力足够大,机甲就会被摧毁,之前加载的粒子效果会立即显示出来。MechRat 也有通过旋转关节连接的轮子,这增加了摧毁它的挑战。下图显示了 MechRat 的视觉构成:

MechRat.java

本课程基于以下食谱:

  • 了解和设计实体第 2 章中的使用更新处理器
  • 第二章与更新处理器合作中,用精灵将场景带入生活
  • 覆盖第 2 章中的 onManagedUpdate 方法使用更新处理器
  • 使用粒子系统第 2 章使用更新处理器**
  • 第 6 章物理学应用中的 Box2D 物理学扩展介绍
  • 了解不同体型第六章物理学应用**
  • 通过在第 6 章物理学应用中指定顶点来创建独特的物体
  • 第 6 章物理学应用中的关节工作
  • 使用第 6 章物理学应用中的预求解和后求解
  • 第六章物理应用中的创建可破坏对象
  • 什么是更新处理器?第 7 章中的与更新处理器一起工作

MetalBeamDynamic.java

这个类代表游戏中看到的非静态的、物理激活的大梁。由于其重复的纹理,可以设置每个光束的长度。

MetalBeamDynamic类基于以下食谱:

  • 理解和设计实体第 2 章使用实体**
  • 第二章与实体合作中用精灵将场景带入生活
  • 使用相对旋转第 2 章中的与实体一起工作
  • 覆盖第 2 章中的【管理日期】方法与实体一起工作
  • 第 6 章物理学应用中的 Box2D 物理学扩展介绍
  • 了解不同体型第六章物理学应用**

MetalBeamStatic.java

类似于上面的MetalBeamDynamic类,这个类也代表一个大梁,但是这个对象的BodyType选项被设置为Static来创建一个不动的屏障。

MetalBeamStatic课程基于以下食谱:

  • 理解和设计实体第 2 章使用实体**
  • 第二章与实体合作中用精灵将场景带入生活
  • 使用相对旋转第 2 章中的与实体一起工作
  • 第 6 章物理学应用中的 Box2D 物理学扩展介绍
  • 了解不同体型第六章物理学应用**

视差层. java

由本书的合著者杰伊·施罗德编写并发布的ParallaxLayer类允许轻松创建ParallaxEntity对象,当Camera对象在场景中移动时,这些对象会给人以深度感。可以设置视差效果的级别,ParallaxLayer类负责正确渲染每个ParallaxEntity对象。下图显示了附属于ParallaxLayer类的 MagneTank 的背景层:

ParallaxLayer.java

ParallaxLayer课程基于以下食谱:

  • 理解和设计实体第 2 章使用实体**
  • 第二章中使用 OpenGL 使用实体
  • 覆盖第 2 章中的【管理日期】方法与实体一起工作
  • 使用视差背景创建透视第三章设计你的菜单**

物理对象. java

PhysObject类在 MagneTank 中用于委托从物理世界的ContactListener接收的联系。这也促进了一种destroy()方法,使摧毁物理物体变得更容易。

PhysObject课程基于以下食谱:

  • 理解和设计实体第 2 章使用实体**
  • 第 6 章物理学应用中的 Box2D 物理学扩展介绍
  • 了解不同体型第六章物理学应用**
  • 使用第 6 章物理学应用中的预求解和后求解
  • 什么是更新处理器?第 7 章中的与更新处理器 一起工作

RemainingCratesBar.java

RemainingCratesBar类为玩家提供了一个可视化的表示,让 MagneTank 拍摄哪个板条箱。每一层中剩余的板条箱的尺寸、类型和数量从GameLevel类中检索,并因层而异。当一个箱子被射击时,RemainingCratesBar类会产生动画来反映游戏状态的变化。

本课程基于以下食谱:

  • 理解和设计实体第 2 章使用实体**
  • 第二章与实体合作中用精灵将场景带入生活
  • 第二章中使用 OpenGL 使用实体
  • 覆盖第 2 章中的【管理日期】方法与实体一起工作
  • 第二章中使用修改器和实体修改器处理实体

TexturedBezierLandscape.java

TexturedBezierLandscape类创建了两个纹理网格和一个物理实体来表示关卡的地面。顾名思义,风景由贝塞尔曲线组成,以显示上升或下降的坡度。纹理网格由重复纹理制成,以避免景观区域之间的任何可见接缝。下图显示了用于创建风景的两个纹理,以及应用贝塞尔曲线斜率后组合网格的显示示例:

TexturedBezierLandscape.java

TexturedBezierLandscape课程基于以下食谱:

  • 理解和设计实体第 2 章使用实体**
  • 第二章中使用 OpenGL 使用实体
  • 第 6 章物理学应用中的 Box2D 物理学扩展介绍
  • 了解不同体型第六章物理学应用**
  • 通过在第 6 章物理学应用中指定顶点来创建独特的物体
  • 第 10 章中的纹理网格从和发动机中获取更多信息

TexturedMesh.java

这个类和食谱中的TexturedMesh类是一样的,纹理网格第 10 章从 AndEngine 中获取更多。

WoodenBeamDynamic.java

这个类类似于MetalBeam类,但是增加了一个生命值方面,一旦WoodenBeamDynamic类的生命值达到零,就会被粒子效果取代。

WoodenBeamDynamic类基于以下食谱:

  • 理解和设计实体第 2 章使用实体**
  • 第二章与实体合作中用精灵将场景带入生活
  • 使用相对旋转第 2 章中的与实体一起工作
  • 覆盖第 2 章中的【管理日期】方法与实体一起工作
  • 使用粒子系统第 2 章使用实体**
  • 第 6 章物理学应用中的 Box2D 物理学扩展介绍
  • 了解不同体型第六章物理学应用**
  • 使用第 6 章物理学应用中的预求解和后求解
  • 什么是更新处理器?第 7 章中的与更新处理器一起工作

输入类别

这些类中的每一个都处理游戏中使用的特定输入法:

BoundTouchInput.java

BoundTouchInput类方便了输入的委托,然后输入被绑定到BoundTouchInput类。这可以很容易地在游戏中看到,当移动 MagneTank 瞄准炮塔。当触摸进入另一个可触摸区域时,它会保持与原始区域的联系。

GrowButton.java

GrowButton类只是显示一个图像,当玩家触摸它时,它会增长到特定的比例,当触摸解除或丢失时,它会恢复到原始比例。

本课程基于以下食谱:

  • 理解和设计实体第 2 章使用实体**
  • 第二章与实体合作中用精灵将场景带入生活
  • 覆盖第 2 章中的【管理日期】方法与实体一起工作
  • 第二章中使用修改器和实体修改器处理实体

GrowToggleButton.java

基于GrowButton类,该类增加了显示一个或两个TiledTextureRegion索引的功能,具体取决于条件的状态。

GrowToggleButton课程基于以下食谱:

  • 理解和设计实体第 2 章使用实体**
  • 第二章与实体合作中用精灵将场景带入生活
  • 覆盖第 2 章中的【管理日期】方法与实体一起工作
  • 第二章中使用修改器和实体修改器处理实体

生长切换文本按钮.java

基于GrowToggleButton类,这个类使用Text对象而不是TiledTextureRegion对象来显示条件的状态。

GrowToggleTextButton课程基于以下食谱:

  • 理解和设计实体第 2 章使用实体**
  • 第二章与实体合作中用精灵将场景带入生活
  • 将文本应用于图层第 2 章使用实体**
  • 覆盖第 2 章中的【管理日期】方法与实体一起工作
  • 第二章中使用修改器和实体修改器处理实体

图层类别

这些类代表游戏中存在的层:

LevelPauseLayer.java

LevelPauseLayer类表示当一个关卡暂停时显示给玩家的图层。它显示当前的关卡编号、分数和高分,以及返回游戏、返回关卡选择屏幕、重新开始关卡或跳到下一个关卡的按钮。

本课程基于以下食谱:

  • 理解和设计实体第 2 章使用实体**
  • 第二章与实体合作中用精灵将场景带入生活
  • 将文本应用于图层第 2 章使用实体**
  • 第五章场景和图层管理中自定义管理的场景和图层
  • 什么是更新处理器?第 7 章中的与更新处理器一起工作

levelwonlyesterday . Java

LevelWonLayer类表示当一个关卡成功完成时显示给玩家的图层。它显示当前的等级号、分数和高分,以及玩家获得的星级。它还包括按钮,返回到级别选择屏幕,重播级别,或继续到下一个级别。下图显示了LevelWonLayer类纹理以及它们在游戏中组装时的样子:

LevelWonLayer.java

LevelWonLayer课程基于以下食谱:

  • 理解和设计实体第 2 章使用实体**
  • 第二章与实体合作中用精灵将场景带入生活
  • 将文本应用于图层第 2 章使用实体**
  • 第二章中使用修改器和实体修改器处理实体
  • 第五章场景和图层管理中自定义管理的场景和图层
  • 什么是更新处理器?第 7 章中的与更新处理器一起工作

ManagedLayer.java

该类与第 5 章场景和图层管理创建场景管理器配方中的ManagedLayer类相同。

选项层. java

该层可从MainMenu场景访问,并允许播放器启用或禁用音乐和声音,以及选择图形质量或重置他们已经实现的级别完成数据。

OptionsLayer课程基于以下食谱:

  • 理解和设计实体第 2 章使用实体**
  • 第二章与实体合作中用精灵将场景带入生活
  • 将文本应用于图层第 2 章使用实体**
  • 第五章场景和图层管理中自定义管理的场景和图层
  • 什么是更新处理器?第 7 章中的与更新处理器一起工作

经理班

这些类各自管理游戏的特定方面:

游戏管理员. java

GameManager类只是便于检查两个条件,以确定一个级别是完成还是失败。利用这些信息,游戏管理器调用GameLevel类中设置的适当方法。

本课程基于以下食谱:

  • 第一章中创建游戏管理器
  • 什么是更新处理器?第 7 章中的与更新处理器一起工作

ResourceManager.java

ResourceManager类与第一章和【引擎游戏结构】中的非常相似,但是如果需要,增加了使用一组较低质量纹理的能力。它还包括确定准确字体纹理大小的方法,以防止浪费宝贵的纹理内存。

本课程基于以下食谱:

  • 第 1 章和引擎游戏结构中应用纹理选项
  • 使用第一章中的安卓引擎字体资源
  • 第一章和引擎游戏结构中创建资源管理器
  • 第二章中使用 OpenGL 使用实体
  • 第五章场景和图层管理中设置场景资源的资源管理器

SceneManager.java

该类与第 5 章场景和图层管理创建场景管理器配方中的SceneManager类相同。

sfxmmanager . Java

这个简单的类处理音乐和声音的回放以及它们的静音状态。

SFXManager类基于以下配方:

  • 第一章和引擎游戏结构中介绍声音和音乐

菜单类

这些类只用于游戏中的菜单。

LevelSelector.java

这个类非常类似于第 3 章设计你的菜单中的等级选择器,但是使用了一系列LevelSelectorButton对象而不是精灵。

本课程基于以下食谱:

  • 理解和设计实体第 2 章使用实体**
  • 第二章与实体合作中用精灵将场景带入生活
  • 第三章设计您的菜单中创建我们的等级选择系统

LevelSelectorButton.java

LevelSelectorButton类直观地向玩家显示一个关卡的状态,锁定或解锁,以及如果关卡解锁所达到的星级数。

本课程基于以下食谱:

  • 理解和设计实体第 2 章使用实体**
  • 第二章与实体合作中用精灵将场景带入生活
  • 将文本应用于图层第 2 章使用实体**
  • 覆盖第 2 章中的【管理日期】方法与实体一起工作
  • 第二章中使用修改器和实体修改器处理实体

MainMenu.java

MainMenu类包含两个Entity对象,一个代表标题屏幕,一个代表级别选择屏幕。两个屏幕之间的移动是使用实体修改器实现的。在主菜单的第一次显示期间,当游戏资源被加载时,加载屏幕被显示。

MainMenu课程基于以下食谱:

  • 理解和设计实体第 2 章使用实体**
  • 第二章与实体合作中用精灵将场景带入生活
  • 覆盖第 2 章中的【管理日期】方法与实体一起工作
  • 第二章中使用修改器和实体修改器处理实体
  • 第五章场景和图层管理中自定义管理的场景和图层

ManagedMenuScene.java

该类与第 5 章场景和图层管理创建场景管理器配方中的ManagedMenuScene类相同。

ManagedSplashScreen.java 版

本课程基于第 5 章场景和图层管理定制管理场景和图层食谱中的ManagedMenuScene课程。它会在闪屏隐藏后添加卸载Entity对象的代码。

splash screen . Java 版

SplashScreen类使用实体修改器和分辨率无关的定位来显示游戏的闪屏。每个标志都是可点击的,并开始一个与标志相关的意图。

本课程基于以下食谱:

  • 第二章与实体合作中用精灵将场景带入生活
  • 将文本应用于图层第 2 章使用实体**
  • 第二章中使用修改器和实体修改器处理实体
  • 第五章场景和图层管理中自定义管理的场景和图层
  • 什么是更新处理器?第 7 章中的与更新处理器一起工作

活动和引擎类别

这些课程是游戏的支柱。

MagneTankActivity.java

这个活动类建立在标准和工程BaseGameActivity类的基础上,增加了广告、一些在 onCreateEngineOptions()方法中执行的高级分辨率缩放,以及保存和恢复选项和分数的共享偏好方法。

本课程基于以下食谱:

  • 了解第一章中的生命周期
  • 第一章和引擎游戏结构中选择我们的引擎类型
  • 第一章中保存和加载游戏数据
  • 使用第五章场景和图层管理中的场景管理器设置活动

电磁铁平滑相机. java

该职业扩展了SmoothCamera对象,但包括在指定时间内平移到敌方基地的能力,以及追踪MagneTank对象的能力。

本课程基于以下食谱:

  • 介绍第四章中的相机对象使用相机
  • 第 4 章使用相机中使用平滑相机创建平滑移动
  • 什么是更新处理器?第 7 章中的与更新处理器一起工作

ManagedScene.java

该类与第 5 章场景和图层管理创建场景管理器配方中的ManagedScene类相同。

可切换的 FixedStepEngine.java

当调用了 EnableFixedStep()方法时,这个Engine对象的行为完全像一个FixedStepEngine对象。

本课程基于以下食谱:

  • 第一章和引擎游戏结构中选择我们的引擎类型
  • 什么是更新处理器?第 7 章中的与更新处理器一起工作