作为游戏从业者,你拥有哪些乘风破浪的技能?

说句老实话,现在的我恐怕不能算游戏从业者,甚至不能算计算机行业的从业者,17年上岸后,不求升官发达,大富大贵,偶尔跟着老东家和大学几个大佬的课题组偶尔做点信号处理或嵌入式工控方面的工作.而且自己本身是个二次元萌废,所以顺便点了一下画画的技能树.

所以,日常做出来东西的画风,基本大致是这样的

或者是这样的

或者这样的

在5月份,想做一个网游娱乐娱乐,所以决定花1个月的时间,制作一款网络游戏.这款游戏将完全使用自己研发的图形渲染器及引擎及网络协议,完全使用自己制作的美术资源并使用现有已购买版权或无版权的音乐文件,当然,这款一个月完成的DEMO游戏,最终目的还是为了测试引擎及协议的稳定性.毕竟以后恰饭还得靠这玩意.

为了避免让这个回答变成一个游戏理论的长篇大论,我将尽量的避开那些太过于理论化的东西,更多的目的是,告诉大家一款多人在线RTS游戏是怎么来的,如果你希望像我一样制作一款网络游戏,或者说想粗略了解游戏是怎么样的,那么,这篇回答将会帮助到你.放心,如果你看完本篇回答,可以作为一个游戏开发粗略了解的开胃菜(毕竟就是介绍个样子),当然,这个回答中的游戏制作方法,不是唯一也绝不是最高效率的游戏制作方法,在实际的开发过程中,你显然可以使用现有的例如unity或者unreal之类的游戏引擎,并购买或使用免费美术素材来让提高开发效率并让游戏更加生动.

图像的本质

首先先让我们思考一个最原始的问题,我们玩计算机游戏时,我们到底做了什么,获得了什么?

尽管结论说出来有失逼格让一群喜好装逼的计算机大佬跳出来说不是这样,这玩意非常复杂,不是我们这种专业人士,一堆屁民怎么可能知道其中的深奥,但你想想,不管你是在玩游戏还是在刷逼乎,你用的都是一个键盘或者鼠标(或者摇杆?)作为输入,得到的最终都只是屏幕上的一张画面,也就是说,大部分情况下,不管背后的程序如何高端大气上档次,我们最终都要得到一个反馈的结果,这个结果大部分情况下无非就是屏幕上显示的一个图片.

那么这个图片怎么来的呢,但这里我们并不需要讨论的那么深,有一个比较简单的理解方式是,当你使用Photoshop打开一张图片,使用放大功能不断放大一张图像直到不能再放大为止,你会发现图像的构成是一系列小的色块组成的

其中的每个小色块我们用”像素”这个单位来表示,而每个像素依据图像的编码与量化需求,我们需要一串数值来表示它的颜色,在游戏中我们常常使用ARGB的格式来描述一个像素,这四个大写的字母分别表示Alpha Red Green Blue,代表着Alpha值(常常作为透明度),红绿蓝三原色,在目前的情况下,而每一个值被分别量化到0-255间的一个值,比如下面三张图分别是纯红,纯绿,纯蓝和他们对于的RGB值.

通过对红绿蓝三原色三分量的不同组合,还合成最终我们需要的颜色色块,在屏幕中有一个叫分辨率的东西.比如800*600的分辨率,当中要表达的意思是,你屏幕是由一个宽度是800个小方块,高度是600个小方块组成的”图片”.至于这个图片长什么样,就要看这些小方块里填什么了.

当然,早期的电子枪显示屏并不是使用这种”色块”图像法,但现在这种屏幕在民用方面已经非常的少见了,因此可以这么说,不论你玩的是3A大作巫师3还是flappy bird,最终游戏开发人员都是在和你玩一个”填方块”的游戏

动画的本质

之所以花上一个章节来说明图像的构成这个即便不是计算机从业人员都搞得明白的知识点并非笔者想要给文章凑点字数,只是笔者想要传达一个很重要的概念:

我们的现实世界是连续的,而游戏中展示的图像是离散的(一个一个方块构成的嘛),甚至更进一步,整个游戏世界都是以离散的方式运行的,而这点对计算机的图像处理尤为重要,在游戏设计中,有一半的问题都是围绕图像处理问题展开的.

显然,通过上一章的理论基础,我们可以通过这个”填方块”的游戏构成一个图形,

