mirror of
https://github.com/cheetahlou/CategoryResourceRepost.git
synced 2025-10-21 01:13:45 +08:00
mod
This commit is contained in:
90
极客时间专栏/从0开始学游戏开发/第一章:游戏开发基础知识/第1讲 | 游戏开发需要了解哪些背景知识?.md
Normal file
90
极客时间专栏/从0开始学游戏开发/第一章:游戏开发基础知识/第1讲 | 游戏开发需要了解哪些背景知识?.md
Normal file
@@ -0,0 +1,90 @@
|
||||
<audio id="audio" title="第1讲 | 游戏开发需要了解哪些背景知识?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/b5/a0/b5f7fccfba8a1824a985a313b3f935a0.mp3"></audio>
|
||||
|
||||
这一节开始,我将带你进入游戏开发的世界。
|
||||
|
||||
从最初的小霸王,到充满混混和烟味的街机厅,到PS、Xbox、DC、N64等次世代游戏主机,再到电脑游戏,再到如今,在手机上就能玩到各种各样的游戏。
|
||||
|
||||
我会依次为你揭密,这些令人痴迷、沉浸的游戏,究竟是怎么发展的,常见的游戏种类有哪些,这些游戏在开发流程和细节上有什么不同,以及游戏开发究竟要从哪里开始学起。
|
||||
|
||||
## 浅述游戏的发展
|
||||
|
||||
我们现在公认的第一款电子游戏(也就是主机游戏),是1952年面世的。游戏玩的是井字棋,6年后才出现了简陋的[网球游戏](https://www.bilibili.com/video/av1326850/)。
|
||||
|
||||
下面这幅图就是井字棋游戏,尽管它与1952年的游戏画面还是有所出入,但是游戏内容是一样的。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/e6/74/e67d2a821df9f4c625ba2f78ee294974.jpg" alt="">
|
||||
|
||||
此后,我们就进入了“雅达利”时期。随后的《太空侵略者》,是最经典的一款游戏。在这之后,我们耳熟能详的任天堂红白机,发布了《吃豆人》《大金刚》等游戏。再之后,就进入了各种游戏主机竞相绽放的阶段。
|
||||
|
||||
在电脑游戏方面,第一款电脑游戏是1962年面世的《太空战争》。这是一个学生编写的。到1980年之后,随着电脑技术的日趋成熟,电脑游戏的画面才开始有了逐渐赶超电子游戏的态势。到2005年之后,随着电脑图形硬件的发展,电脑游戏的发展进入了加速期。
|
||||
|
||||
电子游戏的优势是,它集合了当时高精尖的图形显卡技术,纯粹为游戏所设计。比如索尼的PS系列。据闻,PS使用的显卡技术来自军用科技(传闻的真实性有待考证,但每一代PS的图形显卡的确都是业内顶尖水平)。而电脑游戏的优势是,它能更换显卡和硬件。当显卡升级换代的时候,理论上,只要主板支持,你就可以更新;而电子游戏主机是固化的硬件,只能靠购买新的版本。
|
||||
|
||||
## 游戏有哪些种类?
|
||||
|
||||
当前全世界的游戏琳琅满目,从硬件来讲,大致可以分为四大类。
|
||||
|
||||
第一类是我们前面提到的**主机游戏**,业界称为**Console Game**。比如微软的Xbox系列、索尼的PS系列、任天堂的Switch、N64、Wii等。这类游戏的硬件可以插在电视机或者显示屏上。以前,游戏的载体一般是光盘、卡带,现在也可以直接从网上下载。
|
||||
|
||||
这些公司还相应推出了掌上游戏机,比如任天堂的3DS、NDS、GBA,索尼的PSP、PSV等。掌上游戏机的推出,让玩家随时随地可以玩上游戏。由于是专业的游戏机,比之手机上的游戏,有更好的操作感,同时也更能体验到游戏的乐趣。
|
||||
|
||||
第二类是**电脑游戏**。电脑游戏品类繁多,有PC客户端游戏,比如《梦幻西游》《魔兽世界》《星际争霸》《GTA》等;还有HTML5网页游戏、Flash游戏等等。
|
||||
|
||||
另外一类是**移动游戏**。包括Pad游戏、手机游戏。手机游戏目前品类繁多,包括App游戏、HTML5游戏,以及微信发布的小游戏。
|
||||
|
||||
最后一类是目前并不是特别发达的**电视机游戏**。随着安卓系统的兴起,电视盒子的出现,出现了一种不需要游戏主机却能在电视屏幕上直接玩的游戏,这就是电视机游戏。但这类游戏一般需要用电视遥控器玩,而且由于电视盒子的机能限制,画面甚至可能比不上手机游戏,所以只适合闲暇的时候偶尔玩一下。
|
||||
|
||||
## 游戏开发使用什么编程语言?
|
||||
|
||||
在最早期的游戏开发中,比如任天堂的《FamiCom》(我们俗称《红白机FC》)、《Super FamiCom》(我们俗称《超任SFC》),都是使用**汇编语言**进行开发的。早期由于8位机能限制,程序员们为了优化游戏速度、提升游戏画面,无所不用其极,甚至到了奇技淫巧的地步。到了后期的游戏(比如《无赖战士》《足球小将》等),已经将机能挖掘到了极限。到了16位机后(任天堂《SFC》、世嘉的《MD》),才逐步使用**C语言**进行编程。到了32位机之后,基本都是使用**C/C++语言**进行编程。
|
||||
|
||||
## 游戏开发从哪里开始学起?
|
||||
|
||||
手游这么火,我为什么不直接讲手游呢?原因很简单,想要开发手机游戏,对技术人员要求很高。手游有两种,一种是传统意义上的原生开发手游,一种是微信小游戏和网页小游戏。后面这个就不用说了,我主要说原生手游。
|
||||
|
||||
我在后面会讲到,游戏引擎可以购买也可以自己开发。原生手游的话,用购买的成熟引擎做的话,调试起来就会比较困难。毕竟要在手机跑,出问题再改,再跑,加上手机内存和硬件限制,不如电脑端可以随时调试。其次,手游的开发需要考量更多资源的分配和占比,发布的包就是一个考验,谁也不会下载一个三四百兆的安装包。
|
||||
|
||||
我会以电脑游戏为主,进行开发流程的讲解。首先,**电脑游戏开发便捷**。事实上,只要开发游戏,就一定离不开电脑,不管是主机游戏,还是掌上游戏、移动游戏,开发一定是在电脑上(或者专用开发电脑);其次,**搞明白了电脑游戏的开发流程和知识之后,其他游戏的开发也一通百通**。
|
||||
|
||||
我会针对2D游戏(特指客户端游戏)进行剖析和讲解。为何专门选择2D游戏进行讲解呢?
|
||||
|
||||
主要有两方面的原因:
|
||||
|
||||
<li>**2D游戏涉及最基本的图形、图像知识。**从画面方面考虑,开发2D游戏只需要你知道X和Y的位置即可,其他深层次的知识,引擎都可以替你完成。想要制作3D画面,你需要掌握更多的知识,特别是几何知识,这是毋庸置疑的。对于初学者来说,我们首先需要掌握核心的开发流程,至于过于细节的知识,可以在有了一定基础之后再进行拓展学习。
|
||||
</li>
|
||||
<li>**2D游戏涉及最核心的网络呈现过程。**网络数据在客户端和服务器端之间传输,经过服务器端计算的数据返回给客户端,客户端进行呈现。比如,从“一颗炸弹消灭几个敌人”,就能知道网络是否有延迟,服务器计算是否正确等等。
|
||||
</li>
|
||||
|
||||
## 2D游戏的类型
|
||||
|
||||
**1. 横版游戏**
|
||||
|
||||
经典游戏《超级玛丽》就是一款横版过关游戏。横版游戏,是2D游戏可以实现的最基本的内容。横版游戏最主要的特点是它的画面,这种2D平面的画面只有左右两侧画面可以控制,玩家体验通常比较顺畅。还有前几年大火的《水管鸟》、耳熟能详的《魂斗罗》,以及Steam上的《返校》等等,都是横版2D游戏。
|
||||
|
||||
**2.俯视视角游戏**
|
||||
|
||||
其次就是俯视视角的游戏。比如FC上的《勇者斗恶龙》《大航海时代》等等。这类的游戏提供一个空中俯视的视角给玩家,能很清晰地看到游戏中呈现的所有地图和区域。在区域中,主角可以给玩家呈现四个、六个或者八个方向的旋转和移动。在横版游戏中,玩家只能左右或者上下进行移动,而俯视角的游戏则可以移动四个、六个或八个方向。比如,在《GTA2》中,可以朝各个方向移动,并且通过缩放实现了主角的上下跳跃的视觉呈现。
|
||||
|
||||
**3.斜45度角的视角游戏(“伪3D”游戏)**
|
||||
|
||||
另外,还有斜45度角的视角游戏。我们看到大量的网页游戏、Flash游戏、一些早期所谓的2.5D MMO游戏,都是这种类型的视角。这种视角下的游戏,也被俗称为“伪3D”游戏。我们可以通过八个或者六个方向进行操作。地图和建筑物都是斜45度角的,做得好的游戏可以进行缩放,所以看起来就像是3D的画面。
|
||||
|
||||
事实上,到了2D斜45度角的后期,我们都使用3D建模,然后把它转成2D图形来进行制作。因为在2D角度下,有一个很细节的问题,那就是左右手脚的交换。也就是说,如果角色右手拿着武器,往左边走,当它在往右侧走的时候,为了节省资源和编程的方便,会对人物进行镜像绘制,这就变成了左手拿着武器了。
|
||||
|
||||
所以,到了后期的2D MMO游戏中,我们会通过3D建模,制作大量的非镜像图片来契合左右手的限制。比如主角骑的坐骑中,左右脚被坐骑遮挡,我们可以通过3D建模将各种模型的脚和坐骑制作在一起,以解决左右脚或者装备被遮挡的问题。
|
||||
|
||||
不管是开发2D游戏还是3D游戏,你首先需要理解什么是游戏引擎,这一点我会在第三节的时候着重介绍。以目前的技术手段,开发一款完整的游戏已经不是特别难的事情,只要你有一款强大的引擎,然后将焦点focus在你所要实现的逻辑上,只需要配置一些图片、关卡、音乐,就能很快地实现一款游戏。
|
||||
|
||||
但是,**如果你不明白游戏的总体开发逻辑和实现细节,在开发过程中出现了问题将会变得很棘手**。如果你了解和明白了游戏开发的本质、网络传输的基础知识,那么对于其他游戏的开发,比如移动端,比如HTML5端,比如小游戏的开发,则会变得更容易。因为,**知道了游戏开发的底层知识和开发逻辑之后,几乎所有的游戏都是以这样的结构和逻辑进行开发的**。
|
||||
|
||||
## 小结
|
||||
|
||||
以上是我今天分享的全部内容,你只需要记住一个理念即可:
|
||||
|
||||
不管何种类型、何种平台的游戏,其开发的顺序和手段几乎是一样的。而对于初学游戏开发的人来说,首先需要掌握的是开发流程,在有了一定基础之后,再学习细节的知识,就会如虎添翼。
|
||||
|
||||
最后,给你留一个思考题吧。在游戏开发中,很多游戏公司都会先出一个游戏Demo,请问游戏Demo在游戏的开发流程中扮演一个怎样的角色?
|
||||
|
||||
欢迎留言说出你的看法,我在下一节的挑战中等你!
|
||||
|
||||
|
101
极客时间专栏/从0开始学游戏开发/第一章:游戏开发基础知识/第2讲 | 2D游戏和3D游戏有什么区别?.md
Normal file
101
极客时间专栏/从0开始学游戏开发/第一章:游戏开发基础知识/第2讲 | 2D游戏和3D游戏有什么区别?.md
Normal file
@@ -0,0 +1,101 @@
|
||||
<audio id="audio" title="第2讲 | 2D游戏和3D游戏有什么区别?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/9b/71/9b666242086c03b1fae01271707bd871.mp3"></audio>
|
||||
|
||||
我们知道,游戏的体现形式最主要是2D和3D。最近比较流行的AR/VR等,都是属于3D类的体现形式。关于VR游戏,我会在之后的“热点剖析”模块详细介绍,这里就不多说了。
|
||||
|
||||
最初的游戏,2D是绝对的主流。虽然现如今3D游戏大行其道,但是2D游戏还是拥有一席之地。比如我们上一节提到的《返校》,日本光荣公司前几年仍然在推出2D版的《三国志》,以及最近暴雪又复刻的《星际争霸1》高清版。
|
||||
|
||||
## 2D游戏和3D游戏的区别
|
||||
|
||||
我在前面已经讲过我为何选择2D游戏作为讲解的对象,也阐述过手机游戏开发的难点。至于3D游戏和2D游戏具体的区别,我还需要再和你讲一讲。
|
||||
|
||||
- 呈现画面
|
||||
|
||||
3D和2D游戏最大的区别就是,游戏呈现画面的方式有了质的改变。3D较之2D画面有更强大的冲击力和震撼力,就好像VR较之普通3D,对人们视觉的冲击力和震撼力也是质的飞升。
|
||||
|
||||
所以,**要做出一款好的2D游戏,要比3D游戏下更多的功夫,特别是在游戏的内涵、创意、音乐和细节上面。**因为2D游戏先天只能呈现2D画面,所以玩家在入手游戏后,会很快对游戏有一个总体的评价,因此,开发者会想方设法留住用户。而一些3D游戏创意和游戏内容其实都不是非常优秀,只是由于画面突出,效果卓绝,也能吸引不少玩家战斗到最后一关。
|
||||
|
||||
- 文件体积
|
||||
|
||||
2D游戏的体积基本控制在1G以内。因为2D游戏本身的图片量并不是很大,图片体积也就不会很大。而3D游戏的体积基本都是2~4G,现在甚至会有30G、40G,甚至60、100多个G。那是因为3D模型、骨骼、动作、贴图等资源占用了大量的空间,高清贴图动辄几十甚至上百兆都是正常的体积,所以3D游戏比2D游戏体积大这是很重要的一个方面。
|
||||
|
||||
## “伪3D”游戏
|
||||
|
||||
我们熟知的3D游戏,有广义、狭义之分。狭义的3D游戏是指Polygon游戏,也就是多边形游戏,需要靠纯3D计算技术实现操作。而广义的3D游戏,则包括了“伪3D”游戏。所谓伪3D,其实就是2D+3D,也有人称之为2.5D。其实就是将2D和3D技术结合起来,实现3D游戏的体验。
|
||||
|
||||
类似《暴力摩托》这样的早期3D游戏,其实就是“伪3D”,它基本上是通过**模拟计算**和**光线跟踪**(Raycasting)算法做出来的。因此,**2D游戏引擎无法制作狭义的3D游戏,而3D游戏引擎则可以做2D游戏。**
|
||||
|
||||
比如,《梦幻西游》可以称作“伪3D”,而《暴力摩托》、早期的赛车游戏、《DOOM》等,都可以归类为广义的3D游戏。
|
||||
|
||||
我们继续拿《暴力摩托》,或者更早期的赛车游戏来举例。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/87/da/87483c1fb12cbb8e7691f6d8843959da.jpg" alt="">
|
||||
|
||||
这类游戏的内存中,存在两种甚至多种主角赛车的形态图像,比如近景摩托车、远景摩托车。在判断速度大小之后,我们可以对图像进行替换,以此让玩家感觉到远近;背景和地面则是按照线条来处理,也就是将一副背景图片分成N条线,而第N+1条线会比第N条放大一倍,以此达到给赛道设置不同远近的效果;根据玩家赛车的前后位置,来判断绘制每一行的“放大”。而玩家控制的赛车则是一个活动块。每个活动块都存放有不同远近大小的图像形态,来控制前后图像大小。
|
||||
|
||||
国外有不少专门研究这类“伪3D”技术的网站,我在这里推荐几个,你有兴趣的话可以去看看。
|
||||
[http://www.extentofthejam.com/pseudo/](http://www.extentofthejam.com/pseudo/)
|
||||
[http://lodev.org/cgtutor/raycasting.html](http://lodev.org/cgtutor/raycasting.html)
|
||||
[https://codeincomplete.com/posts/javascript-racer-v1-straight/](https://codeincomplete.com/posts/javascript-racer-v1-straight/)
|
||||
|
||||
那么,用3D游戏引擎制作2D游戏究竟是怎么回事呢?就是将3D游戏的视角和控制锁定在只有2D能呈现的范围内,让玩家误以为是2D游戏,但是这类游戏可以**借助3D引擎来优化游戏的声光和绚丽的特效,让2D游戏更大放异彩。**
|
||||
|
||||
再者,在移动端的表现上,2D游戏其实和3D游戏不相上下。
|
||||
|
||||
首先,利用小屏幕观看3D画面非常累。由于手机计算能力有限,所以目前移动端的3D游戏大部分都还是以低模为主。浅显地讲,高模就是相当精细的模型和贴图,由无数个面(看需求)组成的模型,而低模一般会为了计算效率考虑控制其3D面数,贴图也相对简单。
|
||||
|
||||
其次,在移动设备上,因为移动平台的硬件限制,3D引擎的表现一定不如电脑或者主机游戏来得好。这样一来,2D游戏其实有非常大的施展空间。
|
||||
|
||||
## 2D游戏和3D游戏在电子竞技中的区别
|
||||
|
||||
我们再来看看电子竞技这一块。
|
||||
|
||||
我们都知道《星际争霸》在前几年一直是韩国的“国技”。《星际争霸1》的选手水平占据着全球巅峰位置。2015年之后,由于圈内丑闻加上《星际争霸2》的出现,《星际争霸1》的三大联赛几乎销声匿迹。然而《星际争霸2》却没有想象中那么火爆。虽然有《DOTA》《LOL》的泰山压顶之势,但总体原因除了《星际争霸2》的平衡性外,还有一个原因是,《星际2》的3D画面并不完全适合电视转播。
|
||||
|
||||
我们拿《星际争霸1》的2D画面和《星际争霸2》的3D画面进行比较。这里,第一幅图是《星际1》的画面,第二幅图是《星际2》的画面。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/f6/74/f63c7cb07818dc0d0771139008ae4974.jpg" alt="">
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/04/36/041b56fd0bb54443d32c083c237a7136.jpg" alt="">
|
||||
|
||||
你可以看到,3D画面几乎要在高清画质的情况下才能看清楚单位兵种、战斗场面,而且很多时候都是一团黑漆漆、绿乎乎的3D画面堆在一起。《LOL》看似没有这种情况,是因为大家都熟悉每个英雄的形象,加上地图比较明亮,兵种没有《星际争霸》那么多。
|
||||
|
||||
我们再来看《星际争霸1》的画面,层次分明,清晰可辨,哪怕在低画质的情况下仍然可以一眼看出究竟是什么兵种,有的时候,甚至连地雷都能看清楚。当然,**这并不是说3D比不过2D,而是在某些特殊情况和场景下,3D图形会有一些缺陷。**
|
||||
|
||||
由于表现方式不同,3D游戏最典型的就是比2D游戏的坐标多出一个Z值。**所谓的Z值,就是除了X、Y的长宽之外,还多了一个高度值。**这个值我们也可以用在2D游戏中。
|
||||
|
||||
在PS时代,有不少2D和3D结合在一起的游戏。比如,《生化危机》系列的1、2、3部,都属于2D静态场景、3D模型。再比如,《最终幻想》系列的7、8。玩家在世界地图行动的时候,使用的是3D画面,但是在游戏主场景里面,使用的仍然是《生化危机》那种3D建模。2D渲染场景使用伪3D技术,一般是因为机能限制或者3D技术不成熟,但实际的实现难度不会比纯3D技术更简单。
|
||||
|
||||
## 3D游戏和2D游戏在美术上的区别
|
||||
|
||||
从美术方面来说,3D游戏和2D游戏的区别也相当大。
|
||||
|
||||
在3D建模和骨骼方面,一个熟练的美工,只需要在原有模型上添加或者修改某些物件。比如给某个生物加一个角,给它增加一个小小的动作。这样模型的修改,对于美工来说,是比2D美术要简单的。因为2D美术一般都是手绘,所以如果需求改动特别明显,那一系列跟该角色相关的图案都需要手工调整,这是非常大的工作量。
|
||||
|
||||
准确地讲,2D游戏是2D图像图形进行线性的一些变换将之渲染至屏幕而成。而3D的游戏是将3D的图形图像进行3D线性变换然后投影(Projection)至显示器(显示器是2D的)而成。显示器在视觉上形成远近大小的效果,让我们看起来是立体的。事实上,我们眼睛的视网膜也是这么工作的。
|
||||
|
||||
## 游戏的本质
|
||||
|
||||
说了这么多2D游戏和3D游戏的区别,最后,我想跟你谈一点轻松的内容。游戏的本质究竟是什么?不管是作为开发者,还是策划、运营人员,或者是打游戏的玩家,我想请你思考一下这个问题。
|
||||
|
||||
有人说,游戏的本质是人类的层次需求,并且还进行了细致的分析。其实不需要这么复杂,要我说,游戏的本质就是供人娱乐,给人各种开心的、刺激的、恐怖的感官刺激。
|
||||
|
||||
有些人喜欢复杂策略类的游戏,那么繁琐复杂的《太空帝国》就能满足他们。有些人喜欢快节奏的游戏,那么赛车或者打一局就走的《FPS》可以满足你的胃口;像我就喜欢悠哉悠哉地不受任务限制,那么“GTA系列”和“老滚系列”就是我的选择。
|
||||
|
||||
那如何定义一款成功的游戏呢?如何做出一个爆款游戏呢?我想说的是,一款游戏的成功离不开美术、音乐等等这些硬指标,然而这些指标却不能决定这款游戏是否能深得人心。每一个人心中的判断并不一样,大量的人玩《王者荣耀》,但这并不代表它是优秀的游戏,只能说是成功的游戏。毕竟,青菜萝卜各有所爱。
|
||||
|
||||
## 小结
|
||||
|
||||
这一节内容差不多了,总结一下,你需要记住这几点:
|
||||
|
||||
<li>3D和2D游戏的区别主要体现在呈现画面和文件体积上;
|
||||
</li>
|
||||
<li>借助3D引擎可以提升2D游戏的声光和特效效果;
|
||||
</li>
|
||||
<li>成功的游戏不一定是优秀的游戏。
|
||||
</li>
|
||||
|
||||
最后,给你留个思考题吧。你觉得一款成功的游戏需要具备什么样的特点呢?
|
||||
|
||||
欢迎留言说出你的看法,我在下一节的挑战中等你!
|
||||
|
||||
|
119
极客时间专栏/从0开始学游戏开发/第一章:游戏开发基础知识/第3讲 | 游戏的发动机:游戏引擎.md
Normal file
119
极客时间专栏/从0开始学游戏开发/第一章:游戏开发基础知识/第3讲 | 游戏的发动机:游戏引擎.md
Normal file
@@ -0,0 +1,119 @@
|
||||
<audio id="audio" title="第3讲 | 游戏的发动机:游戏引擎" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/3b/d7/3bac6a1663adf432f553d31e30b48bd7.mp3"></audio>
|
||||
|
||||
估计长期玩游戏的玩家,都能脱口而出几款游戏引擎的名字,比如“虚幻”“寒霜”“狂怒”等等。那你能说说,游戏引擎究竟是什么吗?它在游戏开发中究竟起着什么样的作用呢?
|
||||
|
||||
## 游戏引擎是什么?
|
||||
|
||||
汽车没有发动机就无法跑起来,人类没有心脏就会死亡。而引擎就是发动机,就是心脏。
|
||||
|
||||
我们先来看一下维基百科对于游戏引擎的定义:
|
||||
|
||||
游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件。这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程序而不用由零开始。大部分都支持多种操作系统平台,如Linux、Mac OS X、Windows。大多数游戏引擎包含以下系统:渲染引擎、物理引擎、碰撞检测系统、音效、脚本引擎、电脑动画、人工智能、网络引擎以及场景管理。
|
||||
|
||||
这个概念是不是看起来还是不太好理解?我来具体解释一下,游戏引擎到底是什么,以及它究竟能干什么。
|
||||
|
||||
<li>**游戏引擎就是图形引擎。**准确地说,游戏引擎约等于图形引擎。玩家口中所说的“虚幻”“寒霜”等,这每一款引擎对于图形渲染的处理方式都不同,所以用某个引擎编写出来的游戏,具体的表现画面也会不同。比如,有的引擎编写出的光影效果特别绚丽,有的则粒子效果特别真实。
|
||||
</li>
|
||||
<li>**游戏引擎是一整套游戏解决方案。**其实,游戏引擎并不仅仅等同于图形引擎。图形引擎只是游戏引擎中一个占比极大的组成部分。一款好的游戏引擎,不仅要看它对于图形图像的处理能力,也要看它对于其他部分的处理能力,比如对音频、音效的播放、键盘鼠标的处理,以及UI界面的编辑和各种处理工具的提供。这里的处理工具包括地图编辑器、关卡编辑器、人物编辑器、资源编辑器、物理碰撞、碰撞检测等。所以,从专业的角度讲,游戏引擎是完成开发一套游戏的解决方案,而不仅涉及图形部分。
|
||||
</li>
|
||||
<li>**游戏引擎是一整套编程接口。**要写游戏就必须写程序,所以有游戏引擎就一定需要编程。不管你是直接面对引擎编写代码,还是在引擎提供的编辑器(比如关卡编辑器)基础上编写简单的逻辑代码,写代码都是必不可少的。在引擎提供的编程接口上,你能很容易地调用各种接口完成游戏的开发。
|
||||
</li>
|
||||
|
||||
## 游戏引擎是怎么工作的?
|
||||
|
||||
说完了游戏引擎是什么,我们来看游戏引擎具体是怎么工作的。
|
||||
|
||||
我先从代码层面来说。这里是一段伪代码:
|
||||
|
||||
```
|
||||
int DrawLine(const Surface& s, int sx, int sy, int fx, int fy, int fit, const Color& color);
|
||||
|
||||
```
|
||||
|
||||
这段伪代码提供了一个在屏幕上画一个线条的函数。该函数提供了7个传入参数,分别是:
|
||||
|
||||
- 目标图层
|
||||
- 线(在游戏窗口内)的起始x点
|
||||
- 线(在游戏窗口内)的起始y点
|
||||
- 线(在游戏窗口内)的终止x点
|
||||
- 线(在游戏窗口内)的终止y点
|
||||
- 线条粗细
|
||||
- 线条颜色
|
||||
|
||||
在调用了这个函数之后,你就能很容易在屏幕上画出一个线条。同时,在这个函数背后,引擎做了一系列这样的动作:
|
||||
|
||||
- 判断传入的Surface图层对象是否正确、是否存在;
|
||||
- 判断传入的起始点、终止点是不是存在负数;
|
||||
- 判断颜色是不是正确;
|
||||
- 拆分Color变量为RGB值,填入到SDL绘图接口,调用SDL绘图接口绘制一条线。
|
||||
|
||||
关于绘图接口,我会在下一节的内容中详细讲解。这里,你只需要知道,画线的接口函数在背后分解、组合、计算,然后会将绘制工作交给底层绘图接口就可以了。
|
||||
|
||||
之所以要拿这个画线函数举例,是因为它展示了引擎中函数的使用方式。如果我们用一般的画线函数画圆,那首先要知道圆的直径和计算方式;如果画矩形,那就要知道哪里是起始点和终结点。这一系列动作等于将引擎所做的工作包含在了画线函数里,你只需要关心画线的这一系列参数如何使用就可以了。
|
||||
|
||||
说完了代码层面,我们来说说非代码层面的东西。
|
||||
|
||||
**游戏引擎其实也包括游戏开发的一系列工具,也就是诸如地图编辑器、关卡编辑器、人物编辑器、资源编辑器等。**美术、策划、制作人等,这些开发流程中的责任人,可以往工具内填入需要的东西,制作出需要的内容。
|
||||
|
||||
我们拿人物编辑器来举例。如果我们使用通用编辑工具(比如3DMAX、Maya等)编辑出来内容,需要经过格式的转换才能应用到游戏中,但是这样不仅耗费转换时间,也耗费调试时间。因为通用工具可能并不适合引擎本身所定义的格式,需要不停修正和更改。如果引擎本身就提供了这样的制作工具,那么制作出的内容直接就能在游戏中使用,不需要转换,所见即所得。
|
||||
|
||||
所以,游戏引擎背后的工作方式是:
|
||||
|
||||
- 在代码层面,游戏引擎是对绘图接口、操作系统、音频等接口进行的代码层面的封装;
|
||||
- 在工具层面,游戏引擎是一整套游戏内容的制作工具,方便你制作针对这个引擎的游戏内容。
|
||||
|
||||
## 自己开发引擎还是直接购买?
|
||||
|
||||
了解了游戏引擎的概念和工作方式,那么开发者究竟是自己编写引擎还是购买商业引擎比较好呢?
|
||||
|
||||
从一般意义上讲,如果有实力,当然是自己开发引擎更贴合公司的情况。然而,这样付出的代价就是,花费大量的人力和财力,而且,以一般小公司或者起步阶段的开发者的开发水平,编写出的引擎,很可能只是一个半成品或者问题多多的残次品。**自研引擎并不是一个不可能完成的任务,但是要看公司的财力和程序员的实力。**
|
||||
|
||||
购买商业引擎是现在大部分公司都会走的一条路。购买商业引擎只需要花费一笔钱就能拿到成熟的游戏引擎,直接可以开发游戏,然而付出的代价就是,你可能需要从头开始学习这套引擎的工作原理、工具套装。
|
||||
|
||||
如果你非常熟悉3DMAX等通用工具,那要从头学习开发工具,就会产生许多问题,比如:
|
||||
|
||||
1. 引擎中包含的开发工具基本没有通用性可言。就算吃透了工具,对你今后的能力提升和职业规划也没有明显的帮助;
|
||||
1. 如果引擎升级或者更换引擎,就需要从头再学一次工具,会耗费大量时间和精力。当然会有一些优秀的商业引擎支持通用工具制作的内容导出和转换,直接在引擎中可以使用,当然这种引擎的购买费用也会更高;
|
||||
1. 另外,商业引擎本身也会存在一些隐藏得很深的bug。在游戏发布后,这些bug可能会影响到游戏本身的质量和口碑。引擎出问题,游戏一定出问题,这也是购买商业引擎需要考量的一个风险。
|
||||
|
||||
但是,在实际的开发过程中,考虑到公司的经济实力和程序员的开发能力,一般来说,大多数开发者都会选择购买商业引擎,毕竟这在一定程度上,是个非常省时省力的事情。
|
||||
|
||||
## 游戏引擎是用什么编写的?
|
||||
|
||||
尽管如此,你还是需要掌握更多游戏引擎相关的知识。因为,不管你是购买游戏引擎还是自己开发游戏引擎,了解游戏引擎,会让你对游戏编程的总体脉络有一个了解。一旦在开发过程中出现问题,比如你发现屏幕贴图出问题了,那究竟是自己的代码出现问题,还是引擎本身出现问题呢?熟知游戏引擎的开发逻辑,你就能很快定位问题所在。
|
||||
|
||||
事实上,**游戏引擎并没有一种固定的开发语言,就看你所制作游戏的目标平台是什么。**
|
||||
|
||||
### 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编写的。
|
||||
|
||||
## 小结
|
||||
|
||||
好了,这一节内容差不多了,总结一下,我主要给你分享了四个内容,分别是游戏引擎的定义、游戏引擎的工作方式、游戏引擎的选择和编写。
|
||||
|
||||
你只需要记住以下这些内容即可:
|
||||
|
||||
- 游戏引擎是一整套的游戏开发程序接口和开发组件,可以让你更方便、更专注于游戏的开发;
|
||||
- 游戏引擎控制着游戏的几乎所有内容,游戏的表现质量和游戏引擎直接相关;
|
||||
- 针对不同的平台,游戏引擎所使用的编程语言也不一样。而了解了游戏引擎的编写,在之后的开发过程中,会有非常多的便利。
|
||||
|
||||
最后,给你留一个思考题:
|
||||
|
||||
什么情况下,我们可以跳过游戏引擎,直接编写一款游戏呢?
|
||||
|
||||
欢迎留言说出你的看法,我在下一节的挑战中等你!
|
||||
|
||||
|
161
极客时间专栏/从0开始学游戏开发/第一章:游戏开发基础知识/第4讲 | 底层绘图接口的妙用.md
Normal file
161
极客时间专栏/从0开始学游戏开发/第一章:游戏开发基础知识/第4讲 | 底层绘图接口的妙用.md
Normal file
@@ -0,0 +1,161 @@
|
||||
<audio id="audio" title="第4讲 | 底层绘图接口的妙用" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/f7/29/f7458e66ab21fa37339b15b05f89c229.mp3"></audio>
|
||||
|
||||
上一节,我给你介绍了游戏引擎的概念及其在游戏开发中所起的作用。同时,我也提到了游戏引擎背后的工作方式。在代码层面,游戏引擎是一套对底层绘图、音频、操作系统接口的封装实现。
|
||||
|
||||
在此基础上,我还举了一个在游戏屏幕上画线条的例子。在这个例子中,**画线的接口函数在背后分解、组合、计算,并将绘制工作交给底层绘图接口。**这个绘图接口,就是今天要讲的内容。
|
||||
|
||||
## 几种常见的绘图接口
|
||||
|
||||
前面我已经说过,我会针对2D游戏来讲解游戏开发的流程和细节,所以,这里我先介绍几种2D**绘图接口**(即**API,**全称**Application Programming Interface**)。我选择了5种Windows下最流行的绘图接口,分别讲解。
|
||||
|
||||
### 1.OpenGL
|
||||
|
||||
OpenGL是老牌的图形图像接口。GL是Graphics Library的缩写。所以,顾名思义,OpenGL就是开放图形接口的意思。和接下来要讲的DirectX一样,OpenGL也可以创建和渲染2D、3D图形。但是,和DirectX不同的是,它可以在多种平台下运行,比如Windows、Linux、macOS和部分UNIX,而DirectX只能在Windows生态下运行。
|
||||
|
||||
OpenGL本身只提供图形渲染接口,如果你需要别的功能,比如音频、鼠标、键盘的操作,甚至是创建一个窗体,都需要别的扩展库支持。
|
||||
|
||||
### 2.DirectX
|
||||
|
||||
说起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)的位置。“当前坐标”的存在是为了提高绘画的效率。
|
||||
|
||||
我还拿画线的过程来举例。有一条新的线连着一条老的线画,如果有了“当前坐标”的设置,逻辑上可以避免每次画线都要给出两个点的坐标(开始和结束);如果每次都以该“当前坐标”做为起始点,线条绘制结束后,线的结束位置就成为“当前坐标”。
|
||||
|
||||
事实上,这种方式的存在是有历史原因的。有一种说法来自很早的Logo语言。这种语言针对儿童进行寓教于乐的编程教育。它的绘画逻辑是,如果有“当前坐标”这个概念,只需要一个递归就可以不停地画线,最终组成一个图形。所以后期很多的绘画接口都沿用这种方式去做。但实际到了2000年左右,人们发现这种方式并不方便,因此GDI+取消了这个“当前坐标”。
|
||||
|
||||
一个原因是不方便;另一个原因是,如果无法确定“当前坐标”,绘图就会出现差错。而用GDI+绘制线条,则可以直接在DrawLine函数中指定起始点和结束点的坐标位置。
|
||||
|
||||
## 如何直接使用绘图接口进行游戏开发?
|
||||
|
||||
通过上面的介绍,你是否对Windows下几大流行的绘图接口有了大致的了解呢?接下来你或许会问,那我了解这些图形接口的编程接口后,是不是就可以直接用这些接口进行游戏的开发呢?
|
||||
|
||||
答案当然是可以的。由于SDL的开发便利性和通用性,所以我拿SDL编程接口作为例子,来阐述一下究竟怎样通过图形接口直接进行游戏的开发。
|
||||
|
||||
从最基础的开始,我们先要从SDL的网站下载SDL的最新版本,下载网址是: [http://www.libsdl.org/download-2.0.php](http://www.libsdl.org/download-2.0.php) (写作这篇文章的时候,最新的版本是2.0.8稳定版)。
|
||||
|
||||
<img style="margin: 0 auto" src="https://static001.geekbang.org/resource/image/1e/7c/1e5e2f488c67643776858f564214787c.jpg">
|
||||
|
||||
在下载的网站页面,我们可以看到Source Code一栏,这是SDL的源代码。有一定编程基础的同学可以下载源代码,直接使用VC++、MinGW等编译器进行编译,编译完的头文件和库文件直接就可以使用。
|
||||
|
||||
如果你对编译不熟悉,可以选择下载Development Libraries,也就是编译完成后的开发包。网站已经将Windows下的开发环境分为VC++32位版和64位版、MinGW32位版和64位版。为了教学方面和统一,也照顾各种平台的用户,我建议使用MinGW的32位版。因为64位Windows可以兼容32位的应用。至于MinGW编译器和IDE的下载安装细节,我将会在后续的专栏文章中介绍。
|
||||
|
||||
下载完成后,将压缩包解压缩到任意目录,头文件和库文件使用解压缩出来的“i686-w64-mingw32”这个目录下的“include”和“lib”。
|
||||
|
||||
接下来,我们在IDE中设置include路径和lib路径,链接程序的时候需要在IDE设置包含库文件libsdl.a、libsdlmain.a,就可以开始在IDE中编写代码了。
|
||||
|
||||
在开始开发的时候,首先使用SDL_Init来进行初始化。用这个方法传入一个unsigned int类型的参数,参数列表就像这样:
|
||||
|
||||
<img style="margin: 0 auto" src="https://static001.geekbang.org/resource/image/7b/6d/7b0370e14ed1121d8c37c546888c9e6d.jpg">
|
||||
|
||||
其中“初始化所有系统”这个选项,除了“忽略任意错误”外,包含了以上所有不同的初始化系统,一般使用SDL_INIT_EVERYTHING即可。
|
||||
|
||||
随后,我们要使用SDL_CreateWindows来创建一个窗体。SDL_CreateWindows支持六个参数,分别是:窗体名称、在Windows屏幕显示的x坐标、在Windows屏幕显示的y坐标、宽、长、显示方式。
|
||||
|
||||
然后将使用SDL_CreateRenderer创建一个SDL的渲染器(SDL_Renderer)。渲染器的参数是:
|
||||
|
||||
<img style="margin: 0 auto" src="https://static001.geekbang.org/resource/image/bb/6e/bbc37419239a0c9d32d5676acbc6b96e.jpg">
|
||||
|
||||
随后可以使用SDL_RenderClear来清空SDL渲染器、使用SDL_RenderPresent方法将渲染的结果显示出来。然后我们需要建立一个大循环,在这个循环内,你可以把SDL支持的图形图像函数或者其他逻辑代码往里面填写,完成游戏的程序内容,具体的操作我会在之后的文章详细介绍。
|
||||
|
||||
在这个大循环内,我们要用到SDL_Event事件系统。在循环内捕捉用户事件,比如要退出这个循环就必须点击右上角的X关闭按钮才行。如果你点击了X按钮,就会被while内的event事件捕捉到,并且匹配是不是退出事件,如果是退出事件就退出程序。
|
||||
|
||||
最终退出程序的时候,使用SDL_Quit清除资源退出程序。
|
||||
|
||||
<img style="margin: 0 auto" src="https://static001.geekbang.org/resource/image/fd/b6/fd59a32a4b01a53581cee54a16f2f9b6.jpg">
|
||||
|
||||
我们结合这张流程图来看一下将这些内容串联起来的代码:
|
||||
|
||||
```
|
||||
#include <SDL.h>
|
||||
int main(int argc,char *args[])
|
||||
{
|
||||
SDL_Window* window;
|
||||
SDL_Renderer* render;
|
||||
SDL_Event e;
|
||||
bool q = 0;
|
||||
int sdl=SDL_Init(SDL_INIT_EVERYTHING);
|
||||
|
||||
```
|
||||
|
||||
初始化完成后,我们要建立窗体,并编写后续的步骤:
|
||||
|
||||
```
|
||||
if(0 <= sdl ){
|
||||
// 当SDL初始化完成后创建一个标题为"SDL Window"的窗口,窗口对齐方式为居中对齐,分辨率为640x480的窗口
|
||||
g_pWindow=SDL_CreateWindow("SDL Window",
|
||||
SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,
|
||||
640,480,SDL_WINDOW_SHOWN);
|
||||
if(0 != window)
|
||||
render=SDL_CreateRenderer(window,-1,0);
|
||||
}
|
||||
SDL_SetRenderDrawColor(render,0,255,255,255);
|
||||
SDL_RenderClear(render);
|
||||
SDL_RenderPresent(render);
|
||||
|
||||
```
|
||||
|
||||
接下来是游戏主循环的内容:
|
||||
|
||||
```
|
||||
while( 0 == q )
|
||||
{
|
||||
while( 0 != SDL_PollEvent( &e ) )
|
||||
{
|
||||
//检测到用户需要退出
|
||||
if( e.type == SDL_QUIT )
|
||||
q = true;
|
||||
}
|
||||
}
|
||||
SDL_Quit();
|
||||
return 0;
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
这个简单的例子说明了如何直接利用SDL接口编写游戏。直接利用其他图形接口编写游戏,也基本是这样的步骤。
|
||||
|
||||
## 小结
|
||||
|
||||
我来给今天的内容做一个总结,你只需要记住这些内容即可:
|
||||
|
||||
- 绘图接口绘图接口其实就是使用C/C++语言或汇编语言,通过操作系统的底层,调用诸如显卡、内存这些绘图设备,最后做成接口;
|
||||
- SDL拥有统一封装的绘图接口,你可以在各个平台无缝编译和使用。
|
||||
|
||||
现在,你是不是对游戏开发的一部分流程有点了然于胸了呢?
|
||||
|
||||
给你留个小思考题吧。
|
||||
|
||||
我们提到了直接利用绘图接口编写游戏,请问,如果这样,还需要“游戏引擎”吗?如果需要的话,这个“引擎”应该放在哪里呢?
|
||||
|
||||
欢迎留言说出你的看法,我在下一节的挑战中等你!
|
||||
|
||||
|
100
极客时间专栏/从0开始学游戏开发/第一章:游戏开发基础知识/第5讲 | 构建游戏场景的武器:地图编辑器.md
Normal file
100
极客时间专栏/从0开始学游戏开发/第一章:游戏开发基础知识/第5讲 | 构建游戏场景的武器:地图编辑器.md
Normal file
@@ -0,0 +1,100 @@
|
||||
<audio id="audio" title="第5讲 | 构建游戏场景的武器:地图编辑器" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/ab/ae/ab5338044f87d475294ef16328057bae.mp3"></audio>
|
||||
|
||||
今天,我想和你聊一聊基础知识模块的最后一部分,地图编辑器。为了给之后的内容铺垫,我还会顺带介绍一些游戏Demo的知识。
|
||||
|
||||
我们先来看一幅图。这看起来是一款FPS射击游戏对不对?也对也不对。说对,因为这确实是一款FPS游戏;说不对,这其实只是一幅地图,但是这幅地图来自《魔兽争霸3》。更准确地说,这是使用《魔兽争霸3》的地图编辑器制作出来的一幅游戏地图。
|
||||
|
||||
<img style="margin: 0 auto" src="https://static001.geekbang.org/resource/image/21/28/2180e87327f796c9d69b2b2222399d28.jpeg">
|
||||
|
||||
《魔兽争霸3》发布之初,没人能想到并且能做出这样“变态”且“不走寻常路”的地图。《魔兽争霸3》的地图编辑器之强大,直到它发布五、六年后,才有人开始制作出这样令人匪夷所思的地图。
|
||||
|
||||
**地图编辑器在游戏开发的前期扮演着非常重要的角色,它的主要功能就是用来制作游戏地图。** 因为我们现在是一个人来开发一款游戏,不涉及分工的问题。而常规的团队在进行游戏开发的过程中,用地图编辑器制作地图是由美术来负责的。
|
||||
|
||||
地图编辑器本身一般会由专业的地图编辑器程序员来开发完成。地图编辑器可以使用原生引擎所支持的语言来编写,比如C/C++;也可以使用引擎加嵌入脚本语言的方式来进行编写,比如Lua等。但是现在,一些成熟的游戏引擎都会自带地图编辑器。所以,大多数时候地图编辑器不需要你自己开发。
|
||||
|
||||
## 地图编辑器有哪些种类?
|
||||
|
||||
地图编辑器并非千篇一律。由于游戏类型的不同,地图编辑器也不相同。比如我们做一个《大富翁》类的游戏,我们就需要做一个**斜45度角的地图编辑器**。
|
||||
|
||||
如果是**俯视角度的游戏**,地图编辑器的视角呈现方式也类似斜45度角的游戏。这两种编辑器制作地图的方式极其类似,唯一不同的是,**斜45度角是用菱形的地图块拼接而成,俯视视角是用矩形的地图块拼接而成的。**
|
||||
|
||||
<img style="margin: 0 auto" src="https://static001.geekbang.org/resource/image/e8/d1/e86acc386c52fd571b6e879630489bd1.jpg">
|
||||
|
||||
我们做一个**横版卷轴游戏**,就需要在地图编辑器内摆放横版的地图。如果地图是重复地图,类似《管道鸟》,那就需要程序员重复贴图,而不需要在地图编辑器重复编辑相同的地图。
|
||||
|
||||
<img style="margin: 0 auto" src="https://static001.geekbang.org/resource/image/67/cc/679b41409741dfae9f7e28a18cd0aacc.jpg">
|
||||
|
||||
3D游戏就会有3D地图编辑器,就像前面的《魔兽争霸》编辑器,就是一个3D视角。地图编辑器的种类不同,保存的地图类型和文件结构也不一样。有些地图编辑器保存的是图片和位置,而有一些保存的却是一个脚本文件,方便直接载入游戏程序。
|
||||
|
||||
## 为什么要了解地图编辑器的编写过程?
|
||||
|
||||
我刚才说过,大多数时候地图编辑器不需要你自己开发。但是我们依然要了解地图编辑器是如何编写出来的,至于了解这些究竟有什么用呢?我继续来给你讲。
|
||||
|
||||
1.**编写地图编辑器的过程,能让你更好地了解游戏引擎。** 从编写地图编辑器开始,就是对游戏引擎的一次全面应用。为什么这么说呢,因为在编写地图编辑器的过程中,除了音乐模块或许暂时不会被用到外,利用引擎编写的地图编辑器、地图资源的载入代码、保存代码等等,都会被用在正式的游戏中。
|
||||
|
||||
2.**编写地图编辑器的过程,可以优化游戏开发流程。** 程序员之间会讨论关于资源载入、游戏内容加载和读取这些基础问题,并将最基础的流程完整地梳理一遍。在游戏正式开始开发之前,把这些流程梳理一遍,能极大提升开发过程中的流畅性。
|
||||
|
||||
3.**编写地图编辑器的过程,涉及UI、按钮和键盘事件的使用。**地图编辑器开发完毕后,主要是给美术人员使用,所以UI的点击、鼠标键盘事件是必不可少的。在地图编辑器中运用UI、按钮、键盘事件后,在正式游戏开发中,这些代码可以直接移植到游戏代码中使用。
|
||||
|
||||
4.**编写地图编辑器的过程,能起到团队磨合的作用。** 在编写的过程中,你会接触到策划、美术等很多人的意见,程序员之间也会对引擎的应用有很多的讨论。
|
||||
|
||||
## 地图编辑器与关卡编辑器
|
||||
|
||||
说到地图编辑器,不得不提到关卡编辑器。**关卡编辑器是一种主要给策划使用的编辑器,它涉及地图中的关卡内容。** 一般情况下,关卡编辑器不涉及具体的地图细节,但是它涉及总体的游戏地图和游戏流程。
|
||||
|
||||
简单来说,地图编辑器的功能就相当于房屋的结构朝向图。我们可以从这张图里,看到每个房间的俯视图。里面包括门的位置、阳台的位置,甚至厕所的位置。而装修公司设计家居,就相当于关卡编辑器的功能。设计师会在你已有房间的结构内,摆放各种桌子、椅子、床、柜子、灯泡等具体的家居用品。
|
||||
|
||||
在实际开发过程中,很多时候,只有一些成体系的大游戏才会把关卡编辑器单独分出来。很多时候,对一些小游戏来说,关卡编辑器和地图编辑器经常是在一起的,你可以在地图编辑器里面直接来编写关卡。这张 《坦克大战》的地图编辑器中就包含了关卡编辑器的内容。
|
||||
|
||||
<img style="margin: 0 auto" src="https://static001.geekbang.org/resource/image/07/31/0751315e5a271167ebfc8f7253073831.jpg">
|
||||
|
||||
这里有一个3D游戏的关卡编辑器的界面。我们常见的关卡编辑器的界面一般都是这样的。这个界面最左侧的对话框,是物件的选择界面,具体包括关卡内物件的选择和摆放;界面右侧的对话框是属性选择界面,定义这个物件的属性,比如这个物件是否可以弹跳、爆炸等等;界面右下角是物件X、Y、Z轴的编辑,可以自定义物件的拉伸和缩放。
|
||||
|
||||
<img style="margin: 0 auto" src="https://static001.geekbang.org/resource/image/4f/95/4f55227b8c3e5abd0fc67d3224413895.jpg">
|
||||
|
||||
我们拿FPS枪战游戏来举例。我们可以先在编辑器内画完所有俯视角的**地图通路**,然后在这个地方**放上某种武器**,在那个地方**放上某种升级包**。这就是一个关卡的总体架构。
|
||||
|
||||
随后,你需要在编辑器里编写一些简单的脚本程序。这些脚本程序会涉及玩家在进入游戏后总体的游戏进程和逻辑。比如,你可能会写“分数达到多少之后,等级+1”“击杀敌人达到多少之后,分数+10”“失血达到多少出现什么情况”等等。
|
||||
|
||||
总之,关卡编辑器和地图编辑器的功能,就好比家装设计图和房屋结构朝向图,一个是在地图内设置物件的摆放位置和具体的表现形式;一个是设计地图本身。
|
||||
|
||||
## 为什么要做游戏Demo?
|
||||
|
||||
按照传统的标准游戏开发流程,在编写完地图编辑器之后,就要开发游戏了。事实上,开发游戏的初期,我们必须要制作这款游戏的Demo。很多商业游戏制作之前都是要先做游戏Demo的。你或许会问,为什么不立刻开发一个正式的游戏呢?我总结了一下,有以下几方面的原因:
|
||||
|
||||
1.**游戏Demo可以完成游戏核心框架。** 绝大部分情况下,最终完成的游戏成品,都会和游戏Demo有较大的差异。这些差异体现在美术画面的优化细节、操作的优化细节、网络优化上等等。**游戏Demo所肩负的任务,就是完成该游戏总体的核心内容框架。** 在这个框架内,我们可以一窥游戏的总体逻辑、想呈现给玩家的是什么内容。
|
||||
|
||||
比如,《三国志》题材的游戏,游戏Demo就会呈现在大地图上进行城市内政的管理、军队的管理,以及战斗画面这些游戏的核心内容;比如FPS射击游戏,游戏Demo呈现出的就是,主角在一个有限的空间内进行射击和击杀敌人的操作,因为这些就是游戏的核心。至于游戏是不是好玩,画面是不是炫酷,音乐是不是好听,并不在游戏Demo中呈现。
|
||||
|
||||
2.**游戏Demo可以测试bug。** 在游戏开发中,地图编辑器做完之后,会载入经地图编辑器制作的地图,这些地图在游戏中是否有bug,是否需要调整,游戏体验好不好。这些内容在游戏Demo中将被测试出来,并且在正式开发中进行调整。
|
||||
|
||||
3.**游戏Demo可以磨合开发团队。** 前面我们提到,有一些引擎自带地图编辑器,所以大多数情况下,地图编辑器不需要你自己编写。这个时候,你敲下的第一行代码就是游戏Demo的代码,所以游戏Demo就肩负另一个使命,就是团队人员的磨合。和地图编辑器一样,第一次编写游戏Demo,会有来自策划、美术、程序等各方面的意见和讨论,而制作游戏Demo的过程对磨合团队是非常有利的。
|
||||
|
||||
4.**游戏Demo最终会被舍弃。** 在开发过程中,Demo版本是不稳定的,是有bug的。只要不是特别严重的,一般不会去进行特别的修正。但是一般来说,bug会在正式版本中被修正。所以,游戏Demo肩负的另一个任务,就是“试水”。程序代码在游戏中跑起来是不是有瓶颈,bug出现在哪里,哪些部分可以从Demo中提取出来,在正式开发中使用,哪些部分可以在正式版本中优化,这些都是游戏Demo所背负的“使命”。
|
||||
|
||||
很多开发团队为了节省时间,很多公司老板为了节省成本,在地图编辑器完成之后,就跳过了游戏Demo开发这个步骤,或者有些开发leader根本就不知道要做Demo这个流程,所以一开始就去做正式版。这是个很危险的动作。
|
||||
|
||||
因为按照流程,**如果一上来就开始编写正式版本的游戏,很有可能会出现无法预估的bug和无法修正的问题。** 比如,地图编辑器中保存的地图,在正式游戏中就出现极大的错误,连修正的时间都没有,最终修修补补急急忙忙地上线,玩家一片怨声载道。游戏死亡。
|
||||
|
||||
当然,由于游戏类型不同,地图编辑器、关卡编辑器和游戏Demo,并非是必须要做的内容,就像我们要做的“打飞机”这样简单的游戏,甚至贪吃蛇、俄罗斯方块、象棋、围棋等等,这些都不需要任何编辑器,这些单一简单的游戏,开发流程简单,如果出现问题直接重新编写就可以了。
|
||||
|
||||
## 小结
|
||||
|
||||
这一节,我讲了地图编辑器、关卡编辑器和游戏Demo相关的内容,你只需要记住这些重点:
|
||||
|
||||
<li>开发地图编辑器的过程可以帮助开发人员了解引擎、优化开发流程、测试bug、磨合团队;
|
||||
</li>
|
||||
<li>关卡编辑器之于地图编辑器,就好比装修设计图和房屋朝向图之间的关系;
|
||||
</li>
|
||||
<li>游戏Demo的使命是完成游戏核心框架,测试地图编辑器等问题,Demo最终会被舍弃;
|
||||
</li>
|
||||
<li>在游戏开发的正规流程中,我们要经历地图编辑器、关卡编辑器、游戏Demo、正式开发等几个流程,每一个流程都肩负不一样的任务。但简单如贪吃蛇类的游戏,我们可以直接上手编写代码。
|
||||
</li>
|
||||
|
||||
最后,给你留一道小思考题吧。
|
||||
|
||||
用地图编辑器制作出来的地图有没有取巧的保存方法,让游戏程序读取地图时更方便?
|
||||
|
||||
欢迎留言说出你的看法,我在下一节的挑战中等你!
|
||||
|
||||
|
Reference in New Issue
Block a user