目录
Slick 2D 是一个轻量级、跨平台的 Java 2D 游戏引擎。
我一直打算写一个游戏,研究了半天游戏引擎,最终选定了 Slick2D。 要说明的是,对于大型游戏,它会显得比较简陋;但是对于一般的小游戏已经足够了,也非常适合博主这样的游戏开发者进行入门和练习。
Slick2D 是基于 LWJGL 的 2D 游戏引擎,在之前的文章中,博主研究过lwjgl,也是因为lwjgl才知道的Slick2D。Slick2D提供对状态、图像、动画、粒子、声音、字体、音乐、控制等等的支持,但是本身没有提供物理引擎。如果想在游戏中集成物理引擎,推荐使用JBox2D。如果游戏需要的物理效果不是很复杂,尝试一下自己写物理引擎也未尝不可。 博主这次的小游戏只需要用到球体的二维碰撞,所以干脆自己写了一个,非常有意思,也可以学到很多东西。 下载和详细的介绍可以Sclick2D参考官网,这里博主只简单的抛砖引玉。
需要分别下载 Slick2D(12.8MB) 和 LWJGL(5.8MB) 两部分组件。
为了使用 Slick2D,你需要把库文件添加到 IDE。使用「Add External Libraries」或者类似功能(有的 IDE 可能需要先创建一个 Project 才能选择 Libraries),把下载的文件中slick/lib中的slick.jar,以及lwjgl-x.x.x/jar目录下的全部jar文件全部添加到 IDE 即可。
最后还需要把 LWJGL 的 native(位于lwjgl-x.x.x/native/目录下)链接到 Java 虚拟机。LWJGL 是基于 OpenGL 的,而这些文件就描述了有关 OpenGL 的信息。先把这些文件放到你的项目目录中,然后找到你的 IDE 的 VM Options 设定,在里面填入如下内容: -Djava.library.path="path/to/lwjgl-x.x.x/native/<linux|macosx|solaris|windows>"
注意要把其中的路径替换为真实路径。根据实际操作系统,选择 linux, maxosx, solaris 或者 windows 的其中一个即可。
为了测试开发环境是否搭建正确,可以用一个简单的 Hello, World 级程序测试一下。 假设我们的主类叫做HelloWorld,可以添加如下代码进行测试: ```java import org.newdawn.slick.AppGameContainer; import org.newdawn.slick.BasicGame; import org.newdawn.slick.GameContainer; import org.newdawn.slick.Graphics; import org.newdawn.slick.SlickException;
public class HelloWorld extends BasicGame { public HelloWorld(String title) { super(title); } public void init(GameContainer container) throws SlickException {
}
public void update(GameContainer container, int delta)
throws SlickException {
}
public void render(GameContainer container, Graphics graphics)
throws SlickException {
graphics.drawString("Hello, World!", 100, 100);
}
public static void main(String[] args) {
AppGameContainer app = new AppGameContainer(new HelloWorld("Hello World"));
app.setDisplayMode(800, 600, false);
app.start();
}
} ``` 如果能正常显示 FPS 和 “Hello, World!” 字样,则说明 Slick2D 配置正确。
这一部分很重要,弄懂这个简单的示例程序是理解游戏开发的第一步。 - BasicGame:我们的主类继承了BasicGame类。BasicGame 是 Slick2D 提供的一种基本游戏类型。对应的还有 StateBasedGame,在下节我们会讲到。 - init:这个方法在第一次创建场景的时候会自动被调用,一般用于初始化常数、载入资源等等。其中GameContainer就是游戏「容器」,可以理解为整个游戏窗口。 - update和render:这两个方法很重要。我们玩游戏的时候都了解 FPS 的概念,即每秒的帧数。因为游戏的画面不是静止的,所以实际上程序是通过「逐帧重绘」的方式向我们呈现画面的:每秒绘制 60 次(假如 FPS 为 60),每次根据需要改变绘制的内容,从而呈现出动画效果。 - Slick2D 也是这么做的。游戏运行的时候,每次绘制之前,系统会自动调用update方法来更新数据,然后自动调用render方法来绘制,周而复始,不断循环。通过 update-render-update-render 这样调用,来最终形成我们需要的效果。所以,你的任务就是提供这两个方法的实现。 - 每次调用update方法的时间差并不是一定的(甚至都不一定是均匀的),这取决于系统的性能和一些随机因素的影响。为了解决这个问题,引入了update方法的参数delta。它代表了本次调用update和上次调用update的时间差,有的时候,我们需要这个时间差才能决定update的具体内容(比如移动的距离)。 - 在例子中,我们在render函数中干的事情就是渲染一个字符串,使用 Slick2D 提供的drawString方法。这个方法的两个整数参数代表字符串的位置。游戏坐标系以 (0,0) 为左上角,(宽,高) 为右下角,和我们习惯的笛卡尔坐标系的原点位置(左下角)不同,这个要注意一下。 - 而最后在main函数中,我们设置分辨率为 800 x 600,并启动游戏。
本章到此,我们已经完成搭建了Slick2D的简单demo了。下一章,我们正式开始用它开发一个小游戏吧。
如果觉得博主写得还不错,欢迎“关注、收藏、点赞”一键三连!