游戏代码编程入门(游戏代码编程教学)

   2023-05-05 互联网0
核心提示:游戏代码也写了几年, 有时候在想如果现在给刚入行的自己一点建议也许能有一点帮助。 所以这篇日志主要是分享一下自己对于游戏编程入门的一些想法。 这篇文章由爱发电支持写作, 如果你喜欢我做的事情,可以考虑在那里支持我。 语言的选择 在一开始更多

游戏代码编程入门(游戏代码编程教学)

游戏代码也写了几年, 有时候在想如果现在给刚入行的自己一点建议也许能有一点帮助。

所以这篇日志主要是分享一下自己对于游戏编程入门的一些想法。

这篇文章由爱发电支持写作, 如果你喜欢我做的事情,可以考虑在那里支持我。

语言的选择

在一开始更多是推荐从高级语言入门,比如 Java、C#、lua、python,javascript。在这个时期可以配合一些游戏引擎来学习,如果你是因为喜欢游戏才学习编程的可能不喜欢老是 print 一些文字,可能更喜欢输出图片。

可以直接从对应语言的游戏引擎开始做几个小 Demo 了解一下游戏构造,但是游戏引擎有个弊端就是 API 太多入门有点难……

游戏引擎的优点是做游戏会比较快,但是引擎整体还是略庞大,不适合学习代码之用。

之后可以使用 pico-8、love2d、pygame、SDL 或者直接 javascript 操作 canvas 画布来制作尝试制作游戏挑战自己编程能力。

而 C 语言(包含 C++)可以放在后续研究,研究 C 语言可以对语言底层点的东西理解。像指针可以让你直接访问内存,这在其他语言中是很少见。可能一般感受不出来它的力量,但当你面对资源紧张的系统(需要手动内存管理),比如 GBA 和 NDS 上面的编程时候就绕不开 C 语言甚至汇编语言了。

一定要多动手

我在没学习编程之前是个爱看书的小青年。所以在我刚开始学习写代码时候常常就一直看书没有实践,有些东西看似懂了,实际还是要上手操作才能掌握透彻。

在着手写代码时候最好是带着问题去学习,编程其实就是把复杂问题分解。比如在制作一个小 Demo 时候可以考虑这几个问题:

如何显示一个图片/精灵 如何播放帧动画 如何控制两个物体碰撞 两个物体碰撞时候销毁其中一个同时生成一个物体播放帧动画特效然后播放完成之后销毁 如何播放音乐音效 背景层滚动效果怎么做 如何处理存档(数据持久化)

而之后可以考虑的问题可能有:

精灵的显示如何分清楚哪个先渲染哪个后渲染(渲染层次) 每次播放特效都生成一个物体然后销毁是不是有点浪费内存,可不可以一次生成多个重复利用(引入了对象池) 存档时候如果 A 写入存档还没结束时候 B 又写入存档会不会出问题(引入了文件系统使用单例) 不要执着于 Opengl

游戏行业比较流行图形学,可能感觉起来高达上,但是对于初学者(非初学者其实也一样)来说更多还是应该专注于 GamePlay。

我在刚开始写代码没多久就跑去拿本 opengl 红宝书在啃,写了一堆代码到头来也没学到什么。

一开始不要考虑3D 方面东西,从简单的2d 开始比较不错。这个时候我更多推荐看下代码本色和游戏人工智能来锻炼一下代码能力。

