我正在开发一个游戏,其中当触摸屏幕(在touchesBegan内部)时,标签应该反弹到屏幕中(仅一次)。

我发现this扩展名有助于“弹跳”,但我不知道在3秒钟(持续时间?!?!)前触摸restartButton(此按钮可以正常工作)时,会出现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()
    }


附言:createScene()是实际的游戏场景(位置,比例,物理等事物)。

最佳答案

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

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

如果要为场景提供一种删除所有子动作的方法,请在SKNode上设置扩展名。

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

关于ios - Sprite Kit中的弹跳标签,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36389977/

10-09 12:58