C ++实体组件系统:不同的行为

我正在尝试使用动作RPG类游戏,并使用alecthomas的一个修改版本的entityx,这基本上是一个实体组件系统。 我想要实现的一些东西真的很麻烦,因为我不知道如何把它放在组件上。 以下是我无法弄清的一些事情:

  1. 假设我有那些应该代表演员的实体,他们有健康,耐力,法力,属性……我如何实现一个定时的buff / debuff系统,而不会破坏ECS的目的? 每个角色可以同时受到多个BUFF的影响,BUFF可以影响到他们的任何事情。 一个组件只能保存这么多的数据,我不能为每个需要保存不同数据的buff添加一个新的组件。

  2. 如果我有一个连锁闪电的技能,我和一个演员一起施放,它会立即随机select和伤害敌方演员,游戏逻辑处理器只会清除伤害,并用RenderComponent为闪电效果创建一个实体。 但是RenderComponent只会告诉渲染处理器它是Lightning,数据在哪里描述哪个敌人被击中? 大多数技能效果对于其可渲染部分(如Source,Target,Intensity)具有某种参数…

这两个问题都基于同样的问题:我怎样才能在尽可能less的组件中表示具有不同参数的事物?

你的第一个问题 – 为什么不为每个BUFF有一个组件? 他们确实做了类似的事情,但是许多BUFF可能会有很大的不同。 例如,最简单的方法就是增加玩家的健康水平。 但是,你可能会有一个更复杂的debuff,每隔x秒就会对玩家附近的盟友造成伤害。

如果你不想为每种types的buff创建一个新的组件,那么你可以使用装饰器模式 n。 装饰器允许您在不影响该类的其他实例的情况下为类添加function。 它基本上是将一个类的实例包装到它的一个子类中,但是它是在运行时完成的,而不是像inheritance一样编译时。

对于你的第二个问题,你似乎几乎自己回答。 这听起来像你需要源,目标和强度组件和你的闪电链技能,当产生闪电效应应该有这些组件。 如何在系统之间传递数据是您需要为您的ECSdevise的一种deviseselect,可能是通过消息系统。 这意味着组件或实体应该能够相互发送和接收数据。

闪电效果实体可以将消息推送到游戏循环中,如“源:播放器,目标:敌人5,强度:10”,这可以被其他实体读取,并且如果消息是针对他们的消息进行处理的。