2016-06-24 4 views
-1

내 애플리케이션을 닫은 후 앱을 반환하면 applicationDidBecomeActive(application: UIApplication)이 자동으로 AppDelegate.swift에서 실행됩니다. 이 응용 프로그램의 일시 정지 상태를 처리하는 방법 화재 : GameViewController().pause(true)앱이 활성화 된 후에도 SpriteKit 장면 일시 중지

방법은 다음과 같습니다

func pause(paused: Bool) { 
    if paused == true { 
     scene?.paused = true 
     print("paused") 

    } else if paused == false { 
     scene?.paused = false 
     print("unparsed") 
    } 
} 

먼저 게임이 자동으로 수행해야하는지 정확히 어떤 일시 정지 된 응용 프로그램을 실행. 응용 프로그램으로 돌아갈 때 그것은 일시 중지됩니다. 그래도 콘솔은 "일시 중지됨"을 인쇄합니다.

scene?.paused 대신 scene?.view?.paused을 사용해 보았습니다. 이것은 효과가 있지만 장면에서 실행되는 애니메이션에서는 지연이 발생합니다.

어떤 도움은 매우 내가 update(currentTime: NSTimeInterval) 함수의 pause() 메소드를 호출하여 문제를 해결하기 위해 관리

편집을 감상 할 수 있지만,이 방법은 의미로 나는이 솔루션을 좋아하지 않는다 프레임마다 한 번 호출됩니다. 다른 솔루션은 매우 당신 GameViewController의 새로운 인스턴스를 생성하기보다는 현재에 액세스하기 때문에이 코드는 아무 의미

GameViewController().pause(true) 

하지 않습니다

+0

이 질문은 여러 번 대답 했으므로 검색 기능을 사용하십시오. – Knight0fDragon

+0

아무 것도 발견하지 못했을 때 물어 보지 않았을 것입니다. 질문 할 때마다 또 다른 해결책이 있으며 그들 중 누구도 나를 위해 일하지 않았습니다. – Gary

+1

장면이 일시 중지되거나 일시 중지되지 않으면 모든 자식의 상태가 전환되므로 장면의 일시 중지를 재정의해야합니다. 일시 중지를 재정의하고 모든 일시 중지를 임시 배열에 배치하고 일시 중지 값을 할당 한 다음 하위 일시 중지 상태를 복원합니다. 당신은 내 대답을 봐야 할 수도 있습니다 http://stackoverflow.com/questions/25351709/how-to-keep-spritekit-scene-paused-when-app-becomes-active면 당신이 8을하고있다 – Knight0fDragon

답변

2

감상 할 수있다.

전체 장면을 일시 중지하는 대신 일시 중지 된 노드를 일시 중지해야합니다. 일반적으로 당신은 당신이 추가 일시 정지 할 필요 모든 노드보다 DidMoveToView

override func didMoveToView(view: SKView) { 
    addChild(worldNode) 
} 

에 현장에 추가보다 (애플도 DemoBots에서이 작업을 수행) 게임 장면에서

class GameScene: SKScene { 

    let worldNode = SKNode() 

    // state machine, simple bool example in this case 
    var isPaused = false 

    .... 
} 

을 worldNode의 어떤 종류를 만들 이

처럼 보일 것입니다 귀하의 일시 정지 기능보다 worldNode

worldNode.addChild(YOURNODE1) 
worldNode.addChild(YOURNODE2) 

에 당신의 업데이트 방법이 추가 일시 정지 할 때이

func resume() { 
    worldNode.paused = false 
    physicsWorld.speed = 1 
    isPaused = false 
} 

같은

재개는 마지막으로 게임이 항상 일시 정지 확인합니다. 이것은 당신이 게임으로 인해 애플 대리자, 아이폰 OS 경고 등

override func update(currentTime: CFTimeInterval) { 

     if isPaused { 
     worldNode.paused = true 
     physicsWord.speed = 0 
     return 
     } 

    // Your update code 
    ... 
    } 

의견 중 하나에 언급 된대로 AppDelegate에에서 이러한 호출하려면 위임 또는 NSNotificationCenter를 사용해야에 사고 예컨대으로 다시 시작되지 않도록합니다.

는 gameScene에서

는 didMoveToView

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(pause), name: "Pause", object: nil) // in your app put the name string into a global constant property to avoid typos when posting 

에 NSNotifcationObserver을 만들고 AppDelegate에 올바른 장소에 게시

NSNotificationCenter.defaultCenter().postNotificationName("Pause", object: nil) 

worldNode의 접근 방식의 주요 장점은 쉽게 일시 정지 메뉴 스프라이트를 추가 할 수있다 실제 게임이 일시 중지되는 동안. 또한 게임을 더 많이 제어 할 수 있습니다 (예 : 게임이 일시 중지 된 상태에서 배경이 계속 움직이는 경우).

희망이 도움이됩니다.

+0

고맙습니다. 문제는 그대로 남아 있습니다. 먼저 worldNode가 일시 중지되면서 앱을 엽니 다 (배경에서 활성화 될 때 예상됩니다). 그러나 worldNode는 자동으로 일시 중지됩니다. – Gary

+0

죄송합니다. 죄송합니다. 자동으로 발생하는 것으로 생각합니다. SpriteKit은 노드를 다시 시작합니다. 일반적으로 gamePaused 상태와 gameActive 상태가있는 stateMachine (bool 또는 enum 또는 GKState)이 있습니다. update 메소드에서 gamePaused 상태에있을 때 자동으로 다시 시작되지 않도록 isPaused {worldNode.paused = true}와 비슷한 방식으로 말합니다. 내 대답 – crashoverride777

+0

흠 ... 업데이트 할 것입니다. 나는 그것을 시도했지만 어쨌든 다시 시작합니다. 마치 내 업데이트 메서드가 해고 된 후 게임이 일시 중지 된 것처럼 보이지만 다른 곳에 넣어야하는지 잘 모르겠습니다. 그러나 어쨌든 도와 줘서 고마워요! – Gary

관련 문제