【问题标题】:Identifying components in a component-based game engine识别基于组件的游戏引擎中的组件
【发布时间】:2012-01-14 06:45:12
【问题描述】:

我在网上阅读了很多关于基于组件的游戏架构的文章,所以我决定实现一个简单的系统来测试这个架构。

我已经实现了一个通用的游戏节点,它只承载了一个基本的组件列表和一些添加和删除这些组件的方法。我还有一个属于某个节点的消息列表,以方便它们之间的通信。

该示例只有拥有枪支的机器人(有基本的“枪支”枪支以及具有不同统计数据的派生类型等),它们互相射击并将结果打印到控制台。每当其中一个射击另一个时,都会在后者的列表中发布一条消息,其中 MSG_SHOT 代码和伤害量作为参数。这工作正常。

但是,我决定为一些枪添加“瞄准镜”,使其伤害翻倍。但是,我真的无法找到一种方法让武器检查它的一个孩子是否是一个范围,而无需实际迭代它们。有一些基本的解决方案,但我的目标是一个通用的解决方案(不仅仅是在枪上添加一个“范围”字段,如果它没有范围,则将其保留为空)。如果我想在枪上附加无数其他具有各种效果的小玩意怎么办?我怎样才能让它们影响我的枪组件的“射击”方法?

我是否应该在调用“shoot”时遍历所有 guns 的孩子,看看它们是否能够影响枪声?我认为依赖组件名称不会有任何好处。当任何范围可用时,也许我想要某种效果,但对于特定类型的范围来说,我想要一个花哨的效果。

在此先感谢您的任何指点,是的,在发布此内容之前,我已经阅读了大量文章/问题,但遗憾的是,我仍然感到困惑...... :(

【问题讨论】:

  • 我添加了一个简单的查询函数,它在节点的树中搜索某种类型,并返回第一个结果,否则返回 null。到目前为止工作得很好。除此之外,消息系统似乎工作正常。如果找到该项目的接收者,则节点的发送消息函数返回结果通用对象,否则返回 null。这种解释有什么重大问题吗?

标签: architecture components


【解决方案1】:

根据您向我提供的设置详细信息,这就是我所拥有的,但如果听起来我误解了您的布局,请扩展。

与对象相关的计算应在该对象内完成。

所以...''我是否应该在调用'shoot'时遍历所有枪支的孩子,看看它们是否能够影响枪声'...是的,因为范围会影响伤害输出在发送消息之前,应该在枪侧完成工作。我会看到它设置在某种“CalcDamageDelt”中,其中信息从枪传递到它的每个附件,以得出枪的总输出伤害。

一旦计算出枪支输出,结果将被打包并发送到接收器。然后接收器将计算任何对伤害的抵抗力(无论装甲什么的)并应用结果。

根据您的评论,这听起来像是您走的路线,但采用了更单一的方法(返回 null 或不返回),而不是寄宿生“将您的影响应用于我的伤害”。所以我认为你正在朝着一个好的方向前进。

【讨论】:

  • 感谢您的回复! :D 不是真的,返回可以发回任何东西,比如字符串,比如“嘿,你打我”或状态对象或任何东西。我应该担心这些检查的额外开销吗?如果这把枪真的很复杂,有很多孩子,而我必须遍历所有这些孩子只是为了检查,比如说,一个范围?这不会影响我的游戏性能吗?在大多数“常规”、直接层次结构方法中,这基本上只是一个 O(1) 操作,例如 if(scope != null) { ... }
  • 好的,另一个实用性问题 - 单元对象总是有一个“统计”节点,一个 box2d 节点和一个图形精灵节点。这些字段需要大量的交互和查询,只添加对它们的引用会是不好的做法吗?哦,现在出现了另一个问题——我应该区分“只是组件”和实际实体吗?就像对实体(例如“单元”和“玩家”对象)应用更宽松的规则,允许直接引用之类的东西远离限制性的“子”数组?
  • 我想我所说的范围部分是我会尝试将任何需要范围的计算保留在枪组件中。循环遍历 100 件事情并不需要很长时间,只要它是在触发计算上,而不仅仅是每帧检查。如果您需要外部项目来检查范围,那么我会采用您的方法,也许让枪知道它可以有范围并缓存结果。
  • 就引用而言,我认为它们运行良好,目标是保持逻辑和数据模块化,因此您可以拔下精灵并用模型替换它,然后继续。只要您不打破这个想法,只需使用参考来避免您不断进行名称查找。我发现在实践中我总是在“完美的设置引擎”和“运行速度足够快的代码”之间移动。因此,如果您尝试制作一些东西而不仅仅是一个演示,那么肯定会出现一些例外情况。
  • 啊,我明白了!非常感谢。我意识到我过度净化了这个概念。我现在有一些基本类,例如 Unit 等,它们包含对基本事物的直接引用,例如可渲染节点(到目前为止的精灵)、物理节点(box2D 包装器)等等。我看到这就是应该如何实施这个概念的方式。我现在拥有可以附加到任何东西的模块化对象,没有复杂的类层次结构,而且所述对象之间的通信速度快且不混乱。再次感谢!
猜你喜欢
  • 2010-12-26
  • 2017-07-27
  • 2015-04-30
  • 1970-01-01
  • 2011-08-07
  • 2017-08-01
  • 2016-09-21
  • 1970-01-01
  • 2011-04-26
相关资源
最近更新 更多