Sprite Kit中的弹跳标签

时间:2016-04-03 19:17:48

标签: ios swift sprite-kit

我正在构建一个游戏,当触摸屏幕时,标签应该反弹到屏幕上(只有一次)(它位于touchesBegan内)。

我发现this扩展程序有助于"弹跳"但我不知道当我触摸restartButton(此按钮工作正常)之前会发生什么 3秒(持续时间' s时间?!?!), myLabel 只会显示没有任何动画。我做错了吗?

Ps:restartButton有一个removeAllActions()。因此,即使这个动画处于循环中(我猜不是这样),它也会被停止,不会吗?

//myLabel
    myLabel.position = CGPoint(x: self.frame.width / 2, y: self.frame.height)
    myLabel.text = "0"

    self.addChild(myLabel)

    //bounces into screen (using Sprite-Kit Spring)
    self. myLabel.runAction(SKAction.moveTo(CGPoint(x: self.frame.width / 2, y: self.frame.height / 1.125), duration: 3.0, delay: 0.5, usingSpringWithDamping: 0.2, initialSpringVelocity: 0.0))

触摸restartButton时,它会调用此函数:

func restartScene(){
        self.removeAllChildren()
        self.removeAllActions()
        gameStarted = false

        createScene()
    }

Ps:createScene()是实际的游戏场景(诸如位置,音阶,物理等等)。

1 个答案:

答案 0 :(得分:1)

在Sprite Kit中工作时,请注意SKScene是SKNode的成员。调用removeAllActions只会删除应用于屏幕的操作,而调用removeAllChildren只会删除子项,而不会删除操作。

您需要给所有孩子打电话removeAllActions,让他们停止移动。

如果您想让场景的方法移除所有孩子的行为,请在SKNode设置扩展程序。

extension SKNode
{
    func removeAllActionsIncludingChildren()
    {
       self.removeAllActions()
       self.children.map { $0.removeAllActionsIncludingChildren()}
    }
}