我将使用Spritekit进入GameplayKit,从我的收集中,您将GKEntity
子类化,然后开始将GKComponents
添加到该实体。实体或多或少只是一袋填充某些功能的组件。
我感到困惑的部分是组件之间的通信。如何使它们解耦。例如,假设我有一个HealthComponent
类,并将该组件添加到PlayerEntity
和EnemyEntity
中。我也有一个HealthBarComponent
,但我只希望在播放器上方显示一个健康栏。当玩家受到伤害时,该信息需要在HealthBarComponent
中进行更新。
那么该如何发送信息呢?我看到文档中有一个名为GKComponentSystem
的类。我不是应该如何使用它的100%。
另一个问题是..当玩家的生命值达到零时,他应该再生,而敌人应该保持死亡。当玩家的生命耗尽时,游戏结束。
敌人和玩家的医疗系统大致相同,但是死亡事件对于每个人而言都是完全不同的。我没有在保持每个实体的唯一行为的同时关注如何使用组件系统。
一些伪代码会很棒
最佳答案
看起来此框架的工作方式与我见过的其他框架略有不同,因为系统仅在单一类型的组件上工作,而不在具有一组组件类型的实体上工作。
在GamePlay-Kit框架中,您可以循环浏览并手动更新实体(依次更新每个实体组件),也可以创建一个继承自GKComponentSystem的类。然后,当您更新系统时,只要它们的类类型与您的you have added to it类型相匹配,它就会更新所有组件initialized the system with。
为了处理您的健康栏问题,我想说一下,制作一个HealthBarComponent
,在更新过程中,从其所有者实体中检索HealthComponent
,读取健康值并在每个帧中进行渲染。但是,您只需将add GKComponent.entity编码到您的玩家实体。
您可以从组件中检索所有者实体,反之亦然(请参阅GKEntity.components和ojit_a),因此您可以像这样更新健康栏:
/*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
}
为了处理玩家死亡问题,我认为您最好的选择是拥有两种不同类型的Health组件(PlayerHealth和EnemyHealth)以及两种不同的对应系统。一个或多个“健康”组件,但有两个单独的“死亡”组件。是的,这似乎是多余的,但我很难考虑此框架内的更好方法。以我的经验,您要么花时间担心所有内容都完全脱钩且可重复使用,要么您开发游戏:)
关于ios - GameplayKit-有关在组件之间发送消息的困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32446478/