如何设计一种面向对象语言的游戏引擎?[关闭]


26

每当我尝试用任何面向对象的语言编写游戏时,我总是要面对的第一个问题(在考虑编写哪种游戏之后)是如何设计引擎。即使我正在使用现有的库或框架(例如SDL),我仍然发现自己必须为每个游戏做出某些决定,例如是否使用状态机来管理菜单,用于资源加载的类类型等。

什么是好的设计,将如何实施?需要进行哪些权衡以及它们的利弊?


12
继续冲动并从那里进行重构而不是使分析瘫痪有什么问题?
共产主义鸭子

7
@TheCommunistDuck因为冲动是我之前所有项目中采用的方法-几个月后,我发现任何新功能都需要付出巨大的努力和复杂性后,每个人都会碰壁。现在,我花更多的时间在重写引擎上,而不是在编写游戏本身上,所以我希望通过一些周到的准备和规划,从长远来看可以节省时间。
extropic-engine

3
@chuzzum,好点。然后,我建议的一件事是检查C4引擎的体系结构,即:terathon.com/c4engine/images/architecture.png可能比您需要的高得多,但可能会给您一些想法;-)
共产主义鸭子


3
这个问题也有点含糊。也许举一个例子,提出一个或两个以上的更深层次的问题。
四分

Answers:


24

我怀疑有人会说:“您必须使用模式X来执行该操作,该操作以及该操作与该操作”。

但是,有一些有用的资源:
Enginuity-Gamedev.net上的一系列引擎构建文章。
游戏编码完成 -我拥有这本书,它很好地涵盖了游戏编程的各个方面。在本书中也确实内置了引擎。
游戏引擎架构 -这是关于引擎设计的另一本好书。
C4引擎布局 -摘自我的评论,但这显示了将引擎各部分装配在一起的高级方法。

这些对于您所需的内容可能有点过多,但是您对某些内容了解得不多,我相信您会从中得到一个好的计划。

编辑:我忘了自新站点以来,已将Gamedev文章存档:)


Enginuity链接已断开,在Google上搜索这些文章似乎表明它们不再在网络上。(?)这些书虽然看起来像是很好的资源,但我一直在关注更多编程书籍;)
extropic-engine

另外,关于您的第一条评论,我不希望有人提出适合每个游戏的总体规划。我只是注意到,在开发一些游戏的过程中,常见的模式确实会出现很多,所以我想知道其他人在他们的游戏中使用了什么。
extropic-engine

1
修复了链接。
共产主义鸭子

+1表示工程学。@chuzzum只需检查几个游戏引擎,让它们启发您并为您自己找到最佳的架构。另外:通常,使游戏引擎组件比基于层次结构更好,请参阅cowboyprogramming.com/2007/01/05/evolve-your-heirachy

1
我不会说,需要聚合的是引擎,更多是实体框架部分。
共产主义鸭子

7

举例来说,这就是我当前的类似roguelike项目的结构(使用Java)。它使用2D图形引擎,因此很多渲染代码已经为我解决了。欢迎批评。

class Game
此类设置了状态机来管理游戏的当前状态。(在菜单中与开始新游戏与在播放保存的游戏中)

interface State
每个State类包含两个循环:一个用于更新逻辑的循环和一个用于呈现的循环。它们还包含用于调用Game类并请求更改为其他状态的代码。

class ResourceManager
Game类初始化的单例,该单例加载所有需要的资源并允许对其进行访问。我不喜欢这种设计,因为它使例如在不同级别上加载/卸载资源变得困难。如果我要从头开始,我可能会对此进行不同的设计。

class Map
一张地图包含一组瓷砖以及该地图上所有生物和物品的列表。这是一个非常基础的课程。

class Creature
生物包含有关自身的信息,包括运动计算(要求他们知道他们所处的地图,并能够对其进行查询以找出障碍物)。我要努力决定是否要这样做,还是让某种管理者班上的所有生物都来照顾它。

interface AITask
生物可以有一个AITasks列表,该AITasks列表在每次运行该生物的逻辑循环时都会执行。AITask具有其自己的逻辑循环,用于向生物发出命令,以及终止条件,用于确定任务是否成功完成。

interface UIElement
我为此引擎实现了自己的UI。每个UIElement都有一个渲染循环和一个逻辑循环。它们还具有用于处理键盘/鼠标输入的循环。所有元素可以具有许多子元素,这些子元素在其父元素之后呈现,并接管键盘/鼠标输入。例如,这使您可以使用带有子菜单的菜单。


这到底是怎么了?对我来说似乎很好。
共产主义鸭子

