学习游戏程序设计

Start

这篇文章是写给编程初学者和完全不懂编程的小白的,目的是希望能通过这篇文章, 让大家知道一下游戏大概是怎么工作的,游戏中的画面是怎么显示出来的和游戏程序的大概结构。

下面会找一个github上的h5塔防游戏举例子。这个游戏是我在准备毕业设计时候遇到的,当时好奇就花了点时间研究了一下

游戏的工作流程

几乎市面上所有常见游戏都是通过如下循环进行的

1
2
3
4
5
6
7
8
9
-> 游戏启动
-> 根据开始参数,给玩家展示一些画面,包括游戏界面,控制界面等
-> 然后持续获取玩家的反馈动作
-> 根据玩家的操作,对游戏画面进行更新, 显示游戏画面
-> 获取玩家反馈动作
-> 继续显示新画面
....
-> 玩家退出游戏
-> 结束

所谓的玩游戏的过程也就是游戏通过设备(键盘, 鼠标, 屏幕触控, 话筒)等形式获取到玩家反馈数据对游戏进行更新, 不断重复该过程, 直到达到游戏结束条件为止

游戏画面的显示

我们看到的游戏的画面, 不管多酷炫, 归根到底可以看做一系列的连续播放的图片, 而每张图片我们又可以看做是一个固定分辨率的色彩数组。

拿 1080*1920 分辨率, 60fps 的某一款游戏来说, 就是1s中给你播放60张1080p的图片给你看,那游戏怎么知道该给你看什么图片呢 ?

图片的内容可以看成是一个 1080(宽) * 1920(长) * 4(RGBA) 的数组, 只要把这个数组发送给显卡, 显卡就知道应该怎么显示, (为什么要用一维数组是因为基于性能考虑,一位数组的处理效率比高维数组要高)。

游戏渲染的过程, 可以看做是根据用户反馈计算这一些列需要显示的数组的过程

游戏的通用结构

从结构上说, 任何游戏, 实质上都是一个不断循环的程序, 当画面的处理和输出速度达到人眼视觉暂留的极限时(一般在30fps以上),人就分不出来是不是真的实时了, 以此来模拟实时的效果, 早期的胶片电影使用的也是类似的原理

任何游戏理论上都可以套用以下过程, 使用伪代码描述:

1
2
3
4
5
6
7
load( config );              // 加载游戏配置
while( game_is_running() ) { // 游戏是否继续进行
get_user_input(); // 接受用户的输入
do_something(); // 根据用户输入处理数据处理
check_stop(); // 查看是否满足结束条件
render(); // 渲染页面,渲染一次就是fps
}

游戏的实质就是根据与用户交互, 不断的修改参数对页面进行渲染, 再接受用户输入, 这整个循环称为游戏的主循环。下面我将对一个简单的小塔防游戏进行分析, 来说明一下一个简单游戏的内部组成和功能实现

TF游戏

ps: TF只是一个游戏名字

游戏地址

游戏地址: https://github.com/oldj/html5-tower-defense

TF中的主循环做的事情

tf既然也是一个游戏自然就遵循上面所说的基本规则,

tf游戏中的主要过程如下

  1. 响应用户的点击事件
  2. 根据用户的输入和触发的事件,更新游戏对象数据
  3. 然后根据对象进行渲染
  4. 判断游戏输赢(是否达到结束条件)

TF游戏中的各种子系统

tf游戏虽小,但是却也是一个比较完善的游戏, 内部也是有许多的子系统构成

基本对象系统

对象系统是tf的基础, 游戏中的所有会运动的怪物, 炮塔, 甚至包括文字, 按钮 都是对象系统的成员。但是,这些对象又具有一定的层级关系,游戏中的所有对象可以根据继承关系形成一个树状结构,之所以要建立对象系统是为了更好地以面向对象的形式来构建游戏,这种开发方式有助于降低开发难度。

基本的对象系统是承载游戏数据的主要对象,各种游戏参数基本都表现为各种对象的各种属性,对象系统对上层的渲染系统提供渲染参数, 可以通过渲染系统把当前游戏运行状态可视化的显示出来。

事件系统

事件系统是用户和游戏系统进行交互的窗口, 用户的所有操作都作为事件的形式被游戏所捕获。事件系统的功能主要是:收集用户的输入,提供事件来触发对数据的处理,实时的更新对象的数据。

事件系统是控制游戏进程和与用户交互的重要通道,事件系统在游戏中起到触发器的作用, 告诉游戏中的对象,什么时候用户做了什么事情,你们需要做些什么。一般来说事件系统会用一个具有优先级的队列来实现

渲染引擎

tf中的渲染系统主要负责根据对象参数渲染对象的UI效果

画面中看到的小怪物,子弹, 文字, 建筑都是渲染系统来负责

因为tf中没有用到图片,所有怪物和防御设施都是使用canvas绘制出来的, tf中的渲染系统承担的工作要更重一些

渲染系统是游戏的核心功能之一

渲染程序的运行依赖于当前游戏中的各种对象和参数状态

用户的某种动作触发了事件之后,对应的对象的参数和状态会进行重新计算

新的对象需要有渲染引擎来进行绘图和显示

渲染系统是游戏内部状态的展示窗口, 核心功能是讲当前游戏内部状态以友好的方式呈现给用户

物理引擎

物理引擎在游戏中主要充当工具箱的作用, 属于渲染系统中的基础组件

主要的功能像寻路算法, 碰撞检测等都属于物理引擎的范畴

物理引擎可以赋予对象真实世界物体的各种效果

负责计算渲染系统需要的各种描述状态的参数数据

物理引擎是我们衡量一个游戏等级的重要依据

目前还没有游戏能实现完整的模拟现实世界的物理引擎

更加复杂的化学引擎也目前没人能实现

理想的游戏引擎是能按照现实世界的各种粒子特性

原子级的模拟整个现实世界,但是这在未来数百年显然是不可能的

音频/视频系统

其他大型游戏一般还有会有音频和视频系统来增强用户的游戏体验

不过这个游戏并没有包含这一部分

资源系统

大型游戏中的音频,视频,文件,内存,I/0设备等资源都需要进行管理

一般会自己实现一套资源管理机制