SpriteKit:如何立即使用removeAllActions停止操作

时间:2016-05-22 08:50:54

标签: ios swift sprite-kit

根据文档,removeAllActions会立即取消操作,但对象的状态会更新至少一次。

我有一个简单的比例动画,

let scaleUp = SKAction.scaleBy(2.0, duration: time)
sprite.runAction(scaleUp)

以及删除所有操作并重置比例的事件。在touchesBegan循环期间调用该事件,

sprite.removeAllActions()
sprite.setScale(1.0)

动画停止,但精灵仍然是错误的比例。如果我再次调用同一事件,则会正确重置比例。

这些行动的确切时间是什么?文档似乎没有提到任何这些时间问题。否则我希望有一个" onCancel"可以传递给runAction并在删除后调用的回调,类似于"完成"。

编辑: 问题是我的一些代码尝试在删除操作之前重置精灵的大小(我更新其纹理,并且宽高比可能会改变,因此大小需要更新)

Repro案例基于旋风公司的答案。

class GameScene: SKScene {
let sprite = SKSpriteNode(color: .whiteColor(), size: CGSize(width: 123, height: 123))
override func didMoveToView(view: SKView) {
    sprite.alpha = 0.5
    sprite.position = CGPoint(x: 448, y: 223)
    addChild(sprite)
}
private func scaleTest() {
    let scaleUp = SKAction.scaleBy(2.0, duration: 0.5)
    let scaleDown = SKAction.scaleTo(1.0, duration: 3)
    sprite.runAction(SKAction.sequence([scaleUp, scaleDown]))
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    if sprite.hasActions() {
        sprite.size = CGSize(width: 123, height: 123)
        sprite.removeAllActions()
        sprite.setScale(1.0)
    } else {
        scaleTest()
    }
}
}

修复:

        sprite.removeAllActions()
        sprite.setScale(1.0)
        sprite.size = CGSize(width: 123, height: 123)

1 个答案:

答案 0 :(得分:1)

我无法重现你所说的话。对我来说,一切正常。看看这个例子(我没有改变场景的大小,所以它是默认的1024x768):

import SpriteKit

class GameScene: SKScene {

    let sprite = SKSpriteNode(color: .whiteColor(), size: CGSize(width: 123, height: 123))


    override func didMoveToView(view: SKView) {

        sprite.alpha = 0.5

         let sprite1 = SKSpriteNode(color: .redColor(), size: CGSize(width: 123, height: 123))

        let scaleUp = SKAction.scaleBy(2.0, duration: 7)
        sprite.runAction(scaleUp)
        sprite.position = CGPoint(x: 448, y: 223)
        addChild(sprite)

        sprite1.position = sprite.position
        addChild(sprite1)
    }


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


        sprite.removeAllActions()
        sprite.setScale(1.0)
    }

}

注意点击屏幕时白色精灵如何缩放到原始大小(至少在我的情况下)。

值得一提的是SKActions如何工作的事实是行动排队并始终在下一帧中处理。此外,您无法在未添加到场景的节点上运行操作。关键是你发布的内容应该有效,如果它不起作用,那么其他的东西是错的,但不是代码的这一部分。