现在.我们先来聊聊一些最基本也是最常见的运动规律,比如说平移运动,我们知道图片是由像素构成的,你可以将你的屏幕想象成一张巨大的表格,而图像仅仅是在这个表格的一些格子里填上对应的色块,而动画无非就是将这些色块快速的变换而已,为此,我们可以给屏幕的每个像素格式都给他一个xy坐标标个号,它的原点一般在屏幕的左上角,x轴往右,y轴往下,假设你的屏幕分辨率是1680×1080,那么他的坐标系就应该是下面这样

假设上面有一个图片,如果要做到这个从左边移动到右边的效果,本质上是将原来图片所在区域的那些像素全部抹成背景色,然后在右边重新画上这个图像

这是一个可以依靠数学描述的过程,我们知道,图像是由一系列的像素点构成的,在数学描述中,我们可以将它当做一个序列或矩阵,设某一图像的序列为 f(x,y) ,那么,对该图像的平移就是 f(x+x_{0},y+y_{0}) ,其中 x_{0},y_{0} 表示平移的向量,或者又更简单的一句话来说,图像的平移,无非就是图像上每个像素的坐标都加上x方向和y方向的一个值就是了,当这个平移的距离不大且每秒钟平移个几十次,就会产生运动的效果

那么,动画的概念就很好理解了,首先我们如果要做一个狐狸跑的动画,以一个最简单的方式,我们可以画6张狐狸跑步的图片

然后将它们连起来播放,最后改变它们在屏幕上的XY坐标,就是一个动画了

当然,游戏中动画的实现方式多种多样,这里的举例只是一个最简单粗暴但仍然实用且常用的方式,毕竟我们看来看去,很多游戏的构成无非就是一系列的动画跑来跑去(暂不讨论其它特效范畴的话),而且如果我们的目的是做一个小游戏,目前来说,这个功能足够用了.

就这样,足够可以开始写个游戏了

好了,现在可以开始做一个游戏了.你会开始问:就这?还真就这

  1. 学会在屏幕上通过”填方块”游戏来绘制一张图片.
  2. 然后以每秒60次的速度,将屏幕上的图片擦掉,重新画上去,
  3. 可以了,剩下就是发挥想象如何摆这些图片了.

下面是笔者最初搭建的一个游戏执行的框架,最开始它只是一个会跟着鼠标移动的灰机(这不难理解,我们可以计算出鼠标现在指向屏幕上的哪个小方块,让图片往这个方块进行移动就好了)

你可以仔细看,飞船是一个图片,尾焰其实是很多的图片叠在一起的效果(装逼的叫法是粒子系统),左上角其实是画了2个圆和画了两个框,即使看上去已经是像模像样了,但本质上并没有什么非常复杂的东西.我们继续往上面加东西,让游戏的内容更加丰富,

虽然看上去更加高端了,但实际上仍然是万变不离其中,它仍然只是不断在屏幕上贴图片,通过平移旋转或改变透明度的方式组合成动画,让他变成了”游戏”.而我们要做的,只是需要判断下什么时候该放什么图片而已.

将单人游戏变为多人

现在的一个问题是,如何将上面这个单机游戏变为多人一起玩.实际上这是一个稍微有技术含量但并不复杂的问题.

如果你和我一样是一个看回答就暴露年龄的人,可能多多少少都有玩过二十年前的”小霸王”游戏机,当然当中有很多的游戏是可以双人对战的,其多人对战的思路并不难理解,在同一套设备上,将不同玩家的输入操作反馈到游戏中就行了

当然依据上面这点,我们可以获得一个启发,因为网络游戏中游戏并不只存在于一台设备上,但我们可以同步所有玩家的操作,这样,不管那台电脑上的游戏,看上去都会大致一样,实际上目前很多的游戏也就是使用这种操作帧同步的方式,为什么说大致一样呢,因为同步了操作帧并不意味着动画播放起来是一样的(但没关系,这并不影响游戏结果),可以这么说,后台玩家的位置,血量,拥有的武器等数据,是”真正”的游戏世界,而基于这些数据绘制出来的”图片”动画,只是我们看上去的游戏世界的样子,看上去的样子基本差不多就行了,但后台的数据必须保持一致,否者就可能出现在这台电脑上玩家已经挂掉了但另一台电脑上这个玩家还活着的情况.

