根据文档,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)
答案 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如何工作的事实是行动排队并始终在下一帧中处理。此外,您无法在未添加到场景的节点上运行操作。关键是你发布的内容应该有效,如果它不起作用,那么其他的东西是错的,但不是代码的这一部分。