Jelle Voost 上传了一系列 Slick2D 视频教程,做得非常棒。为了让更多的人看到,经过他的授权,我把教程的第二部分下载并发布到土豆网上,方便大家观看。此外,大家也可以去他的网站看一看。
这一部分教程主要以一个实际例子讲解了利用 Slick2D 引擎内置的StateBasedGame
类写一个简单游戏的方法,会涉及到逐帧重绘、数据更新等基本概念的运用,以及一些将贯穿开发始终的技术的应用。视频解说是英文的,为了方便大家观看,在这里我先把基本技术讲解一下:
基本技术
StateBasedGame 的思想就是一个游戏中包含若干个 State,每个 State 就相当于之前讲的一个 BasicGame,同时可以在这些 State 之间切换。因此,一个 StateBasedGame 本身不再含有update
、render
等方法(这些方法随后会出现在每个 State 中),它只需要包含main
和initStatesList
方法。例如代码框架如下:
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
。代码框架:
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 了:
this.addState(new GameState());
你也可以加入多个 State,游戏默认会载入第一个 State。如果要在 States 之间切换,你应该在相应 State 的update
函数中执行如下代码:
game.enterState(1);
上面的代码会导致游戏切换到 ID 为 1 的 state。
游戏中,当你切换到一个新的 State 时,旧的 State 会被暂停,它的update
、render
函数也不会再被调用了。这点很关键,比如你可以很方便地创建一个「暂停」State,然后切换到这个 State 来使游戏暂停。
切换 State
你也可以使用一个动画效果来在不同 State 之间切换:
game.enterState(1, new FadeOutTransition(), new FadeInTransition());
第一个参数是目标 State 的 ID,后两个是离开和进入的过渡效果。
一个小游戏
这个小游戏的设计是,一些不知名的小球会从天而降,位置是随机的;你需要用鼠标接住每个小球。如果有一个小球没有被接住,你就被扣一分。整个游戏的设计步骤不是很好描述,看原视频则很清晰,因此下面的内容大家看视频就可以了。视频内容是完整的,从本文一开始的内容讲起;相信大家如果看懂了我刚才写的东西,看懂这个视频以及游戏的制作过程应该也不是很难。
你可以在土豆网观看此视频。