探究游戏历程(一)

王誉睿 2019年01月22日 4次浏览

网上各式各样的“傻瓜式”游戏开发工具,比如 RPG MAKER。任何不懂编程的人,只需要导入规定的模板,就能方便地开发出一款游戏。然而,这种方法只能开发某一类非常简单的游戏。
如果想要开发出一款真正意义上的游戏,还是要借助编程基础和系统的开发知识。
——原网易游戏引擎架构师、资深 游戏底层技术专家 - 蔡能

一款游戏的成功离不开美术、音乐等等这些硬指标,然而这些指标却不能决定这款游戏是否能深得人心。

游戏发展史

1952 年面世,公认的第一款电子游戏(也就是主机游戏), 游戏玩的是井字棋,6 年后才出现了简陋的网球游戏。

“雅达利”时期。随后的《太空侵略者》,是最经典的一款游戏。

之后,我们耳熟能详的任天堂红白机,发布了《吃豆人》《大金刚》等游戏。

再之后,就进入了各种游戏主机竞相绽放的阶段。

电脑游戏方面,第一款电脑游戏是 1962 年面世的《太空战争》。这是一个学生编写的。

1980 年之后,随着电脑技术的日趋成熟,电脑游戏的画面才开始有了逐渐赶超电子游戏的态势。到 2005 年之后,随着电脑图形硬件的发展,电脑游戏的发展进入了加速期。

电子游戏的优势是,它集合了当时高精尖的图形显卡技术,纯粹为游戏所设计。
电脑游戏的优势是,它能更换显卡和硬件。当显卡升级换代的时候,理论上,只要主板支持,你就可以更新;而电子游戏主机是固化的硬件,只能靠购买新的版本。

游戏有哪些种类?

大致可以分为四大类:

  1. 主机游戏,业界称为Console Game。比如微软的 Xbox 系列、索尼的 PS 系列、任天堂的 Switch、N64、Wii 等。这类游戏的硬件可以插在电视机或者显示屏上。以前,游戏的载体一般是光盘、卡带,现在也可以直接从网上下载。还相应推出了掌上游戏机,比如任天堂的 3DS、NDS、GBA,索尼的 PSP、PSV 等。掌上游戏机的推出,让玩家随时随地可以玩上游戏。
  2. 电脑游戏,有 PC 客户端游戏,比如《梦幻西游》《魔兽世界》《星际争霸》《GTA》等;还有 HTML5 网页游戏、Flash 游戏等等。
  3. 移动游戏。包括 Pad 游戏、手机游戏。手机游戏目前品类繁多,包括 App 游戏、HTML5 游戏,以及微信发布的小游戏。
  4. 电视机游戏,随着安卓系统的兴起,电视盒子的出现,出现了一种不需要游戏主机却能在电视屏幕上直接玩的游戏,这就是电视机游戏。但这类游戏一般需要用电视遥控器玩,而且由于电视盒子的机能限制,画面甚至可能比不上手机游戏,所以只适合闲暇的时候偶尔玩一下。

游戏开发使用什么编程语言?

  1. 最早期的游戏开发(此时8位机),比如任天堂的《FamiCom》(我们俗称《红白机 FC》)、《Super FamiCom》(我们俗称《超任 SFC》),汇编语言开发。
  2. 到了 16 位机后(任天堂《SFC》、世嘉的《MD》),逐步使用C 语言进行编程。
  3. 到了 32 位机之后,基本使用C/C++。

2D游戏类型

  1. 横版游戏
  2. 俯视视角游戏
  3. 斜 45 度角的视角游戏(“伪 3D”游戏)

2D 游戏和 3D 游戏的区别

呈现画面

文件体积

在 PS 时代,有不少 2D 和 3D 结合在一起的游戏。比如,《生化危机》系列的 1、2、3 部,都属于 2D 静态场景、3D 模型。

美术上区别:
2D 美术一般都是手绘。
2D 游戏是 2D 图像图形进行线性的一些变换将之渲染至屏幕而成。

3D 的游戏是将 3D 的图形图像进行 3D 线性变换然后投影(Projection)至显示器(显示器是 2D 的)而成。显示器在视觉上形成远近大小的效果,让我们看起来是立体的。

“伪 3D”游戏

比如《暴力摩托》,基本上是通过模拟计算和光线跟踪(Raycasting)算法做出来的。因此,2D 游戏引擎无法制作狭义的 3D 游戏,而 3D 游戏引擎则可以做 2D 游戏。

游戏引擎

维基百科:

