目录
本章利用 Slick2D 引擎内置的StateBasedGame类写一个简单小游戏作为示例,会涉及到逐帧重绘、数据更新等基本概念,以及一些将贯穿开发始终的技术的应用。
StateBasedGame 的思想就是一个游戏中包含若干个 State,每个 State 就相当于之前讲的一个 BasicGame,同时可以在这些 State 之间切换。因此,一个 StateBasedGame 本身不再含有update、render等方法(这些方法随后会出现在每个 State 中),它只需要包含main和initStatesList方法。例如代码框架如下: ```
java public class SetupClass extends StateBasedGame {
public SetupClass(String title) {
super(title);
}
public static void main(String[] args) throws SlickException {
// ...
}
public void initStatesList(GameContainer gc) throws SlickException {
}
} 每个 StateBasedGame 包含的 GameState 将在initStatesList中初始化。每个 GameState 都是一个基于BasicGameState类的子类的对象。它需要实现至少这几个方法:getID、init、update、render。代码框架:
java
public class GameState extends BasicGameState {
public void init(GameContainer gc, StateBasedGame game) throws SlickException {
}
public void update(GameContainer gc, StateBasedGame game, int delta)
throws SlickException {
}
public void render(GameContainer gc, StateBasedGame game, Graphics g)
throws SlickException {
}
public int getID() {
return 0;
}
} ``` 其中getID方法的返回值就是这个 State 的 ID,每个 State 必须拥有不同的 ID,以便在 State 之间切换。
当我们创建好一个 State 的类(这个例子中叫做GameState),就可以在initStatesList中加入这个 State 了: java this.addState(new GameState());
也可以加入多个 State,游戏默认会载入第一个 State。如果要在 States 之间切换,你应该在相应 State 的update函数中执行如下代码: java game.enterState(1);
上面的代码会导致游戏切换到 ID 为 1 的 state。
在游戏中,当我们切换到一个新的 State 时,旧的 State 会被暂停,它的update、render函数也不会再被调用了。这点很关键,比如我们可以很方便地创建一个「暂停」State,然后切换到这个 State 来使游戏暂停。
当然我们也可以使用一个动画效果来在不同 State 之间切换:
game.enterState(1, new FadeOutTransition(), new FadeInTransition());
第一个参数是目标 State 的 ID,后两个是离开和进入的过渡效果。
到这里我们就大概知道slick2d的大体结构了,对于java程序猿来说,这个游戏引擎非常简单,很容易上手,但是slick2d已经快要10年没有更新了,对于感兴趣想要玩一玩的,可以用一下,对于想要用这个开发商业游戏的就要考虑一下其他引擎了。
我们将在下一章讲解使用slick2d开发一个小游戏demo。