游戏中的编程

编程作为一门技术和艺术,已经在我们的生活中发挥了巨大的作用。然而,当我们提到编程时,往往会想到那些与软件开发和网站设计相关的内容。但是实际上,在游戏开发领域,编程同样起着至关重要的作用。

游戏中的编程是将计算机代码应用于游戏设计和开发过程的技术。它涉及到创建游戏中的角色、事件、玩法规则等各个方面。通过编程,开发者能够为游戏增加功能,实现各种创新的想法,并最终将游戏带给玩家们。

在游戏中,编程的作用可以说是无处不在。无论是传统的桌面游戏、主机游戏还是移动游戏,都离不开编程的支持。通过编程,游戏开发者能够创建游戏中的角色、场景、对话、动画、音效等各个元素,以及游戏中的物理规则、敌人AI、关卡设计等等。所有这些元素的背后都是编程的力量。

让我们以一个简单的例子来说明游戏中的编程。假设我们正在开发一个移动平台的益智游戏,玩家需要通过操作屏幕上的方块,使其按照特定的规则进行移动。在这个游戏中,编程的任务是创建方块移动的逻辑代码。我们需要定义方块的起始位置、移动速度、移动方向等参数,并根据玩家的触摸输入来控制方块的移动。同时,我们还要编写检测方块是否到达目标位置的代码,并给予玩家相应的奖励或反馈。通过这些编程的工作,我们能够实现游戏中的核心玩法,让玩家享受到游戏带来的快乐和挑战。

编程在游戏开发中的应用不仅仅局限于游戏逻辑的实现,还可以扩展到游戏的工具和编辑器的开发。游戏开发者可以利用编程技术创建出强大的工具,用于构建游戏场景、调整游戏参数、设计游戏关卡等。这些工具的存在大大简化了开发的过程,提高了开发效率。

此外,编程还可以用于实现游戏的网络功能。例如,在多人在线游戏中,编程可以用来创建游戏服务器和客户端之间的通信协议,实现玩家之间的交互和游戏数据的传输。通过编程,开发者能够为玩家提供更多互动的机会,创造出更加丰富和具有社交性的游戏体验。

随着技术的不断进步,游戏中的编程也在不断发展和演变。近年来,虚拟现实(VR)和增强现实(AR)等新兴技术的兴起,为游戏开发者提供了更多创作的可能性。编程技术在这些新兴技术中的应用,使得游戏的immersive性更强,玩家可以更加身临其境地体验游戏的乐趣。

游戏编程入门指南

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

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

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

语言的选择

在一开始更多是推荐从高级语言入门,比如 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 着色器和屏幕特效开发秘笈

游戏开发新手必知:哪种编程语言能为你的游戏梦想添砖加瓦?

Hello!这里是W3Cschool编程狮的小狮妹。

游戏开发一直以来都是编程领域中备受关注的一个重要方向。想象一下,在虚拟的游戏世界里,你可以成为超级英雄、探险家,创造自己的独特宇宙。游戏世界无限广阔,而成为一名游戏开发者就像是成为了这个神奇世界的创造者之一。

不过,对于编程的初学者和从业者来说,选择适合自己的编程语言可能是一项挑战。市场上有很多种编程语言,每一种都有自己的优缺点,那么你应该如何选择适合游戏开发的编程语言呢?

其实,这没有一个绝对的答案,因为不同的游戏平台和类型可能需要不同的编程语言。但是,小狮妹可以根据一些常见的游戏平台,给大家一些参考的建议。

首先要考虑的是游戏将在哪个平台上运行。一般来说,游戏平台可以分为以下三类:

PC端或主机端

如果你想开发PC端或主机端的游戏,那么你最好学习C#或C++这两种编程语言。这是因为:

  • C#和C++都是高性能的编程语言,可以充分利用硬件资源,提高游戏的运行速度和画面质量。
  • C#和C++都支持面向对象的编程范式,可以让你更好地组织和管理游戏的代码结构,提高代码的可读性和可维护性。
  • C#和C++都有很多成熟的游戏引擎和库,可以让你快速地开发出各种类型和风格的游戏。例如,Unity、Unreal Engine、Cocos2d-x等。
  • C#和C++都有很多参考资料和社区支持,可以让你在遇到问题时找到解决方案。

