启动类和生命周期

启动类

游戏应用的starter启动类是唯一需要编写的特定于平台的代码。对于每个目标平台,一段代码将实例化由平台后端提供的 Application 接口的具体实现。

对于桌面来说,如果使用 Lwjgl做后端的话,则可能是这样的:

public class DesktopStarter {
   public static void main(String[] argv) {
      LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
      new LwjglApplication(new MyGame(), config);
   }
}

对于安卓,则相应的启动类可能如下:

public class AndroidStarter extends AndroidApplication {
   public void onCreate(Bundle bundle) {
      super.onCreate(bundle);
      AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
      initialize(new MyGame(), config);
   }
}

这两个类通常分别存在于不同的模块中,例如,drop-desktop和 drop-androiud 项目。

应用程序的实际代码位于实现 ApplicationListener 接口的类中(在上面的示例中是 MyGame)。这个类的一个实例被传递给每个后端的 Application 实现的各自的初始化方法(参见上面)。然后,应用程序将在适当的时候调用 ApplicationListener 的方法(参见生命周期)。

ApplicationListener 接口

一个 LibGDX 应用有意义明确的生命周期方法,用于调节应用的各种状态。LibGDX 应用的生命周期事件方法定义在 ApplicationListener 接口中,开发人员通过在实现该接口类中处理生命周期事件方法的调用。ApplicationListener 接口的实现类,可以理解为一个游戏的实例,游戏最高级别的控制器,也是游戏主程序开始执行的入口类,在平台启动器中实例化实现该接口的实现类启动游戏。

实现该接口的类如下:

import com.badlogic.gdx.ApplicationListener;
		
/**
 * 游戏主程序的启动入口类
 */
public class MainGame implements ApplicationListener {

	@Override
	public void create() {
	}

	@Override
	public void resize(int width, int height) {
	}

	@Override
	public void render() {
	}

	@Override
	public void pause() {
	}

	@Override
	public void resume() {
	}

	@Override
	public void dispose() {
	}
}

ApplicationAdapter 抽象类

在游戏开发中如果只需要使用到生命周期方法中的几个方法,MainGame 可以继承 ApplicationAdapter 抽象类,ApplicationAdapter 空实现了 ApplicationListener 接口的所有方法。

生命周期事件方法说明

  • create(): 当应用被创建时调用一次。
  • resize(int width, int height): 游戏屏幕尺寸改变并且不处于暂停状态将被调用,在 create() 方法之后也会被调用一次。
  • render(): ApplicationListener 中的游戏循环渲染方法,每时每刻都在被调用。游戏逻辑的更新通常也是在这个方法中被执行。
  • pause(): 当游戏界面被新的一个界面覆盖时(例如按下 Home 键回到主界面时被主界面覆盖,来电时被来电界面覆盖),该方法将被调用。通常在这里保存暂停时的游戏状态。
  • resume(): 被其他界面覆盖后(pause 状态后),重新回到游戏界面时,该方法被调用。
  • dispose(): 当应用被销毁时调用。

image.png