2016-12-17 37 views
6

我一直試圖做一個永遠運行的SKAction,我可以停下來,只要我想。我已經做了這樣的:斯威夫特3(SpriteKit):停止永久循環SKAction有一個延遲

override func didMove(to view: SKView) { 

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

然後在並條機功能,我停止SKAction這樣的:

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

出於某種原因,SKAction後才時,它已經運行3或4次以上停止停止成爲現實。當停止設置爲真時,我希望它立即停止,而不是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語句。

+0

是的,我這樣做的頂級宣言相同的「伎倆」,所以我可以訪問它。我不知道這是否是最好的方式,但它是有效的。 – Confused

+0

我讀這個的方式(這不是一個可信的閱讀),這應該工作。行動應該停止。 – Confused

+0

是的,這也是我的想法。這有點奇怪。無論如何感謝提示。 –

回答

4

我沒有,爲什麼並條機()是在時刻多次調用一個確切的解釋(但我會盡力地發現: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 
     } 
    } 
} 

使用觸摸開始切換暫停模式。

+0

謝謝!這非常有效!雖然,要解決我的問題很難直接實施。但是,我可能會將此作爲我的程序的暫停系統,非常感謝! –

+0

@ J.Treutlein其實,關鍵是你應該總是通過按鍵來抓住一個動作,然後暫停它(速度= 0.0),或者移除它。你有精確的控制。 – Whirlwind

+0

感謝您的幫助,我真的很感激。它比removeAllActions()方法更好,因爲它非常精確,所以非常感謝。 –

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 
+0

感謝您的快速回復。 –

+0

我在我的項目中嘗試過,但現在它只是永遠持續下去。 –

+0

我不確定它爲什麼不起作用,而且我使用了打印件來確保停止檢測功能正常,但速度不會改變。 –

4

您可以刪除當前節點上運行的所有操作。這不僅會立即刪除順序操作,而且會立即刪除嵌入的操作。

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

謝謝你。停止設置爲true後,迭代仍會運行2次以上,但它是當前最有效的方法。我可能會使用這個,因爲這是我嘗試過的最好的。 –