SpriteKit GameScene函数在被按钮调用后不会添加SKSpriteNode

时间:2015-07-11 21:31:38

标签: swift projectile

我检查了fireLaser()函数是否被调用,因为它可以访问并打印到控制台,但激光从未添加到场景中。如果我将代码复制并粘贴到fireLaser()函数中,则可以在didMoveToView()函数中使用。

let character = SKSpriteNode(imageNamed: "monkey")
let laser = SKSpriteNode(imageNamed: "bullet_yellow")

override func didMoveToView(view: SKView) {
    var background : SKSpriteNode = SKSpriteNode (imageNamed: "space.png")
    background.position = CGPointMake(self.frame.size.width/2, self.frame.size.height/2)
    background.size = self.frame.size
    self.addChild(background)
    character.position = CGPoint(x: size.width * 0.5, y: size.height * 0.25)
    addChild(character)

//Shoots Laser From Character
func fireLaser(){
    laser.position = character.position
    addChild(laser)
    let laserDestination = CGPoint(x: character.position.x, y: self.size.height)
    let actionMove = SKAction.moveTo(laserDestination, duration: 2.0)
    let actionMoveDone = SKAction.removeFromParent()
    laser.runAction(SKAction.sequence([actionMove, actionMoveDone]))
    println ("check")
}

//来自游戏视图控制器

@IBAction func firePressed(){
    GameScene().fireLaser()
}

1 个答案:

答案 0 :(得分:0)

这部分:

@IBAction func firePressed(){
    GameScene().fireLaser()
}

...你的意思是实例化一个新的GameScene并立即打电话给fireLaser()吗?没有可能首先在SKView中呈现场景?

我认为发生的事情是,无论何时按下按钮,您都会运行firePressed()方法,这将创建一个新的GameScene对象实例(GameScene()部分),运行fireLaser()方法那个实例,然后用它完成。问题是,它是另一个游戏场景,也就是说,不是你在SKView中的场景。

相反,您应该在已经的场景上运行fireLaser()

E.g。类似的东西:

@IBAction func firePressed(){
    skView.scene?.fireLaser()
}