1

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

4

0 回答 0