我正在尝试使用GameplayKit来实现使用SpriteKit制作的2D游戏的所有实体/组件。我创建的第一个组件是 SpriteComponent :
class SpriteComponent:GKComponent
{
let node:SKSpriteNode
init(texture:SKTexture) {
node = SKSpriteNode(texture: texture, color: SKColor.clear, size: texture.size())
super.init()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
这意味着需要添加到场景中的所有组件使用。接下来我想添加一个组件来发射子弹,我称之为 FiringComponent 。由于子弹是图形项,它可能是实现 SpriteComponent 的实体,所以我编写了这段代码:
class Bullet:GKEntity
{
var velocity:CGPoint
var node:SKSpriteNode
{
return self.component(ofType: SpriteComponent.self)!.node
}
init(withVelocity velocity:CGPoint)
{
self.velocity = velocity
super.init()
let spriteComponent = SpriteComponent(texture: SKTexture(imageNamed: "Bullet"))
addComponent(spriteComponent)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func update(deltaTime seconds: TimeInterval)
{
self.node.position += self.velocity * CGFloat(seconds)
// I have overridden the CGPoint += and * operators
}
}
接下来是疑问: FiringComponent 是否应该直接将子弹实体添加到场景中? FiringComponent 的可能实现可能是添加 Bullet 实体,该实体应添加到游戏层次结构中并在每个帧中更新。但我认为这种逻辑是有缺陷的,因为这种方式组件需要有一个变量,不仅指向游戏场景,还指向包含所有实体并定期更新它们的对象。这样我就必须编写扭曲代码来发射子弹。我正在寻找一种干净利落的方式来实现:任何建议?