移动端Android平台

如果你想开发移动端Android平台的游戏,那么你最好学习Java这种编程语言。这是因为:

  • Java是Android平台的官方开发语言,可以直接使用Android SDK进行游戏开发,无需额外安装其他工具或环境。
  • Java是一种跨平台的编程语言,可以让你的游戏在不同的设备上运行,无需修改代码或重新编译。
  • Java是一种易学易用的编程语言,它有着简洁明了的语法和丰富的内置类库,可以让你快速地掌握基本的编程概念和技巧。
  • Java也有很多优秀的游戏引擎和库,可以让你轻松地开发出精彩的游戏。例如,LibGDX、AndEngine、Corona SDK等。

移动端IOS平台

如果你想开发移动端IOS平台的游戏,那么你最好学习Objective-C这种编程语言。这是因为:

  • Objective-C是IOS平台的原生开发语言,可以直接使用Xcode进行游戏开发,享受苹果公司提供的优质服务和资源。
  • Objective-C是一种基于C语言扩展的编程语言,它兼容C语言的所有特性,并增加了面向对象和动态特性,可以让你更灵活地设计和实现游戏功能。
  • Objective-C也有很多专业的游戏引擎和库,可以让你打造出高品质的游戏。例如,SpriteKit、Cocos2d-iphone、Unity等。

除了上述主要语言之外,游戏开发人员可能还需要学习其他编程语言,以胜任各种工作任务。

例如:

  • Lua:一种轻量级的脚本语言,可以用来编写游戏的逻辑和交互,或者作为游戏引擎的扩展语言。它有着简单的语法和高效的性能,可以让你快速地实现游戏功能。很多游戏引擎都支持Lua语言,例如,Cocos2d-x、Corona SDK、Love2D等。
  • JavaScript:一种广泛应用于网页开发的脚本语言,可以用来开发基于HTML5的网页游戏,或者作为游戏引擎的扩展语言。它有着灵活的语法和强大的功能,可以让你创建出丰富多彩的游戏效果。很多游戏引擎都支持JavaScript语言,例如,Phaser、Pixi.js、Three.js等。
  • HTML5:一种用于描述网页结构和内容的标记语言,可以用来开发跨平台的网页游戏,或者作为游戏引擎的基础技术。它有着简洁明了的标签和属性,可以让你方便地布局和显示游戏元素。很多游戏引擎都基于HTML5技术,例如,Phaser、Pixi.js、Egret Engine等。
  • Python:一种优雅易读的编程语言,可以用来开发各种类型的应用程序,包括游戏。它有着丰富的内置类库和第三方模块,可以让你轻松地实现各种功能。它也有一些专门用于游戏开发的库,例如,Pygame、Pyglet、Panda3D等。

编程语言的选择取决于你的目标和水平,你需要根据自己的情况来做出合理的决定。一般来说,编程语言的选择可以分为以下两种情况:

  • 如果你是一个初学者,想要通过学习尽可能少的编程语言来从事游戏开发,那么我建议你选择C++和Java。这两种编程语言都是非常通用和强大的编程语言,可以涵盖大部分的游戏开发需求,而且学习资源也很丰富。你可以通过学习C++来开发PC端或主机端的游戏,也可以通过学习Java来开发移动端Android平台的游戏。而且,这两种编程语言都跟Objective-C比较相似,都是在C语言基础上发展来的,所以你学习C++之后可以在短时间内掌握Objective-C,从而也可以开发移动端IOS平台的游戏。
  • 如果你是一个从业者,想要提高自己的技能和水平,那么我建议你学习多种编程语言,并根据不同的任务和需求来选择合适的编程语言。因为游戏开发是一个需要不断学习和更新的领域,因为游戏技术和市场都在快速变化,所以你需要掌握多种编程语言和工具,以及适应不同的游戏风格和类型。你可以通过学习Lua、JavaScript、HTML5、Python等编程语言来增加自己的灵活性和创造性,也可以通过学习C#、Objective-C等编程语言来增加自己的专业性和效率。

总之,游戏开发需要用到不同的编程语言,而且没有一种编程语言是万能的。选择适合自己情况和职业发展的编程语言对于游戏开发至关重要。你需要根据自己的目标和水平来选择合适的编程语言,只有这样,你才能做出好玩的游戏。

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。