Slick2D 简介(二):StateBasedGame 实例讲解

Jelle Voost 上传了一系列 Slick2D 视频教程,做得非常棒。为了让更多的人看到,经过他的授权,我把教程的第二部分下载并发布到土豆网上,方便大家观看。此外,大家也可以去他的网站看一看。

这一部分教程主要以一个实际例子讲解了利用 Slick2D 引擎内置的StateBasedGame类写一个简单游戏的方法,会涉及到逐帧重绘、数据更新等基本概念的运用,以及一些将贯穿开发始终的技术的应用。视频解说是英文的,为了方便大家观看,在这里我先把基本技术讲解一下:

基本技术

StateBasedGame 的思想就是一个游戏中包含若干个 State,每个 State 就相当于之前讲的一个 BasicGame,同时可以在这些 State 之间切换。因此,一个 StateBasedGame 本身不再含有updaterender等方法(这些方法随后会出现在每个 State 中),它只需要包含maininitStatesList方法。例如代码框架如下:

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类的子类的对象。它需要实现至少这几个方法:getIDinitupdaterender。代码框架:

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 会被暂停,它的updaterender函数也不会再被调用了。这点很关键,比如你可以很方便地创建一个「暂停」State,然后切换到这个 State 来使游戏暂停。

切换 State

你也可以使用一个动画效果来在不同 State 之间切换:

game.enterState(1, new FadeOutTransition(), new FadeInTransition());

第一个参数是目标 State 的 ID,后两个是离开和进入的过渡效果。

一个小游戏

这个小游戏的设计是,一些不知名的小球会从天而降,位置是随机的;你需要用鼠标接住每个小球。如果有一个小球没有被接住,你就被扣一分。整个游戏的设计步骤不是很好描述,看原视频则很清晰,因此下面的内容大家看视频就可以了。视频内容是完整的,从本文一开始的内容讲起;相信大家如果看懂了我刚才写的东西,看懂这个视频以及游戏的制作过程应该也不是很难。

你可以在土豆网观看此视频

本文作者为,最后修订于

讨论