Architecture 在基于组件的游戏引擎中识别组件

Architecture 在基于组件的游戏引擎中识别组件,architecture,components,Architecture,Components,我在网上读了很多关于基于组件的游戏架构的文章,所以我决定实现一个简单的系统来测试这个架构 我已经实现了一个通用的游戏节点,它只是一个基本的组件列表和一些添加和删除这些组件的方法。我还有一个属于某个节点的消息列表,以便于它们之间的通信 本例中的机器人拥有枪支(有基本的“枪支”枪支以及具有不同统计信息的派生类型等等),它们相互射击并将结果打印到控制台。每当其中一个射杀另一个时,一条消息就会被张贴在后者的列表中,并以MSG_SHOT代码和伤害金额作为参数。这样行 然而,我决定在一些枪上增加“瞄准镜”,

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

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

本例中的机器人拥有枪支(有基本的“枪支”枪支以及具有不同统计信息的派生类型等等),它们相互射击并将结果打印到控制台。每当其中一个射杀另一个时,一条消息就会被张贴在后者的列表中,并以MSG_SHOT代码和伤害金额作为参数。这样行

然而,我决定在一些枪上增加“瞄准镜”,使它们的伤害加倍。然而,我真的找不到一种方法让一件武器检查它的一个子武器是否是一个作用域,而不实际遍历它们。有一些基本的解决方案,但我的目标是一个通用的解决方案(不仅仅是在gun中添加一个“scope”字段,如果没有scope,则将其保留为null)。如果我想在枪上附加大量其他各种效果的小发明,会怎么样?我怎样才能使它们影响我的枪组件的“射击”方法

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


提前感谢您的指点,是的,在发布本文之前,我已经阅读了大量的文章/问题,遗憾的是,我仍然感到困惑…:(

关于您给我的设置详细信息,这是我得到的,但如果听起来我误解了您的布局,请详述

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

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

一旦枪的输出被计算出来,结果将被打包并发送给接收器。然后接收器将计算对伤害的任何阻力(装甲),并应用结果


从您的评论来看,这听起来像是您所走的路线,但是使用了一种更为单一的方法(返回null或not)我添加了一个简单的查询函数,用于搜索节点的树中的某个类型,并返回第一个结果或null,否则返回null。到目前为止效果相当好。除此之外,消息系统似乎工作正常。no如果该项目的接收者已定位,de将返回一个结果通用对象,否则返回null。此解释是否存在任何重大问题?感谢您的回复!:D哦,不太可能,返回可以返回任何内容,例如字符串,如“嘿,你打我了”或者一个状态对象或任何东西。我应该担心这些检查的额外开销吗?如果枪真的很复杂,有很多子对象,我必须循环所有子对象以检查(比如)范围?这不会影响我的游戏性能吗?在大多数“常规”的直接层次方法中,这基本上只是一个O(1)操作,例如if(scope!=null){…}好的,另一个实用性问题-单位对象总是有一个“stats”节点,一个box2d节点和一个图形sprite节点。这些字段需要大量的交互和查询,仅仅向它们添加引用是不是不好的做法?哦,现在又出现了另一个问题-我应该区分“只是组件”和实际实体吗?比如ap对“单位”和“玩家”对象等实体应用更宽松的规则,允许除了限制性的“子”数组之外的直接引用?我想我所说的范围部分是,我会尝试将任何需要范围的计算保留在枪组件中。即使循环100个东西也不需要l只要它是在触发器计算上,而不仅仅是每帧检查。如果你需要外部项目来检查范围,那么我会采用你的方法,也许让枪知道它可以有范围并缓存结果。就引用而言,我认为它们工作得很好,目标是保持逻辑和数据模块化,这样你就可以取消锁定ug一个精灵,用一个模型替换它,然后继续你的路。只要你不打破这个想法,只使用引用来避免你经常做一个名称查找。我发现在实践中,我总是在“完美的设置引擎”和“运行足够快的代码”之间移动。因此,如果你试图做一些事情,而不仅仅是一个演示,那么我会做一个few例外肯定会出现。啊,我明白了!非常感谢。我意识到我对这个概念的净化过度了。我现在有一些基本类,比如Unit等,它们直接引用了一些基本的东西,比如可渲染节点(到目前为止是精灵)、物理节点(box2D包装器)依此类推。我明白了这个概念应该如何实现。我现在有了可以附加到任何东西的模块化对象,没有复杂的类层次结构,而且在所述对象之间有一种快速且不易混淆的通信方式。再次感谢!