游戏是怎么被“敲”出来的?

游戏是怎么被“敲”出来的?

首页动作格斗代号Fgame官网更新时间:2024-04-13

作者:桔了个仔(知乎),桔爷为HOA 成员,已授权该文章转发权限。原文链接如下:https://www.zhihu.com/question/437583022/answer/1681045409

文章内容不涉及代码,尽量用最简单的语言来讲程序员敲的一行行代码怎么变成游戏的。

做一个游戏,就像建一个房子。

本来想要什么「面向对象」之类的语言来描述的,但想到读者可能不懂编程,那么找个比喻吧。建房子应该很多人知道吧,就算没动手建过也看别人建过,毕竟走出去,哪里不是在施工?

假设你现在建房子,有6个步骤:

1. 选址

你要找个风水好的地方,坐北朝南,这样你的房子才更舒适。

换成游戏,就是你要选个玩家喜欢玩的,做好市场调研。当然,这一步还没涉及代码。

2.设计方案

你要建房子,那么你得确定:你是用什么结构,做复式还是多层,用什么砖块,请多少人。

换成游戏,就是你要做什么功能和玩法,用什么游戏引擎,什么语言,等等。

3. 施工队打地基

建房子当然免不了打地基,这样房子才能稳固。

而对于游戏而言,就是底层代码。

什么是代码?代码就是告诉计算机如何做的指令。高层代码和底层代码有啥不同?高层代码更直观,且高层代码的实现依赖底层代码。

这里再举一个例子。例如某个公司需要完成一个任务,老板吩咐销售部总监,这个月完成500万的销售额,这就是「高层代码」;而销售部总监把销售额分给小黄150万、小李200万、小赵200万,这就是「中间层代码」,而小黄计算手上有几个在谈的客户,每个客户预计成交额多少,还需要发展多少个新客户才能目标,这就是「底层代码」。甚至还可以计算今天工作8小时,能拜访到几个客户,怎么走能拜访最多客户(更底层算法,我们可以称之为路径优化算法)。

换成游戏,就是这样的:你需要确定物理效果(例如计算抛物线路径),渲染(通过计算,例如计算光的入射角出射角,确定在xx位置画xx)这种最底层的东西,确定怎么收发消息(如何加密,什么传送格式)等等。当然,多数游戏引擎都已经帮你做好这些了,例如Unity,你可以直接拖拽已经写好的物理组件到某个物体上,当你给这个物体一个初速度,他就按照物理规律运动,没啥难的,就是把中学时各种 等应用上去就是了。

这里尝试用伪代码来讲解下高层和底层代码:

高层代码:这里写了一个「高层代码」,我相信你没编程经验也能懂吧,这里实现了跳到下一关的功能,就是移除当前场景,然后加载新场景。

Function JumpToNextLevel():

remove(scene)

load(newscene)

底层代码:加载新场景这个功能怎么实现了,这就需要再往下一层了。

Function load(resource):

try:

f = file.open(resource)

while f.notEnd():

encoder.encode(f.readNextline())

catch FileNotFoundError:

f = file.open(backup_resource)

可以看到,加载场景的「底层代码」就可读性变差了,这段代码想表达的是,加载场景需要逐行加载配置文件,直到最后一行,每一行再通过转码器,转成场景的效果。如果找不到资源,就读备用资源。

懂编程的不用纠结这是什么语言,我为了好懂,揉和了几个编程语言的关键词。

4. 钢筋水泥框架

有了地基,我们就可以在这基础上开始盖房子了。我们会建起柱和梁,这时候还没外墙和烂尾楼差不多。

同理,在开发游戏时,我们需要建立一个开发框架。游戏引擎不是开发框架,开发框架包括代码规范,思想架构(例如Model View Controller)。

为什么要统一开发框架?你想想,建房子时,一个柱子长,一个柱子短,是不是会出现隐患?

统一标准,是为了让任务能让任意一个人快速上手。开发游戏多数情况下,都是多人合作的。

再具体点,就是根据业务,定义基类,接口等等。什么是基类,接口?基类就大概是预先备好的菜,你只需要直接用,就能实现新的菜式,例如你买了已经切好快的鸡肉,你可以用鸡肉做姜葱鸡,也可以做豉油鸡。

而接口,就是定义了一些步骤,但步骤的实现需要自定义。大概就是给了你个菜谱,告诉你步骤,例如做姜葱鸡,你需要买鸡,姜葱,但你买清远鸡还是海南鸡,山东大葱还是东北大葱, 你自己决定。

5. 砌墙

就好像建房子时砌墙的任务比较枯燥但有章可循,写游戏代码时也一样。根据上一个步骤定义好的框架,往里面填充内容。

例如在上一个步骤里,我们定义了一些基类,接口,那么我们得用起来。又如游戏里的角色,我们可以根据其共性,可以在基类里定义一些功能,如walk, run等等。

然后我们创建新角色时,就不需要再每次都写walk,run功能,而且还能添加新功能。例如创建一个英雄角色,这个英雄不仅能走能跑,还能飞,而我仅仅需要给英雄写一个飞的功能,走和跑的功能直接用基类定义好的。

6.贴瓷砖

这个就很直观了,就是给游戏换上好看的UI。

我们做游戏时,技术组和美术组是平行工作的,我们不可能等到美术把UI画好了才开始开发,但有时候我们需要UI才能测试功能。因此我们一般会自己随便绘制一个线框图一样的UI,等美术画了个好看的,再换上去。

例如,我们开发时可能用这种的UI:

等美术资源画好了,我们就用这种UI:

这个过程和贴瓷砖很像吧。

结合建房子流程,总结一下游戏开发流程。

写代码和建房子的不同点:

毕竟要找个完全符合游戏开发的比喻不容易,所以用了房子的比喻。但这里必须指出,写代码和建房子还是有不同之处的。

建房子时,步骤1-6必须按顺序。你发现地基有问题,糟糕,得推到重来。

在写游戏代码时,步骤1-6总体来说是按顺序,但并不是严格按顺序的。

例如我在第5步砌墙(也就是开发具体功能时),发现某个角色动作不自然,然后查到是物理引擎计算问题,还可以返回第3步修改,并不需要推到重来。游戏是软资产,可以「迭代」。

写代码的难度在哪里呢?

复杂度。前面的伪代码才几行,就略显复杂了,而我们做一个MOBA游戏,大概写了几十万行吧代码。这个复杂度没有很好的工程实践,会失控的。

层级依赖性。有时候你写的代码不行,并不是你的逻辑不对,而是你用的「基类」出问题。就好像你煮了姜葱鸡吃了拉肚子,并不一定是你煮得不好,可能是鸡本身变质了。

需求变更。这是我认为最大的挑战。需求变更可能会导致之前设计的功能,框架不好用,所以在设计框架代码之初,需要考虑到未来可能的需求变更。这就是为啥有经验的游戏主程如此高薪,因为他们见过太多变更,能设计出兼容性强的逻辑。

@版权所有,转载请后台留言申请

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved