允许多个SKAction实例

时间:2016-01-18 22:43:46

标签: ios swift sprite-kit

我试图在swift中创建一个“太空入侵者”游戏,当用户触摸屏幕时从船上射出一颗子弹,但是当我试图再次触摸它同时子弹在屏幕上移动时,我有一个NSException和游戏休息。如何设置动作以便可以有多个动作实例,以便射击游戏是半自动的。下面是我当前的场景控制器。

import SpriteKit

class GameScene: SKScene {
    let background = SKSpriteNode(imageNamed: "background")
    let heroShip = SKSpriteNode(imageNamed: "heroShip")
    let bullet = SKSpriteNode(imageNamed: "bullet")

override func didMoveToView(view: SKView) {
    /* Setup your scene here */
    background.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame))
    heroShip.position =  CGPointMake(self.size.width/6.0, self.size.height/2.0)
    self.heroShip.zPosition = 1.0
    self.addChild(background)
    self.addChild(heroShip)

}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

    bullet.position = CGPointMake(heroShip.position.x + bullet.size.width/2, heroShip.position.y)
    let action = SKAction.moveToX(self.frame.width + self.bullet.size.width, duration: 0.5)
    self.addChild(bullet)
    bullet.runAction(action, completion: {
        self.bullet.removeAllActions()
        self.bullet.removeFromParent()
    })
}


override func update(currentTime: CFTimeInterval) {
    /* Called before each frame is rendered */
}
}

1 个答案:

答案 0 :(得分:2)

如果您想从一艘船上拍摄多个子弹,则必须创建一个子弹的多个实例。你现在拥有的是bullet类的GameScene属性,这是一个错误。 您可能希望在IBAction

中动态实例化项目符号

所以尝试这样的事情:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    let bullet = SKSpriteNode(imageNamed: "bullet")
    bullet.position = CGPointMake(heroShip.position.x + bullet.size.width/2, heroShip.position.y)
    let action = SKAction.moveToX(self.frame.width + bullet.size.width, duration: 0.5)
    self.addChild(bullet)
    bullet.runAction(action, completion: {
        bullet.removeAllActions()
        bullet.removeFromParent()
    })
}

并删除

let bullet = SKSpriteNode(imageNamed: "bullet")

从班级顶部