我也不理解我们为什么要学 Win32,更不理解我们为什么要用这么底层且压根和游戏没什么关系的框架去写电子游戏…… 课纲如此。 可能这就是作为中国传媒大学的学子的骄傲吧……
总之,与大一的游戏创作课并行的,是一门主打 C 语言与 Win32 编程实践的课目(我忘了具体叫什么)。 我想着学都学了,不用白不用,遂拿来开发游创的课设。
显然我不可能在裸 Win32 API 上直接开发游戏,总得叠一些基础设施抽象层。 于是我这么做了。
基于 Win32 API 已有的类型,我浅度封装了一些游戏开发上必须的套件类:
- 窗口管理器(主要是和 Windows 打交道,以及分发事件)
- 游戏管理器
- 材质实例类
- 渲染器
- 精灵(基本就是可切换材质的渲染器)
- 文字(基本就是固定材质但是可以被排版的渲染器)
- 物理(业务特需的简单物理,没做通用物理)
再基于此,开发了能跑起来的游戏逻辑。 运行界面看起来像这样:
它甚至支持简单的 Z 轴缩放和排序!
想下载试玩的话,这里是项目的 GitHub 仓库,就是得自己编译一下。
有一说一,这次的封装我认为不是很成功。
尽管在「实现游戏」这个目标上完成得很好,但是这样封装出来的产物和 Win32 API 本身以及游戏逻辑耦合得都很紧密,很难迁移给别的项目使用。 一个合格的通用游戏引擎(或者就仅仅叫它「框架」),在设计上应当是对上下层皆不透明的。 不管什么业务、基于什么平台,都可以通过同一套 API 设计来完成开发。
事实上这也是 Win32 API 在各异的 Windows 版本与 Windows 应用开发者之间所达成的目标。
意识到这一点之后,我很快在下面的课程项目中转手去开发一套更好的框架了。