如何编程游戏(游戏编程入门)
游戏代码已经写了好几年了,有时候我想如果我现在给自己一些建议可能会有帮助。
因此,这篇日志主要是分享一些关于如何开始游戏编程的想法。
这篇文章得到了爱力发电的支持。如果你喜欢我的工作,你可以考虑在那里支持我。
一开始,建议从高级语言开始,如Java、C#、lua、python和javascript。在这期间,你可以学习一些游戏引擎。如果你因为喜欢游戏而学习编程,你可能不喜欢一直打印一些单词,但是你可能更喜欢输出图片。
你可以直接从游戏引擎的相应语言中做一些演示来理解游戏结构,但是游戏引擎的缺点是用太多的API有点难上手.
游戏引擎的优点是可以更快地玩游戏,但是引擎还是有点大,不适合学习代码。
之后,你可以使用pico-8、love2d、pygame、SDL或直接javascript来操作画布画布,尝试制作游戏并挑战你的编程能力。
而C语言(包括C语言)可以放在后续的学习中,学习C语言可以理解语言底层的东西。指针允许你直接访问内存,这在其他语言中是很少见的。一般来说,它可能感觉不到它的力量,但是当你面对资源受限的系统(需要手动内存管理)时,比如在GBA和NDS上编程,你不能避开C语言甚至汇编语言。
在我学习编程之前,我是一个热爱读书的年轻人。因此,当我第一次开始学习写代码时,我经常不练习就看书。有些事情似乎可以理解,但我仍然需要开始彻底掌握它们。
编写代码时最好研究问题。编程实际上是分解复杂的问题。例如,制作小型演示时,您可以考虑以下问题:
如何显示图片/向导
如何播放帧动画
如何控制两个物体之间的碰撞
当两个对象碰撞时,破坏其中一个并生成一个对象来播放帧动画特效,然后在播放后破坏它。
如何播放音乐音效
如何做背景层滚动效果
如何处理归档(数据持久性)
以后可以考虑的问题可能包括:
向导显示如何区分先渲染哪个和后渲染哪个(渲染级别)
生成一个对象,然后在每次播放特效时销毁它,是不是有点浪费内存?您能一次生成多个重用吗(引入了对象池)
归档时,如果甲在结束前写入归档,乙在结束前写入归档,会有问题吗(引入了一个文件系统用例)
图形在游戏行业很受欢迎,它可能感觉很高,但是对于初学者(非初学者也一样),他们应该关注游戏性。
在我开始写代码后不久,我跑去拿一本opengl红皮书来咀嚼。我写了很多代码,但最终什么也没学到。
一开始不要考虑3D。最好从简单的2d开始。这时,我建议看看代码的本来面目和游戏人工智能来锻炼代码能力。
即使你想学习图形着色器,我更多的建议是学习如何直接在Unity上写一些着色器(推荐Unity着色器和屏幕特效的开发技巧),写一些比较特殊的效果,然后回去写那些渲染管道Opengl,这会更感人。
现在游戏引擎非常方便,编写软件的目的是让它更容易使用。
然而,对于初学者来说,一直使用游戏引擎来提高他们的编程水平是很困难的。我个人的建议是,你可以先从游戏引擎开始,然后尝试在不使用引擎和使用上面提到的框架或工具的情况下制作游戏。
许多人说不要反复制造轮子,但有时其他人的轮子与重物相比不够轻。编写自己的轻量级轮子将提高你的编程能力,享受更多的编程乐趣。
例如,使用上面提到的低级框架(如SDL)来制作游戏,然后编写一个简单的地图编辑器、粒子系统、档案文件存储和读取系统或菜单系统。虽然你所做的不能与专业引擎所做的相比,但有一天你会回到引擎上来看看一些问题,并有不同的解决方案。
当数据结构刚刚被学习时,它将会陷入在游戏开发中它能做什么的疑问中。当我第一次学习数据结构时,我对它一无所知,除了在图形和网络编程中使用的消息队列。
堆栈应用:当处理菜单时,例如,当进入设置菜单时,按下新菜单堆栈,并在返回时销毁它。当游戏场景进入房间时,您可以暂停当前游戏场景,然后推送新房间场景。
队列的应用:当一些输入需要缓冲时(比如格斗游戏),队列可以用来控制输入操作。在一些技能系统中,比如一轮,有8个物理位置让玩家组合攻击。队列也可以用来制作回放系统。
树的应用:基本上,当你需要面对分支并且每个分支都有分支时,你需要考虑它。通常,例如故事或对话树,在一个节点下有许多子对象,当一个子对象可以有许多子对象时,这也是它的应用场景。
图形的应用:它的影子可以在可视化过程控制、有限状态机和导航系统中找到。
事实上,有专门的书来阐述这一点,我只是教鱼游泳。我将只谈论一些在我还是初学者时更有价值的事情。
单例模式:当许多人第一次接触游戏引擎时,他们会面临场景切换不会破坏数据的问题。不建议一些初学者犯在本地保存数据,然后在下一个场景中读取的错误。这种直接读写操作是不可取的,当你想保存一个游戏对象时,没有办法(当然,你可以序列化这个对象并在本地保存它,但这仍然是不可取的)。此时,最好将其保存到一个全局静态对象/变量中,这将引入单例模式。此外,例如,一些系统只能有一个条目,这是不允许随便使用的,否则会出现错误,如典型的文件输入输出和控制器输入控制。
数据驱动:在统一的脚本对象中,它显然是数据驱动的,它的核心思想是在不改变代码的情况下改变数据。当您想要使用数据驱动时,您必须区分哪些是硬编码的,哪些是数据驱动的。过多的配置会影响开发效率和可读性。
减少指针跳转消耗:我认为这是ECS提出的原因之一。在大型游戏中,有大量的游戏对象。此时,由游戏对象中的各种指针跳跃引起的性能消耗不能被忽略。因此,在编写代码时,我们应该注意减少指针跳转,尽可能使内存连续分布,比如使用结构和数组。当然,连续的内存分配也可以减少内存碎片。
原型模式:这似乎已经在Cocos2d-x中看到过,并且使用了一个接口来克隆当前对象。事实上,这在实际游戏中很常见。例如,在GBA的木叶之战中,鸣人可以使用影子化身创造一个新角色,但是攻击强度和血量减半。在Unity中,当从项目窗口拖动到场景时(可能),预设也使用了类似的想法。
这是更多的经验,我不能说它做得很好。保持代码可读,以便您或其他人以后回来时可以阅读。有必要保持单一的职能责任。当你发现一些代码被重复写了几次,你应该考虑是否应该把它放到一个函数中。你必须明白的是,错误将永远存在,总有一天你或其他人会重新阅读这些代码。如果您在编写时稍微注意一下,以后的维护和重用将会相对简单和容易。
具体来说,你可以看到代码百科全书,代码整洁的方式和这个视频。
最后,制作游戏很有趣,编写游戏代码也很有趣。我希望你能享受游戏编程的乐趣!
2019/12/23
编码游戏玩家
游戏设计、原型和开发
游戏程序员的数据结构
游戏编程模式
代码大全
代码清洁之道
游戏的本质人工智能编程案例
代码的本色:用编程模拟自然系统
游戏编码完成
游戏编程算法和技术
游戏程序员和艺术家的着色器
统一着色器和屏幕特效开发技巧
来源:灯塔,欢迎分享这篇文章!