游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件。这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程序而不用由零开始。大部分都支持多种操作系统平台,如 Linux、Mac OS X、Windows。大多数游戏引擎包含以下系统:渲染引擎、物理引擎、碰撞检测系统、音效、脚本引擎、电脑动画、人工智能、网络引擎以及场景管理。

  1. 游戏引擎就是图形引擎。准确地说,游戏引擎约等于图形引擎。玩家口中所说的“虚幻”“寒霜”等,这每一款引擎对于图形渲染的处理方式都不同,所以用某个引擎编写出来的游戏,具体的表现画面也会不同。比如,有的引擎编写出的光影效果特别绚丽,有的则粒子效果特别真实。
  2. 游戏引擎是一整套游戏解决方案。其实,游戏引擎并不仅仅等同于图形引擎。图形引擎只是游戏引擎中一个占比极大的组成部分。一款好的游戏引擎,不仅要看它对于图形图像的处理能力,也要看它对于其他部分的处理能力,比如对音频、音效的播放、键盘鼠标的处理,以及 UI 界面的编辑和各种处理工具的提供。这里的处理工具包括地图编辑器、关卡编辑器、人物编辑器、资源编辑器、物理碰撞、碰撞检测等。所以,从专业的角度讲,游戏引擎是完成开发一套游戏的解决方案,而不仅涉及图形部分。
  3. .游戏引擎是一整套编程接口。要写游戏就必须写程序,所以有游戏引擎就一定需要编程。不管你是直接面对引擎编写代码,还是在引擎提供的编辑器(比如关卡编辑器)基础上编写简单的逻辑代码,写代码都是必不可少的。在引擎提供的编程接口上,你能很容易地调用各种接口完成游戏的开发。

游戏引擎背后的工作方式是:

在代码层面,游戏引擎是对绘图接口、操作系统、音频等接口进行的代码层面的封装;
在工具层面,游戏引擎是一整套游戏内容的制作工具,方便你制作针对这个引擎的游戏内容。

游戏引擎是什么编写的?

1.C/C如果你在 Windows 或者 Linux 下开发游戏,游戏引擎 99% 都是使用 C/C 或者汇编语言编写。由于 C/C++ 和汇编运行效率高,所以在 Windows 下的执行效率也非常高。你看到的 Python 游戏引擎、Ruby 游戏引擎等脚本语言引擎,都是在 C/C++ 的基础上进行封装的。这样可以方便程序员将专注力放在游戏逻辑上,而不是在处理底层问题上。

2.JavaScript/TypeScript如果是 HTML5 游戏,游戏引擎的编程接口 99% 是使用 JavaScript 完成的。比如耳熟能详的 Cocos2d 引擎、白鹭引擎等等。至于其他配套的开发工具,可以使用任意软件开发语言进行编写。

3..NET经过微软的努力和版本迭代,在 Windows 下,.NET 的运行效率和开发效率已经提高了好几个等级。由于和 Windows 紧密结合,现在的.NET 的运行效率只比 C/C++ 编写的代码低一点。在电脑配置比较高的情况下,用户基本不会有太多的感知。而.NET 对于 Windows 底层的调用和控制,比 C/C++ 更方便,编程也更容易,所以现在已经出现了一些引擎是使用.NET 编写的。这对于.NET 开发者来说是一件好事。

4.Java和.NET 一样,使用 Java 编写的游戏引擎并不多。虽然 Java 的运行效率已经有了质的提升,但是对于编写大型游戏来说还是有相当大的瓶颈。随着电脑硬件配置的提升,使用 Java 编写游戏也不再是一件不可能的事情。比如大火的《我的世界》,就是使用 Java 编写的。

绘图接口

举了一个在游戏屏幕上画线条的例子。在这个例子中,画线的接口函数在背后分解、组合、计算,并将绘制工作交给底层绘图接口。

