Swift 3(SpriteKit):停止永久循环的SKAction有一个延迟

时间:2016-12-17 05:25:17

标签: swift sprite-kit skaction

我一直在尝试制作一个永远运行的SKAction,我可以随时停止。我这样做了:

override func didMove(to view: SKView) {

    run(SKAction.repeatForever (
        SKAction.sequence ([
            SKAction.run(drawFrame),
            SKAction.wait(forDuration: 0.01),
            ])), withKey: "frameDrawing"
    )
}

然后在drawFrame函数中我像这样停止SKAction:

func drawFrame() {
    //(code)
    if stop {
        removeAction(forKey: "frameDrawing")
    }
}

出于某种原因,SKAction仅在停止变为真后再运行3次或4次时停止。我希望它在stop设置为true时立即停止,而不是在重复3或4次之后立即停止。

如果有人知道如何解决这个问题,请告诉我,因为我尝试过很多东西而且从来没有解决过这个问题。谢谢!

编辑:这是我的代码:

var drawingFrame = SKAction()
class GameScene: SKScene, SKPhysicsContactDelegate {

override func didMove(to view: SKView) {

    drawingFrame = SKAction.repeatForever (
        SKAction.sequence ([
            SKAction.run(drawFrame),
            SKAction.wait(forDuration: 0.03),
            ]))
    run(drawingFrame)
}

func drawFrame() {
   //(code)
    if stop {
        drawingFrame.speed = 0.0
    }
}

如果您想知道为什么我在开始时将SKAction drawingFrame设置为空SKAction,那是因为我需要在两个函数之前定义SKAction。否则,它将不会为两个函数定义。

为任何有相同问题的人编辑:我已经使用自己的想法和@ appzYourLife的解决方案解决了问题。每次都有效的最有效方法是只在stop等于false时才运行代码。但是,请确保停止程序的if语句超出该括号,以便SKAction最终停止。这是工作代码:

var drawingFrame = SKAction()
class GameScene: SKScene, SKPhysicsContactDelegate {

override func didMove(to view: SKView) {

    drawingFrame = SKAction.repeatForever (
        SKAction.sequence ([
            SKAction.run(drawFrame),
            SKAction.wait(forDuration: 0.03),
            ]))
    run(drawingFrame)
}

func drawFrame() {
    if stop = false {
       //(code)
    }
    if stop {
        removeAllActions()
    }
}

如果您愿意,可以对stop = false语句使用if else语句。

3 个答案:

答案 0 :(得分:4)

您可以删除当前节点上运行的所有操作。这不仅会立即删除序列操作,还会删除嵌入的操作。

func drawFrame() {
    if stop {
        removeAllActions()
    }
}

答案 1 :(得分:4)

我没有准确的解释为什么此刻多次调用drawFrame()(但我会尝试发现:D)......无论如何,试试这段代码:

import SpriteKit

class GameScene: SKScene, SKPhysicsContactDelegate {



    var stop = false

    override func didMove(to view: SKView) {

        run(SKAction.repeatForever (
            SKAction.sequence ([
                SKAction.run({[unowned self] in
                    if self.stop {
                        self.action(forKey: "frameDrawing")?.speed = 0.0
                    }else{
                        self.drawFrame()
                    }

                }),
                SKAction.wait(forDuration:0.03),
                ])), withKey: "frameDrawing"
        )
    }

    func drawFrame() {
        //(code)
        print("drawFrame")

    }
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        stop = !stop
        print(stop ? "stopped": "running")
        if !stop {
              self.action(forKey: "frameDrawing")?.speed = 1.0
        }
    }
}

使用touchesBegan切换暂停模式。

答案 2 :(得分:0)

尝试创建对SKAction的引用,并在您想要停止时调用速度更改(为0.0)。这两个都比查找操作名称然后删除它更快。但是在0.01时你已经比帧速率(0.01666)更快地重复它,所以你总是会得到至少一次额外的动作迭代,无论你如何阻止它。

类似的东西:

let myAction = SKAction.repeatForever (
        SKAction.sequence ([
            SKAction.run(drawFrame),
            SKAction.wait(forDuration: 0.01),
            ]))

//when you want to run it
run(myAction)

// when you want to stop it:
myAction.speed = 0.0