甚至如果要学图形学 Shader 的,我更多建议是先直接用 Unity 上面先学习如何写一些 Shader(推荐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 Complete Game Programming Algorithms and Techniques Shaders for Game Programmers and Artists Unity 着色器和屏幕特效开发秘笈
 
标签: 代码 游戏 物体
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与爱美生活网(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 猫耳fm会员码在哪看,如何查看猫耳FM的会员代码
    猫耳fm会员码在哪看,如何查看猫耳FM的会员代码
    Hey FM fans! 想知道如何轻松查看你的猫耳FM会员码吗?别急,这里有个一键解锁福利的小秘诀!只需几步简单操作,你就能在周边商城畅游的同时,尽享会员特权。是不是已经迫不及待想要一探究竟了呢?下面就跟着我一起来揭开猫耳FM会员码的神秘
    06-19
  • 和平精英2022最新捏脸代码 女生风格捏脸_和平精英捏脸代码仙女害羞咬嘴唇和平精英纯欲脸代码数据分享
    和平精英2022最新捏脸代码 女生风格捏脸_和平精
    最近和平精英2022最新捏脸代码 女生风格捏脸_和平精英捏脸代码仙女害羞咬嘴唇和平精英纯欲脸代码数据分享事件在热度非常高,为大家准备了完整关于和平精英2022最新捏脸代码 女生风格捏脸_和平精英捏脸代码仙女害羞咬嘴唇和平精英纯欲脸代码数据分
    12-07
  • 无畏契约准星代码有哪些 无畏契约准星代码网站地址大全
    无畏契约准星代码有哪些 无畏契约准星代码网站
    无畏契约准星代码大全是一个网站,上面有很多无畏契约职业选手使用的准星代码。通过该网站,玩家可以获取和查看准星代码。以下是获取准星代码的方法:打开网站,点击VALORANT游戏,然后选择想要查看准星代码的职业选手。在选手页面中,找到对应准星代
    08-19
  • 以闪亮之名心语捏脸代码是什么 以闪亮之名心语官方捏脸数据id
    以闪亮之名心语捏脸代码是什么 以闪亮之名心语
    这是以闪亮之名官方海报中比较受欢迎的一套穿搭,官方在微博上发布了该海报上的捏脸数据,下面让我们一起来了解一下以闪亮之名心语的捏脸数据ID。以闪亮之名心语捏脸数据来源:来自微博用户@暴娇懒癌综合病患者国内服装ID:3372466国内无装饰ID
    08-13
  • 《暗黑破坏神4》错误代码NoGPUsFound?错误代码NoGPUsFound解决办法_暗黑34200错误
    《暗黑破坏神4》错误代码NoGPUsFound?错误代码
    《暗黑破坏神4》错误代码NoGPUsFound?错误代码NoGPUsFound解决办法_暗黑34200错误,很多朋友都不是很清楚,接下来小编就为大家介绍一下《暗黑破坏神4》错误代码NoGPUsFound?错误代码NoGPUsFound解决办
    06-30
  • 《蓝色协议》错误代码232-40解决办法_蓝色协议官网进不去
    《蓝色协议》错误代码232-40解决办法_蓝色协议
    《蓝色协议》错误代码232-40解决办法_蓝色协议官网进不去,很多朋友都不是很清楚,接下来小编就为大家介绍一下《蓝色协议》错误代码232-40解决办法_蓝色协议官网进不去。最近很多小伙伴在游玩蓝色协议的时候都遇到了错误代码232-40,但是
    06-20
  • 拨打电话至马来西亚区号加什么(马来西亚代码长途)
    拨打电话至马来西亚区号加什么(马来西亚代码长
    马来西亚国际电话区号加60。拨打马来西亚国际长途:00加60加对方号码。国际长途拨打方式:00加国家或地区代码加城市代码加对方号码或00加国家或地区代码加对方手机号码。拨打国外的座机:国际长途电话由“00”、国家代码、城市的长途区号、电话号
  • a股是什么股票代码(人民币境内中国股)
    a股是什么股票代码(人民币境内中国股)
    a股是以600开头的沪市股票代码。A股,即人民币普通股票,是由中国境内注册公司发行,在境内上市,以人民币标明面值,供境内机构、组织或个人以人民币认购和交易的普通股股票。根据股票上市地点和所面向的投资者的不同,中国上市公司的股票分为A股、B股
  • 《卧龙苍天陨落》侧马尾美女捏脸代码分享   侧马尾美女怎么捏出来?
    《卧龙苍天陨落》侧马尾美女捏脸代码分享 侧
    《卧龙苍天陨落》侧马尾美女捏脸代码分享 侧马尾美女怎么捏出来?,很多朋友都不是很清楚,接下来小编就为大家介绍一下《卧龙苍天陨落》侧马尾美女捏脸代码分享 侧马尾美女怎么捏出来?。  卧龙苍天陨落是一款最近非常受大家关注和热爱的游戏,那
    03-10
  • 冰箱代码有何含义
    冰箱代码有何含义
    冰箱中的代码意义:1、B表示为冰箱。2、C表示为冷藏。3、D表示为冷冻。通常,将不同用途的冰箱氛围三大类,每类都有各自的表示代号:C:表示家用冷藏电冰箱,即单门电冰箱CD:表示家用冷藏、冷冻电冰箱,即双门和双门以上的电冰箱。D:表示家用冷冻
点击排行