多语言展示
当前在线:1996今日阅读:27今日分享:41

libgdx:[24]laying foundation 基础奠定

此篇介绍更多的实现细节
工具/原料
1

libgdx

2

eclipse

Laying foundations 奠定基础
1

让我们来继续从理论到实践来研究跟多实现的细节。 我们来实现基础版本的CanyonBunnyMain, WorldController,和 WorldRenderer. 此外 我们会用一个多功能的类,在一个名为Constants的类中来存储常量。 这个类并没有在类图中出现, 因为它存储的都是常量,那可能会在每一个类中用到,与每个类都画一个连线会是类图的结构乱糟糟的,另外我们不能把每个常量都复制到 类图中,这会使类图的可读性大大降低。

2

为了更加简洁我们用constants类来存储我们的常量。另外还可以通过使用一个文件来驱动这些常量,避免当某个常量的值需要改变时要重新编译你的代码。

Implementing Constants 实现constans类
1

实现常量    这是常量的实现代码:package com.packtpub.libgdx.canyonbunny.util;public class Constants {  // Visible game world is 5 meters wide  public static final float VIEWPORT_WIDTH = 5.0f;  // Visible game world is 5 meters tall  public static final float VIEWPORT_HEIGHT = 5.0f; }

2

首先,我们需要实现在游戏世界中我们不移动时能够看到的游戏世界的宽度和高度。我们选择用 五米 来作为世界的宽度和高度。下一步,实现其他几个提到的类和所谓的stubs方法(空方法)。这样我们首先致力于实现布局后面我们将逐渐的实现更多的代码 并将在需要的时候实现跟多的细节。希望这样一个开发过程能够给你一个完整的开发过程的体验。

Implementing CanyonBunnyMain 实现CanyonBunnyMain
1

下面的代码是第一次实现 Canyon Bunny main

2

package com.packtpub.libgdx.canyonbunny;import com.badlogic.gdx.ApplicationListener;import com.packtpub.libgdx.canyonbunny.game.WorldController;import com.packtpub.libgdx.canyonbunny.game.WorldRenderer;public class CanyonBunnyMain implements ApplicationListener {private static final String TAG =CanyonBunnyMain.class.getName();private WorldController worldController;private WorldRenderer worldRenderer;@Override public void create () { }@Override public void render () { }@Override public void resize (int width, int height) { }@Override public void pause () { }@Override public void resume () { }@Override public void dispose () { }}

3

这个类通过实现了application listener接口成为了 libgdx的开始类通过引用world controller 和 world renderer类来实现对游戏流程和屏幕上显示的游戏状态的控制。这里有一个 TAG变量来保存从为唯一的从类名中得到的一个标签。这将会被用到每一个记录中。载入内置日志时会要求你为每一个信息输入一个TAG名字,为了保持一致性,我们简单的添加一个TAG变量给每一个类。

Implementing WorldController实现WorldController
1

下面的代码是第一次实现 world controllerpackage com.packtpub.libgdx.canyonbunny.game;public class WorldController {  private static final String TAG =    public WorldController () { }    WorldController.class.getName();   private void init () { }  public void update (float deltaTime) { }}

2

这个类含有一个叫做 init()的方法用来初始化。自然的,所有的初始化代码都可以被放在构造函数里。但是当这些初始代码放在一个分开的方法 中时 在很多方面都是很有用的。 当我们需要重设游戏中的对象时我们没有必要对整个游戏重新设置。这种做法通常会对减轻 Garbage collector 垃圾回收器 (   GC) 的负担很有帮助。相反 ,我们始终推荐重新使用已经存在的对象,最大性能化和最小内存占用的设计理念是始终被推荐的。这对于android智能手机这种资源有限的设备尤为重要。

3

Update 方法包含游戏逻辑每秒钟将会被调用上百次。它需要用到一个 delta time 实现依据 从上次渲染起 到现在的时间  来更新游戏。我们的开始类的配置使用的是 vertical synchronization 垂直同步,这是默认可用的。使用垂直同步将会覆盖你的框架速度,另外呼吁 最大调用update()的数量为60帧每秒。

Implementing WorldRenderer 实现WorldRenderer
1

第一次实现 WorldRendererpackage com.packtpub.libgdx.canyonbunny.game;import com.badlogic.gdx.graphics.OrthographicCamera;import com.badlogic.gdx.graphics.g2d.SpriteBatch;import com.badlogic.gdx.utils.Disposable;import com.packtpub.libgdx.canyonbunny.util.Constants;public class WorldRenderer implements Disposable {  private OrthographicCamera camera;  private SpriteBatch batch;  private WorldController worldController;  public WorldRenderer (WorldController worldController) { }  private void init () { }  public void render () { }  public void resize (int width, int height) { }  @Override public void dispose () { }}

2

这个类通常包含一个init()方法来实现初始化。此外,它还包括一个 render()方法  里面包含了一些游戏逻辑,这些逻辑定义了一个规则:哪些游戏对象被绘制在另外的上面。当屏幕尺寸被改变时, 包括程序事件,resize()将行动起来,并启动所需的步骤来适应新的局面。

3

Rendering 使用二维投影照相机实现很多的功能。幸运的是libgdx有一个随时可用的orthographic camera 类来简化我们2D绘制任务。Sprite batch类是实际的完成绘制工作的类。它根据相机的即时设置来绘制我们所有的游戏对象到屏幕,比如 坐标点,缩放 ,等等,。自从 sprite batch实现了libgdx的disposable 接口,当已经被使用的内存不在被需要时 调用dispose()方法来释放这些资源是明智的做法。我们将会在world render中同样实现 disposable 接口。当libgdx调用canyon bunny main 的dispose()方法时,允许我们将所有的清理工序串联起来。这种情况下,我们只需要简单的调用world render类的dispose()方法,这个会转去调用 sprite batch的dispose()方法。注意,这个类需要在它的构造器中引用一个world controller 的实例 以便它在后面绘制被controller管理的游戏世界的对象时  是可访问的。

Putting it all together 把他们放到一起
1

把他们放在一起We will now begin to fill the stub methods with some life.现在我们将开始用有生命的东西填充 stub 方法。作为我们的游戏驱动引擎保持我们的游戏世界按照一个持续的方法更新、绘制,游戏loop 循环是一个很好的开始点。在那后面我们将会添加一些sprites和判断确保updating(更新)和rendering(绘制)机制正在正常运行。为了能够操控游戏世界和游戏对象,空间被添加上能接受和响应用户的输入的方法。最终, the Camera Helper 类将会实现我们的camera可以在游戏世界自由移动并能够跟随我们选择的游戏对象。

2

新添加或是被改变的代码是粗体显示的

推荐信息