为什么SKAction.sequence在最后一次关闭后没有正确结束?

时间:2016-09-01 15:14:34

标签: swift sprite-kit skaction

我正在尝试将节点从一个Tile移动到另一个Tile。这里的问题是:如果我运行它,那么来自节点的position.y会有一些像63.9999而不是64,如果从32开始并在启动屏幕后立即触摸。

class A: SKScene {

       //Changed if screen Touched
       var abc = 0
       var node = SKSprideNode!

       override viewDidLoad() {
         node.run(SKAction.repeatForever(SKAction.sequence(
                [
                    SKAction.moveBy(x: 0, y: 32, duration: 1),
                    SKAction.run{
                        self.node.position.y = round(self.node.position.y)
                        if self.abc != 1 {
                            self.node.removeAllActions()
                        }
                    }
                ]
            )))
        }

        override func touchesBegan(...) {
        abc = 1
        }

        override update() {
          print(node.position.y)
        }

    }

这里是控制台的输出:

32.0
32.0
33.4936981201172
34.4316482543945
35.3333969116211
36.4936981201172
...
...
63.9936981201172
64.0
64.4936981201172
64.4936981201172
64.4936981201172

它应该是64.0,为什么它不是64.0?

1 个答案:

答案 0 :(得分:0)

我想使用当前iOS 9的术语,swift 2.3。

来自Apple docs

  

“要重复的动作必须具有非瞬时持续时间。”。

执行 runBlock 时,会立即执行操作。因此,您没有使用repeatActionForever,因为它意味着要使用。

你只需要添加一点延迟就可以了。事实上,如果你试图在你的行动之前稍微等待一下,那么:

SKAction.waitForDuration(0.1),
SKAction.moveBy(x: 0, y: 32, duration: 1),
SKAction.run{ ...

你应该按照自己的意愿获得64.0。