上面这种情况可以用一个简单的示意图来描述

  1. 首先,玩家P1进行了一个操作,比如按下了鼠标左键
  2. 那么P1会将他按下了鼠标左键的信息告诉服务器
  3. 服务器收到P1的消息后,会将玩家P1按下了鼠标左键的消息同步给P1,P2,P3,P4,P5,这样,所有玩家电脑上都会出现玩家P1按下了鼠标左键的操作,实现游戏的同步.

当然,上面的只是同步的最基础理论,实际上还会有碰到很多不同的问题,例如网络环境不稳定,玩家P1的操作服务器没收到怎么办,如果P2比P3收到同步消息的时间更迟怎么办,玩家P4的网络实在糟糕,有时收的到同步帧,有时收不到怎么办,当然,这些都是需要考虑的问题,但细说就显得不那么科普向了,如果有兴趣,可以自行百度网络游戏同步相关的知识.

制作游戏大厅

现在,我们基本完成了游戏的内容建设,是时候完成一个游戏大厅供玩家进行排位游玩了,基于这一点,我们首先要制作一个数据库用于存储玩家的账户,密码,头像,昵称或者当前有多少金币等信息,但如果玩家的规模并不大,完全可以不使用mysql,mssql之类的数据库程序,比如,笔者开发的游戏数据库直接使用了文件系统,一个玩家占一个文件夹,然后在文件夹中存储其玩家的信息.

游戏大厅的逻辑实现并不复杂,但实现起来常常是分开的,比如登录服务器和注册服务器和游戏大厅服务器可能是分开运行的三个程序,注册服务器顾名思义,就是用于给玩家注册并将玩家信息写入数据库的,登录服务器负责读取玩家的登录账户密码等信息,如果验证通过了,将它告诉给大厅服务器,玩家xxx登录了,而游戏大厅则不断告诉所有连接上的玩家一些信息.比如现在整个游戏大厅有多少人,有多少人在某个游戏房间内,同时,如果房间满人了,要负责启动游戏服务器并告诉所有房间内的玩家现在可以开始游戏了.

其中登录服务器和注册服务器的一个主要的问题是,如何保证用户输入的数据安全不被窃取,这就需要讨论一下密码学相关的东西了,一个比较流行的实现是使用一个密钥对玩家的信息进行加密再进行传输,当然这个密钥本身也需要预先加密(或者说协商)以彻底阻止中间人攻击的可能性(例如笔者使用Curve25519协商密钥对,并使用密钥对加密网络数据流形成安全链接)同时,玩家的密码可以使用SHA256或MD5+salt等方式存储,避免万一数据库泄露导致翻车,最后,完成这个游戏登录器

发布游戏

有很多种渠道可以发布这个游戏,例如steam,但这毕竟只是一款DEMO游戏,在玩家并不多的情况下,笔者还是比较喜欢和群友们一起爽爽,所以这款游戏并没有专门宣发而是群里问问有没有老铁有兴趣一起耍耍

自制网游星际逮虾户4人对战视频PainterEngine Game 2人试玩视频

当然这款游戏已经开源了,你可以在下面下载到这款游戏(因为玩的人不多,所以如果你想玩最好叫上你朋友来两局),游戏的注册码是A1B2C3

游戏本体下载(2020061901):

链接:

https://pan.baidu.com/s/1t4F3V1UFkS48AfB8RRfnKA

提取码:1dxr

开源地址:

matrixcascade/PainterEngine-Game

笔者还提供这款游戏的网站服务端:

https://pan.baidu.com/s/1h5aBmCfizWNj7FTSv4cJ7A

提取码:ue5w

服务端部署教程

部署星际逮虾户服务端和客户端

服务端的StoryScript Console Command(就是GM指令)

添加注册码:addregistrationcode(“注册码”,”admin”,注册码有效次数,注册码权限级别);

为账号添加金币: addcoin(“游戏账号”,金币数量);

为账号添加入场券: addticket(“游戏账号”,入场券数量);

来源:知乎 www.zhihu.com

作者:DBinary

【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。
点击下载

此问题还有 31 个回答,查看全部。
延伸阅读:
为什么中国有那么多有想法,技术牛批的游戏人,却不能在一起创造一个他们心中真正的世界?

作为游戏开发者、游戏运营和平台运营,分别应该关心游戏的什么数据?