@TheCommunistDuck在我选择的示例中并没有真正实现,但是此代码确实存在很多问题。ResourceManager类是其中之一,但我也遇到一些麻烦,因为状态会大量扩散,并复制大量代码。尤其是在RPG中,玩家可以随时选择很多东西,最终可能会遇到非常复杂的状态图。示例:施放咒语。从NormalState-> SelectSpellState-> SelectTargetState-> InvalidTargetState(如果失败)-> DoSpellAnimationState-> NormalState进入。那只是一个动作。
extropic-engine

1
不,不。NO。不。请不。哦,等等,你说你不喜欢它。
Bartek Banachewicz 2013年

6

首先要指出的是,这个问题没有一个“好的”答案。

正确答案最接近的是:很大程度上取决于游戏的类型,目标平台,约束(时间)等。

就是说那里有一些非常好的文章,这些文章将向您展示其他人如何尝试解决此问题(因为我过去曾尝试查找有关此问题的信息)。
正如共产主义鸭子所说的关于游戏开发者的工程学文章帮助我理解了游戏体系结构的某些部分。

我当前的设计是Quake3 / Doom3和.NET类库的一点混合:)

我有两个库(静态或动态取决于你想如何构建/交付)的FrameworkLibrary

该库包含所有帮助类,可以帮助您制作游戏软件,但不仅限于此类产品。即,它具有链表的实现,该链表已针对游戏代码进行了优化,但可由需要链表服务的任何人使用。

如果您想将其称为“引擎”,那么框架就是胆量。其中很多都遵循Quake3的设计理念(只是以更面向对象的方式)。它包含CLI,时序管理,特定于OS的代码以及最终的网络层等。

然后将这两个链接与正在生成的实际应用程序联系起来。的Game,如果你喜欢,它包含了游戏的特定代码。与Quake3加载DLL的方式大致相同,具体取决于播放的是“ mod”。

为了让您对结构有所了解,这里是每个库的文件夹和内容的快速细分:


  • 构架
    • IO(专家文件管理类,文本打印类(例如,到CLI)和日志记录等)
    • 网络
      • 客户(代表框架认为是“玩/玩游戏的人”的类)
      • 服务器(用于管理与框架的连接和管理播放器的类)
    • 平台(键盘/鼠标/控制器处理类,特定于操作系统的例程,如getTime())
    • 系统(非常低级的类,例如帮助打印错误消息的错误类,计时类和CLI本身。)
    • 渲染器(自我解释)
    • 等等

  • 图书馆
    • 集合(代表数据集合,链接列表/哈希表等的类)
    • 数学(向量和矩阵之类的基本数学帮助器类)
    • 等等

HTH!应该给你一些指示...



-3

要考虑的事情

  • 面向对象的语言存在问题,因为它们通常不具有一流的功能,或者并非所有数据都是对象(例如Java中的整数或浮点数)。设计模式通过几种模式解决了这些问题。通常,它可以更快地编写代码,并且更易于使用能够做到这一点的语言(一流的对象);例如Python(它也允许面向对象的设计),您的速度将会变慢。
  • 事件演算,至少对AI
  • Hoare逻辑,使用前提条件和后置条件至少测试您的代码
  • 特工,看看雷神之锤实体
  • 关系数据库,强大的数据存储方式

好的设计

  • 制作ER图
  • 使它正确
  • 从中创建数据库,对象或数据结构

数据是编程的关键。如果您希望数据良好,通常会从中产生算法(如果您不计算某些数值算法,例如计算行列式)。


-1,因为这个答案非常模糊和混乱。关系数据库与OO引擎绝对无关。我可以理解英语不是您的第一语言,但是您能否在第一段中解释您的意思?这似乎是矛盾的(OO语言有问题,但是使用设计模式的语言进行编程更容易。尽管设计模式几乎总是OO结构)。
共产党鸭子

@鸭矛盾?OO有其他语言不存在的问题,DP解决了这些问题,请参见c2.com/cgi/wiki?DesignPatternsInDynamicProgramming
user712092 2011年

@Duck 1)您可以在C ++中使用SQL 2)您可以从ER推断对象的属性(尽管不建议这样做)3)您可以从关系中构造数据结构体(这是一个列表,因为我需要在willm处对元素进行重新排序这是一个哈希,因为我需要快速查找)
user712092 2011年

@抱歉,我通过重新排序犯了错误。我不想声称“ DP比XY更容易”,但是“可以做到一流的语言是……”。:)
user712092 2011年

是的,功能语言可能会有优势。但是,即使公正地说,我也认为从游戏开发的角度来看,OO方法是合乎逻辑的。而且,没有理由在任何地方都需要关系数据库。当然,它们会有用。但是,它并没有在任何地方成为必需的组件。
共产党鸭子
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.