在这里开始使用GameplayKit,我正在为一个无尽的跑步者建模,玩家可以通过点击屏幕在角色之间交换。角色首先可以在短距离(组件)中攻击,第二次跳跃(组件),以及第三次射击(组件)。
我想知道在这两者之间建模的最佳方式:
创建一个具有3个不同字符实体(数组)的类播放器,其中一个具有它的组件
创建一个包含3个不同字符组件的实体播放器 并添加所有动作和动作组件(拍摄/跳跃......)
这是一个真正的大项目所以我担心最好的方式让代码保持可持续性和可读性很长一段时间
诗:. SpriteComponent将是负责所有实体的.sks可视化表示的组件。
Ps2的:.尽可能快速的例子。
感谢您的时间。
答案 0 :(得分:4)
除了使用组件外,还取决于你做了什么以及每个角色做了什么。 使用gameplayKit我可能更喜欢创建实体类而不仅仅是类。
您是否考虑过只使用1个玩家实体,而当您更改角色时,您只需删除/添加该角色的组件。
假设你从攻击者改为跳跃者,你可以删除攻击组件
player.removeComponent....
并添加跳跃组件
let jumpingComponent = ...
player.addComponent(jumpingComponent)
通常,您希望确保您的组件尽可能灵活和通用。 例如,您的spriteComponent应在其init方法中采用图像字符串/纹理,以便您可以将相同的组件添加到每个实体,但使用不同的图像。
class SpriteComponent: GKComponent {
let node: SKSpriteNode
init(texture: SKTexture) {
node = SKSpriteNode(texture: texture, color: SKColor.clearColor(), size: texture.size())
}
}
现在,您可以在使用不同的图像时为每个角色添加相同的组件
let character1Texture = SKTexture(imageNamed: "Character 1 image"
let spriteComponent = SpriteComponent(texture: character1Texture)
addComponent(spriteComponent)
您的动画和其他组件也是如此。
我对待它的方式是这样的。
假设我有一个游戏,我有10种类型的敌人或多或少相同。我可能会尝试只有一个敌人实体类将所有10个敌人使用的所有组件。我将添加动态地或基于我将在init方法中传递的enumType的相关组件。
另一方面说我有3个主要角色都做了非常独特的事情,而不是简单而干净,只需创建3个实体类。也不要忘记子类化,因此你可以创建1个包含所有共享组件的实体类,而不是子类化其他2个实体。
Apple在DemoBots中做到了这一点,他们有一个TaskBot实体,而FlyingBoy实体和GroundBot实体都是TaskBot的子类。
它真的取决于你。