我对实体系统这个概念还很陌生,已经阅读了很多东西(最有用的是这个很棒的博客和这个答案)。
尽管我在理解如何通过不确定数量的源操纵对象的位置这样简单的事情上遇到了一些麻烦。
也就是说,我有我的实体,该实体具有职位组成部分。然后,我在游戏中发生了一些事件,告诉该实体在给定时间内移动给定距离。
这些事件可以随时发生,并且具有不同的位置和时间值。结果是将它们混合在一起。
在传统的OO解决方案中,我会有某种MoveBy
类,其中包含距离/时间,以及在我的游戏对象类内部的数组。每帧,我都要遍历所有MoveBy
,然后将其应用于该位置。如果a MoveBy
已达到结束时间,请从阵列中将其删除。
对于实体系统,我对如何复制这种行为感到有些困惑。
如果一次只有一个,而不是能够将它们复合在一起,那将是相当简单的(我相信),并且看起来像这样:
PositionComponent
包含 x, y
MoveByComponent
包含 x, y, time
Entity
同时具有a PositionComponent
和aMoveByComponent
MoveBySystem
查找具有这两个组成部分的实体,并将的值添加MoveByComponent
到中PositionComponent
。当time
到达,它会从该实体的组件。
我对于在很多情况下如何做同样的事情有些困惑。
我最初的想法是我会:
PositionComponent
,MoveByComponent
与上述相同
MoveByCollectionComponent
其中包含MoveByComponent
s 的数组
MoveByCollectionSystem
查找具有PositionComponent
和的实体,并在MoveByCollectionComponent
其中的MoveByComponent
s中进行迭代,并根据需要应用/删除。
我猜这是一个更普遍的问题,具有许多相同的组件,并且希望有一个相应的系统对每个组件起作用。我的实体将其组件包含在组件类型->组件的哈希中,因此每个实体严格只有一种特定类型的组件。
这是看待这个问题的正确方法吗?
实体是否应该始终始终只有一种给定类型的组件?
move x by 10 in 2 seconds
并且move x by -10 in 2 seconds
实体将完全静止不动?
MoveBy
功能只是一种速度?听起来您在正确的轨道上。对于第二个问题,实体/组件系统有很多不同的实现。在您链接的我的答案中描述的内容只有一个给定类型的内容。