目录

1 第1章 Hello World

Tip

先建了一个显示Hello World的用户界面,但是,这个界面并不适合游戏。原因是……

游戏需要每秒刷新60帧,必须要让游戏获得主动权,而不是刷新率多少,一切随缘。

1.1 创建Hello World应用程序

1.1.1 Java Swing是什么? 
1.1.2 为什么不能使用被动渲染? 

1.2 使用主动渲染

1.2.1 什么是主动渲染?
1.2.2 定制主动渲染线程
1.3.3 创建主动渲染窗口

1.3 帧率是个大问题

1.3.1 如果你电脑太慢会怎么样?
1.3.2 如果你电脑太快会怎么样?
1.3.3 如何把帧率固定在你想要的60帧?
1.3.4 固定帧率非常难,比想象中的难太多了!

2 第2章 交互

Tip

玩游戏、玩游戏,什么叫玩游戏?必须要与游戏交互才是玩游戏,否则那不成看电影了?

那如何跟游戏交互呢?键盘和鼠标。

2.1 什么是精灵

2.1.1 精灵在游戏中的用途
2.1.2 精灵的基本概念
2.1.3 运动与动画

2.2 如何处理键盘输入

2.3 如何处理鼠标输入

3 第3章 要学一点点数学了

Tip

可能有很多人一听数学,一个脑袋两个大,但是相信我,咱们不是考试,只要理解原理就好了。

代码都是现成的,复制粘贴或者让AI来生成,一切搞定。

3.1 笛卡尔坐标与极坐标

3.1.1 笛卡尔坐标与极坐标的介绍
3.1.2 两种坐标之间的转换
3.1.3 游戏中的屏幕坐标

3.2 向量

3.2.1 向量的基本定义与表示
3.2.2 2D游戏中向量的应用:位移、速度和加速度

3.3 矩阵变换

3.3.1 矩阵的基础概念与操作
3.3.2 2D变换矩阵:平移、旋转和缩放
3.3.3 矩阵乘法以及应用

3.4 多维数组与矩阵

3.4.1 行主序(Row-major order)矩阵
3.4.2 列主序(Column-major order)矩阵

4 第4章 碰撞检测

不是你碰的,你为什么要扶她?

开发2D游戏时,碰撞检测是一个重要的部分,用于处理角色与物体的交互、障碍物检测、敌人的反应等。

4.1 基础碰撞检测技术

4.1.1 轴对齐边界盒检测
4.1.2 圆形测试相交检测
4.1.3 圆形与矩形碰撞检测
4.1.4 矩形与矩形碰撞检测

4.2 高级碰撞检测技术

4.2.1 凸多边形的碰撞检测
4.2.2 分离轴定理(SAT - Separating Axis Theorem)
4.2.3 像素级碰撞检测(Pixel-perfect Collision)
4.2.4 精确检测复杂形状的碰撞
4.2.5 使用Alpha通道处理透明区域

4.3 有追求的人,仍旧可以精益求精

4.3.1 使用空间分区技术优化碰撞检测
4.3.1.1 四叉树(Quadtree)
4.3.1.2 网格(Grid)方法
4.3.2 减少不必要的碰撞检测
4.3.2.1 广义阶段(Broad Phase)与精确阶段(Narrow Phase)
4.3.3 使用Bounding Circle减少计算

4.4 撞了以后怎么办?

4.4.1 碰撞后的反弹与物体移动
4.4.2 物体的摩擦力与阻力
4.4.3 弹性碰撞与非弹性碰撞
4.4.4 向量反射处理碰撞
4.4.5 碰撞法线与物体反应
4.4.6 使用向量预测碰撞

5 第5章 LibGDX 和 JBox2D

了解了碰撞的原理,实际上,是不用自己亲自动手的,只是我喜欢研究一下基本的原理。

我们可以用一些现成的库,或者引擎来处理碰撞检测,比如LibGDX与JBox2D。

说实话,写游戏的,没有不用引擎的。我搞的这本书,只是解释了什么叫2D引擎,浅尝辄止一下,继续研究底层原理。

如果你搞懂了LibGDX这个2D引擎,就不看我这本书了,求求你不要搞懂!!

LibGDX的源码在我心目中与Lua的源码,SQLite的源码,并列为三大“最尊重程序员”的开源代码,而不像Linux源码,看也看不懂,学也学不会,代码量又多,老虎吃天!

这三个开源项目的代码,又纯又欲,推荐阅读。

5.1 物理引擎与碰撞检测

5.1.1 集成 Box2D 物理引擎
  5.1.1.1 刚体(Rigid Bodies)的定义与使用
  5.1.1.2 碰撞形状(Colliders)和力学属性
5.1.2 使用 Box2D 进行碰撞检测
5.1.3 处理物体的物理响应

5.2 其它的无所不能的功能列举

5.2.1 2D引擎也有输入处理
5.2.1 声音与音乐必不可少
5.2.3 2D图形与渲染、精灵也能处理
5.2.4 场景管理也支持
5.2.5 爆炸、烟花也能支持(离子系统)
5.2.6 网络联机功能也不在话下

5.3 引擎虽好,不要贪杯哦

5.3.1 2D引擎千千万
5.3.2 换了别的就完蛋
5.3.3 还是要理解底层原理

6 第6章 文件和资源

声音,图像,关卡数据,一定是存在文件里的。好处至少有两点:

第一,当增删查改数据的时候,不需要重新编译软件
第二, 不想玩游戏了,可以保存,想玩了,可以读存档

但是,这一章更多的是Java文件操作的内容,我也许应该放到Java那本书里。

6.1 Java处理文件

6.2 输入与输出流

6.3 jar包

6.4 XML文件

7 第7章 图像

Java是一门“古老”的语言,所以Java支持大量的图像格式,但是,如果做游戏,只需要理解两种图像格式就可以了。一种是BufferedImage,另一种是VolatileImage。

7.1 BufferedImage格式的图片

7.2 VolatileImage格式的图片

7.3 创建透明图像

7.4 使用alpha合成

7.5 使用新技术绘制精灵

8 第8章 声音

Warning

没有声音的游戏,缺少灵魂。

8.1 声音API介绍

8.2 使用Clip类加载和播放音效

8.3 调整音量和音效

8.4 使用SourceDataLine播放背景音乐

8.5 在游戏中触发声音事件

9 第9章 字体

游戏中要显示字,显示字不难,难的是显示的字如何在游戏中协调。

很多游戏,为了协调,会自己设计字体。英文还好,只有26个字母,大小写加起来不过60个。中文就比较要命了,至少几千个字 :)

对中文字体设计者致以最高的敬意!

9.1 字体的基础知识

9.1.1 字体的基本概念
9.1.2 字体的格式(TrueType与OpenType)
9.1.3 字体的创建与管理

9.2 加载自定义字体

9.2.1 从文件中加载自定义字体
9.2.2 设置字体样式和大小
9.2.3 绘制文本
9.2.4 排版与渲染效果

9.3 处理多语言和国际化

10 第10章 至此,引擎所有的知识已经讲差不多了

下面的内容还在整理中……