电脑游戏代码编程,游戏程序码
我写代码好几年了,有时候觉得给现在刚创业的自己一点建议可能会有帮助。
所以本刊主要是分享一些对游戏编程入门的思考。
本文由爱发电支持。如果你喜欢我做的事情,你可以考虑在那里支持我。
刚开始的时候,语言的选择更多的是建议从高级语言开始,比如Java,C#,lua,python,javascript。这期间可以用一些游戏引擎学习。如果你因为喜欢游戏而学习编程,你可能不喜欢总是打印一些文字,你可能更喜欢输出图片。
可以直接从相应语言的游戏引擎做几个小Demo来了解游戏结构,游戏引擎的缺点是API太多入门有点困难.
游戏引擎的好处是玩游戏会更快,整个引擎还是略显庞大,不适合学习代码。
然后你可以用pico-8,love2d,pygame,SDL或者直接javascript操作canvas canvas尝试制作游戏,挑战你的编程能力。
C语言(包括C)可以放在后续的学习中,学习C语言可以了解语言底层的东西。指针允许你直接访问内存,这在其他语言中很少见。,你可能感觉不到它的强大,当你面对资源受限的系统(需要手动内存管理),比如在GBA和NDS上编程,你就绕不过C语言,甚至汇编语言。
一定要多做。学编程之前我是个爱读书的年轻人。所以,刚开始学写代码的时候,总是看书不实践。有些东西看似懂了,其实还是要入门才能彻底掌握。
写代码最好带着问题学习。编程其实就是分解复杂的问题。例如,在制作一个小演示时,您可以考虑这些问题
如何显示一个图片/sprite,如何播放一帧动画,如何控制两个对象碰撞,两个对象碰撞时如何破坏其中一个,如何生成一个对象,如何播放一帧动画效果,然后播放后如何破坏,如何播放音乐,音效,背景层滚动效果,如何做,如何处理存档(数据持久化)。后面可以考虑的问题可能是
向导如何显示哪个先渲染,哪个后渲染(渲染级别)?每次播放特效的时候生成一个对象然后销毁是不是有点浪费内存?能否一次生成多个复用(引入对象池)?归档时,如果A在归档完成前写入归档,会有问题吗?(文件系统使用单例介绍)?不要执着于Opengl游戏行业,Opengl在图形方面比较流行,可能感觉很高大上,对于初学者来说(非初学者也是一样)。
刚开始写代码没多久,我就跑去拿了一本opengl红宝书啃了起来。写了一堆代码,什么都没学到。
先不要考虑3D,还是从简单的2d开始比较好。这个时候我推荐看看代码本色和游戏人工智能,锻炼自己的代码能力。
就算你想学图形着色器,我更多的建议是直接用Unity。,学习如何编写一些着色器(Unity着色器和屏幕特效开发的推荐技巧)。你可以写一些比较特效之后,再回去写那些渲染管道Opengl,会让你感觉更好。
不要局限于游戏引擎。现在游戏引擎很方便。写软件的目的是为了更容易使用。
新手一直使用游戏引擎很难提高自己的编程水平。我个人的建议是,可以先从游戏引擎入手,然后尝试不使用引擎,使用上面提到的框架或者工具来制作游戏。
做小轮子有助于改善。很多人说不要反复造轮子,但有时候别人的轮子比别人的重,也比别人的轻。自己编写轻量级的轮子也能提高编程能力,更能享受编程的乐趣。
比如用上面提到的底层框架(比如SDL)做游戏然后写一个简单的地图编辑器,粒子系统,存档文件保存和读取系统或者菜单系统。虽然你做出来的东西比不上专业引擎做出来的东西,但总有一天你会回到引擎上,用不同的解决方案来看待一些问题。
注重数据结构的应用。刚学数据结构的时候,你会很迷茫这个东西在游戏开发中能做什么。当初学数据结构的时候什么都不懂,除了图的消息队列和网络编程。
堆栈应用在处理菜单的时候,比如进入设置菜单的时候,在堆栈上推新菜单,返回的时候再销毁。当游戏场景进入一个房间时,可以暂停当前游戏场景,然后叠加新的房间场景。
队列的应用当需要缓冲输入时(比如格斗类游戏),可以使用队列来控制输入操作。在某些技能体系中,比如一回合,拥有8个物理槽位的玩家组合攻击。队列也可以用来制作回放系统。
树的应用基本上,当你需要面对树枝,每个树枝都有分支的时候,你就需要考虑了。典型的如剧情或对话树,节点下有很多子对象,子对象可以有很多子对象,这也是它的应用场景。
图的应用在可视化过程控制中,有限状态机和导航系统都能找到它的影子。
事实上,有专门的书籍介绍游戏设计模式的开发和应用,我只是在尝试班门弄斧。我只说几个我初学的时候比较有收获的。
单体模式很多人在刚开始接触游戏引擎的时候都会面临一个问题,就是场景切换不破坏数据。不推荐,有些初学者会犯把数据保存在本地,然后在下一个场景读取的错误。这种直接的读写操作是不可取的,当你想保存一个GameObject的时候也是没有办法的(,序列化对象保存到本地还是不可取的)。此时,最好将其保存到全局文件中。
静态对象/变量上,这就引入了单例模式。还有比如一些系统只能有一个入口不允许随便使用不然会出错,比如典型的文件 IO 和控制器输入控制。
数据驱动在 Unity 的 ScriptObject 中明显就是数据驱动,其核心思想就是改动数据而不必改动代码。而当你要使用数据驱动时候一定要分清楚什么可以硬编码什么可以数据驱动,配置太多的话是很影响开发效率和可阅读性。
降低指针跳转消耗我觉得这个也是 ECS 提出的原因之一,在大型游戏中面对的是巨量的游戏物体,这个时候游戏物体中又有各种指针跳转的话造成的性能消耗就不能忽视了。所以在写代码时候要注意降低指针跳转,尽量让内存连续分布,比如使用结构体和数组。内存连续分布也可以减少内存碎片。
原型模式这个一开始好像是在 Cocos2d-x 里面看到过,一个接口来实现克隆当前对象。在实际游戏中其实也挺常见,比如 GBA 的木叶战记中,鸣人使用影分身可以生成一个新的人物攻击力和血量减半。在 Unity 中 Prefab 从 Project 窗口拖动到 Scene 中时候也是使用类似思路(应该吧)。
注意代码整洁
这个更多是经验性的东西,我也难说做得很好。保持代码可读性是为了日后你或者别人回来看代码能看得懂。保持函数的单一职责很有必要,当你发现有些代码重复写了几次就应该思考这是否应该放到一个函数中。你必须明白的是 Bug 总是会有的,总有一天你或者别人会重新看这些代码,如果在写的时候稍加注意,后期的维护和复用就会相对简单轻松。
具体可以看下代码大全、代码整洁之道和这个视频。
,制作游戏很有趣,写游戏代码也很开心,希望你也能享受游戏编程的快乐!
2019/12/23
Codinggamer
推荐书籍游戏设计、原型与开发Data Structures for Game Programmers游戏编程模式代码大全代码整洁之道游戏人工智能编程案例精粹代码本色用编程模拟自然系统Game Coding CompleteGame Programming Algorithms and TechniquesShaders for Game Programmers and ArtistsUnity 着色器和屏幕特效开发秘笈