怎么编程做一个游戏,少儿编程十大坑

首页 > 经验 > 作者:YD1662022-11-03 06:05:10

但是,一个原始的C 循环对我们来说还不够。游戏循环必须与现实世界的时间有某种关系。毕竟,游戏中的敌人应该在任何机器上都是以相同的速度移动,而不管这些机器的CPU时钟速度如何。

控制这个帧速率并将其设置为固定的FPS数实际上是一个非常有趣的事情。它通常要求我们跟踪帧与帧之间的时差,并进行一些合理的计算,以确保我们的游戏以至少30 FPS的帧速率顺利运行。

4 . 输入事件处理

很难想象一个游戏不从用户那里读取某种输入事件会是什么情景。所有这些输入事件可能来自键盘、鼠标、游戏板或虚拟现实设备。因此,我们必须在游戏循环中处理不同的输入事件。

要处理用户输入,我们必须请求访问硬件事件,这必须通过操作系统API执行。我们可以使用一些著名的多平台硬件抽象库(SDL、GLFW、SFML等)来处理用户输入。

例如,如果我们使用SDL就可以实现轮询事件,然后仅用几行代码就可以处理各种输入事件。

怎么编程做一个游戏,少儿编程十大坑(9)

再强调一次,如果我们使用像SDL这样的跨平台库来处理输入,我们不必太担心特定于操作系统的实现。无论我们的目标平台是什么,C 代码都应该是相同的。

至此,我们已经有了一个可工作的游戏循环和一种处理用户输入的方法。接下来是时候开始考虑在内存中组织游戏对象了。

5 . 在内存中表示游戏对象

在设计游戏引擎时,我们需要设计数据结构来存储和访问游戏对象。

程序员在设计游戏引擎时会使用多种技术。一些引擎可能会使用简单的面向对象方法来处理类和继承,而其他引擎可能会将它们的对象组织为实体和组件。

怎么编程做一个游戏,少儿编程十大坑(10)

如想学习更多关于算法和数据结构的知识,建议尝试实现这些数据结构。如果你使用的是C ,一个选项是使用STL(标准模板库),并利用它附带的许多数据结构(向量、列表、队列、堆栈、映射、集合等)。C STL在很大程度上依赖于模板,因此这是一个练习使用模板的好机会,同时可以在实际项目中看到它们发挥的作用。

在阅读过一些游戏引擎架构的内容后,你会发现游戏使用的最流行的设计模式之一是基于实体和组件。实体组件设计将游戏场景中的对象组织为实体(Unity引擎中称之为“游戏对象”,而Unreal引擎中则称之为“角色”)和组件(我们可以添加或附加到实体的数据)。

要了解实体和组件是如何协同工作的,请考虑一个简单的游戏场景。此例中,实体将是我们的主要游戏玩家,还包括敌人、地板、投射物等,而组件将是我们“附加”到实体上的重要数据块,如位置、速度、刚体碰撞器等。

怎么编程做一个游戏,少儿编程十大坑(11)

一种流行的游戏引擎设计模式是将游戏元素组织为实体和组件

我们可以选择附加到实体的一些组件,例如下面这些:

位置组件:跟踪实体在世界坐标系中的x-y位置坐标(或3D中的x-y-z)。

速度组件:跟踪实体在x-y轴(或3D中的x-y-z)上移动的速度。

精灵组件:通常存储我们应该为特定实体渲染的PNG图像。

动画组件:跟踪实体的动画速度,以及动画帧如何随时间变化。

碰撞器组件:这通常与刚体的物理特性有关,并定义实体的碰撞形状(边界框、边界圆、网格碰撞器等)。

健康组件:存储实体的当前健康值。这通常只是一个数字,或者在某些情况下是一个百分比值(例如,健康进度条)。

脚本组件:有时我们可以在实体上附加一个脚本组件,它可能是一个外部脚本文件(Lua、Python等),我们的引擎必须在后台解释和执行该文件。

上面给出的是一种非常流行的表示游戏对象和重要游戏数据的方法。如今,我们已经有了实体,然后我们就可以将这些不同的组件“插入”到实体中。

目前,市场上已有诸多书籍和文章探讨了实现实体组件设计的方式,以及在这个实现中应该使用什么样的数据结构。我们使用的数据结构和访问它们的方式对我们的游戏性能有直接的影响。开发人员经常会提到诸如面向数据的设计、实体组件系统(ECS)、数据局部性等想法,这些想法与我们的游戏数据在内存中的存储方式以及有效访问数据方式都有密切的关系。

在内存中表示和访问游戏对象可能是一个复杂的主题。根据我的经验,你可以手动编写一个简单的实体组件来实现,也可以简单地使用现有的第三方ECS库(Entity-Component-System,即“实体-组件-系统”的缩写。此模式遵循组合优于继承原则,游戏内的每一个基本单元都是一个实体,每个实体又由一个或多个组件构成,每个组件仅仅包含代表其特性的数据)。

当前市场上,有一些流行的现成的ECS库可供选用,我们可以将它们包含在C 项目中,开始创建实体和附加组件,而不必担心它们是如何在后台实现的。C ECS库的一些例子是EnTT和Flecs。

我个人建议那些认真对待编程的学生至少尝试一次手动实现一个非常简单的ECS。我的理由是,即使你的实现并不完美,从头开始编写ECS系统也会迫使你考虑底层数据结构以及相应的性能。

一旦完成了定制的临时ECS实现,我建议你只使用一些流行的第三方ECS库(EnTT、Flecs等),因为这些都是经过行业多年开发和测试的专业的游戏开发库,它们可能比我们自己从零开始编写的要好得多。

总之,一个专业的ECS很难仅凭个人力量从零开始实现。选择一个经过良好测试的第三方ECS库,并将其添加到游戏引擎代码中即可完成你的游戏作品。

6 . 渲染

游戏引擎的复杂性正在慢慢提升。前文已讨论了在内存中存储和访问游戏对象的方法,接下来我们需要讨论如何在屏幕上渲染对象的问题。

第一步是考虑用引擎创建的游戏的性质。我们创建的游戏引擎是否只用来开发2D游戏?如果是这样,我们需要考虑渲染精灵、纹理、管理层,并可能利用图形卡加速。2D游戏通常比3D游戏简单,因为2D数学比3D数学要简单得多。

怎么编程做一个游戏,少儿编程十大坑(12)

上一页12345下一页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.