2016-12-17 5 views
6

언제든지 멈출 수있는 영원히 달리는 SKAction을 만들기 위해 노력했습니다. 나는 이런 식으로 일을했다 : Swift 3 (SpriteKit) : 영원히 루핑을 멈추는 SKAction에 지연이 있습니다.

override func didMove(to view: SKView) { 

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

는 그 다음 drawFrame 기능에 나는이 같은 SKAction을 중지하십시오 SKAction은이 후 3 ~ 4 번 이상 실행할 때 중지 어떤 이유

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

그만 사실이되었습니다. 멈춤이 true로 설정되면 즉시 멈추고 싶습니다. 3 번 또는 4 번 더 반복하지 마세요.

누구든지이 문제를 해결하는 방법을 알고 있다면 많은 것을 시도했기 때문에 알려주세요. 문제를 해결하지 못하기 때문에 알려주십시오. 감사!

편집 : 나는 두 기능 전에 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() { 
    //(code) 
    if stop { 
     drawingFrame.speed = 0.0 
    } 
} 

내가 시작시 빈 SKAction에 SKAction drawingFrame을 설정 한 이유를 궁금해하는 경우는 다음과 같습니다 여기 내 코드입니다 . 그렇지 않으면 두 기능에 대해 정의되지 않습니다.

동일한 문제가있는 사용자를 위해 편집 : 내 생각과 @ appzYourLife의 해결책을 사용하여 문제를 해결했습니다. 매번 작동하는 가장 효율적인 방법은 stop이 false 인 경우에만 코드를 실행하는 것입니다. 그러나 프로그램을 중지시키는 if 문이 해당 대괄호 밖에 있어야 SKAction이 결국 중지됩니다. 이것은 작업 코드입니다 :

원하는 경우 stop = false 문에 대해 if else 문을 사용할 수 있습니다.

+0

그래, 내가 액세스 할 수 있도록이 같은 "트릭"최상위 선언을 않습니다. 이것이 최선의 방법인지는 모르겠지만 작동합니다. – Confused

+0

내가 이것을 읽는 방법 (그리고 그것은 믿을만한 읽기가 아닙니다)이 방법이 효과적입니다. 액션이 멈춰야합니다. – Confused

+0

그래, 그게 내가 생각했던거야. 조금 이상합니다. 어쨌든 팁 주셔서 감사합니다. –

답변

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을 사용하십시오.

+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 회 더 실행되지만 현재로서는 가장 효율적인 방법입니다. 내가 시도한 것 중 가장 좋은 것이므로 아마도이 것을 사용할 것입니다. –