几种常见的绘图接口

  1. OpenGL
    OpenGL 是老牌的图形图像接口。GL 是 Graphics Library 的缩写。所以,顾名思义,OpenGL 就是开放图形接口的意思。
    和接下来要讲的 DirectX 一样,OpenGL 也可以创建和渲染 2D、3D 图形。但是,和 DirectX 不同的是,它可以在多种平台下运行,比如 Windows、Linux、macOS 和部分 UNIX,而 DirectX 只能在 Windows 生态下运行。

    OpenGL 本身只提供图形渲染接口,如果你需要别的功能,比如音频、鼠标、键盘的操作,甚至是创建一个窗体,都需要别的扩展库支持。

  2. DirectX
    DirectX 的开发初衷,是为了让游戏开发者能像在 DOS 平台编写游戏一样,在当时新的 Windows 95 平台上,也能一样高效、快速地操纵各种硬件设备。
    其实,在 DirectX 发布之前,微软已经将 OpenGL 包含在 Windows 系统里面。随着时间的推移,OpenGL 逐渐成为了行业标准,而 DirectX 自然免不了与其展开竞争。
    主要介绍一下 DirectX 中的两个核心组件。这两个核心组件的功能与 2D 游戏编程息息相关,你一定得了解一下。第一个是DirectDraw。它是早期 DirectX 中掌管 2D 部分的组件。
    DirectDraw 类似我之后要说的 GDI,支持显存位图,而不是只能将位图存放在内存里,所以 DirectDraw 更贴近硬件。但是在 DirectX 7 版本之后,DirectDraw 被合并到 Direct Graphics 组件中。虽然目前仍有很多人在使用 DirectDraw 的老版本开发包,然而 DirectDraw 已经被微软逐渐淘汰。第二个是Direct2D。它是微软推出的最新 2D 组件,它的出现是为了取代 Windows 下的 GDI、GDI+ 和 DirectDraw。Direct2D 能通过硬件加速来绘制 2D 图形,也支持高质量 2D 图形渲染,比如支持 ClearType 呈现的方式、除锯齿、几何位图的绘制和填充等等。

    3.SDL
    SDL 全称Simple DirectMedia Layer,直译就是简单的直接媒体层。从严格意义上来讲,SDL 并不算是“独立的”图形渲染接口,因为它将各类操作系统的图形图像渲染接口进行了封装,包装成统一的函数,以此来方便调用。比如,在 Windows 下,它封装了 DirectX 和 GDI+;在 Linux 下,它封装了 Xlib 等等。同时,它也提供了 OpenGL 的调用函数。
    SDL 不仅仅可以对现有图形图像接口进行封装,它也提供 SDL 官方自己发布的编程接口。比如,SDL_image、图像接口、SDL_net、网络接口等等。后续我将介绍到的 Pygame,其背后就是调用 SDL 编写的。
    Pygame 是使用 Python 封装的游戏库,你可以很方便地利用 Pygame 进行 2D 游戏的编写,它的背后,调用的就是 SDL 的接口。所以我们将利用 Pygame 来对 2D 游戏开发流程做一个完整的梳理。虽然网上关于 Pygame 的代码和教材很多,但是我们要讲的,不仅仅是 Pygame 代码是如何编写的,而是要从 Pygame 的代码中,分析 2D 游戏的编写逻辑和编程思想。在这个过程中,Pygame 只是一个载体。

    4.GDI
    GDI,全称Graphics Device Interface,也是 Windows 下的图形设备接口。它所做的就是处理 Windows 程序的图形输出,负责在 Windows 系统和绘图程序之间进行信息的交换。使用 GDI 的人已经越来越少,从编程的方便性和硬件加速等功能来看,GDI 被 GDI+ 取代是显而易见的。
    5.GDI+
    在 Windows 下,大部分接触过图形编程的程序员都会用过 GDI+。而 GDI+ 其实就是 GDI 的进阶版本。
    GDI+ 是有硬件加速功能的,而 GDI 没有;GDI 是以 C 语言接口的形式提供的,而 GDI+ 则是 C++ 和托管类的形式提供;从接口代码的层次上说,GDI+ 对程序员更友好,使用起来也更顺手。
    GDI+ 还提供了图像处理的接口,比如提供了 Image、Bitmap 等类,可以用于读取、保存、显示,操作各种类型的图像,比如 BMP、JPG、GIF 等。GDI 和 GDI+ 的绘图操作也存在差别。
    GDI 中存在一个称为“当前坐标”(MoveTo)的位置。“当前坐标”的存在是为了提高绘画的效率。

绘图接口绘图接口其实就是使用 C/C++ 语言或汇编语言,通过操作系统的底层,调用诸如显卡、内存这些绘图设备,最后做成接口;
SDL 拥有统一封装的绘图接口,你可以在各个平台无缝编译和使用。

地图编辑器

地图编辑器可以使用原生引擎所支持的语言来编写,比如 C/C++;也可以使用引擎加嵌入脚本语言的方式来进行编写,比如 Lua 等。但是现在,一些成熟的游戏引擎都会自带地图编辑器。

为什么要了解地图编辑器的编写过程?

1.编写地图编辑器的过程,能让你更好地了解游戏引擎。(从编写地图编辑器开始,就是对游戏引擎的一次全面应用。因为在编写地图编辑器的过程中,除了音乐模块或许暂时不会被用到外,利用引擎编写的地图编辑器、地图资源的载入代码、保存代码等等,都会被用在正式的游戏中。)

2.编写地图编辑器的过程,可以优化游戏开发流程

3.编写地图编辑器的过程,涉及 UI、按钮和键盘事件的使用。

4.编写地图编辑器的过程,能起到团队磨合的作用。