GameplayKit - 关于在组件之间发送消息的困惑

ham*_*obi 5 ios sprite-kit swift gameplay-kit

我正在使用Spritekit潜入GameplayKit,从我收集的内容,你继承GKEntity,然后开始添加GKComponents到该实体.该实体或多或少只是一个充满某些功能的组件包.

我很困惑的部分是组件之间的通信.你如何让他们脱钩.例如,假设我有一个HealthComponent类,我将该组件添加到a PlayerEntity和a EnemyEntity.我也有一个,HealthBarComponent 但我只想要一个健康栏出现在播放器上方.当玩家受到伤害时,需要更新该信息HealthBarComponent.

那么该信息应该如何发送?我看到GKComponentSystem文档中有一个类.我不是100%应该如何使用它.

另一个问题是......当玩家的健康状况达到零时,他应该在敌人应该死的时候再生.当玩家用完生命时,游戏结束.

敌人和玩家的卫生系统大致相同,但死亡事件对每个人来说都是完全不同的.我没有遵循如何使用组件系统,同时保持每个实体的独特行为.

一些伪代码会很棒

Def*_*wun 5

看起来这个框架与我见过的其他框架的工作方式略有不同,因为系统只能处理单一类型的组件而不是组件类型的实体.

在GamePlay-Kit框架中,您可以手动循环并更新实体(然后更新每个实体组件)或创建一个继承自GKComponentSystem的类.然后,当您更新系统时,只要它们的类类型与您初始化系统的类型相匹配,它就会更新您添加到它的所有组件.

为了处理你的健康栏问题我会说HealthBarComponent,在更新过程中,HealthComponent它会从其所有者实体中检索,读取健康值并在每一帧中呈现自己.但是你只为你的玩家实体添加了一个HealthBarComponent.

您可以从组件中检索所有者实体,反之亦然(请参阅GKComponent.entityGKEntity.components),以便您可以像这样更新健康栏:

/*Note: I'm not an ios developer, this is pseudocode*/

HealthBarComponent.update(){
  int healthValue = self.entity.components.get(HealthComponent).value;
  //Now render your health bar accordingly or hold onto this for later
}
Run Code Online (Sandbox Code Playgroud)

为了处理玩家死亡问题,我认为你最好的选择是拥有两种不同类型的健康组件(PlayerHealth和EnemyHealth)以及两种不同的相应系统.那或者有一个健康组件,但有两个独立的'死亡'组件.是的,这似乎是多余的,但我很难想到在这个框架内有更好的方法.根据我的经验,你要么花时间担心保持一切完全脱离和可重复使用,要么你建立一个游戏:)