GameplayKit:实施GKComponent来发射子弹的建议

时间:2016-10-23 00:20:50

标签: ios sprite-kit gameplay-kit

我正在尝试使用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 实体,该实体应添加到游戏层次结构中并在每个帧中更新。但我认为这种逻辑是有缺陷的,因为这种方式组件需要有一个变量,不仅指向游戏场景,还指向包含所有实体并定期更新它们的对象。这样我就必须编写扭曲代码来发射子弹。我正在寻找一种干净利落的方式来实现:任何建议?

0 个答案:

没有答案