2016-06-24 6 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()メソッドを呼び出すことによって、問題を解決するために管理

EDITを理解されるだろうが、それは方法があることを意味し、私はこのソリューションを好きではありません1フレームにつき1回と呼ばれる。他のソリューションは非常にあなたがGameViewControllerの新しいインスタンスを作成するのではなく、現在の1つにアクセスしているので、このコードは何の意味

GameViewController().pause(true) 

を行うものではありません

+0

この質問は何度も答えられています。検索機能を使用してください。 – Knight0fDragon

+0

何か有用なものが見つかったのであれば尋ねなかったでしょう。質問が出されるたびに、別の解決策があり、私のために働いた人はいません。 – Gary

+1

シーンが一時停止または一時停止したときに、すべての子の状態を反転させるため、シーンの一時停止を無効にする必要があります。一時停止をオーバーライドし、すべての子の一時停止を一時配列に配置し、一時停止値を割り当ててから、子の一時停止状態を復元します。あなたは私の答えを見なければならないかもしれません。もし私がそうしているのであれば、私の答えはhttp://stackoverflow.com/questions/25351709/how-to-keep-spritekit-scene-paused-when-app-becomes-activeになります。 – Knight0fDragon

答えて

2

いただければ幸いです。

シーン全体を一時停止するのではなく、一時停止したいノードを一時停止するだけです。通常、あなたが必要とするすべてのノードとはDidMoveToView

でシーンに追加するよりも、

class GameScene: SKScene { 

    let worldNode = SKNode() 

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

    .... 
} 

(AppleはまたDemoBotsでこれを行います)

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

をあなたのゲームシーンでworldNodeのいくつかの種類を作成するには、追加一時停止worldNode

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

にあなたの一時停止機能よりも、この

のようになります。

と一時停止にすると、あなたの更新方法にこれを追加したときにゲームが必ず一時停止していることを確認するために、この

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

最後のように再開する。これはあなたのゲームが原因のアプリデリゲート、iOSのアラートなど

override func update(currentTime: CFTimeInterval) { 

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

    // Your update code 
    ... 
    } 

コメントの一つで言及されているように、あなたのAppDelegateからこれらを呼び出すには、あなたが委任またはNSNotificationCenterを使用する必要がありますし、事故例えばによって再開しないことを保証します。gameSceneで

worldNodeアプローチの主な利点は、簡単に一時停止のメニュースプライトを追加することができるということです

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

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 

didMoveToView

でNSNotifcationObserverを作成し、appDelegateに正しい場所でそれを投稿実際のゲームは一時停止しています。また、ゲームが一時停止している間も背景がアニメーション表示されているなど、ゲームをより詳細に制御できます。

これが役に立ちます。

+0

ありがとう、私はあなたが言ったようにすべてを正確に実装しました。最初にworldNodeが(私が期待しているように)一時停止するようなアプリを開くと、背景からアクティブになると、worldNodeは自動的にポーズしません。 – Gary

+0

申し訳ありませんが、これを言及するのを忘れました。私はこれが自動的に起こると思う、SpriteKitはノードを再開する。私が通常しているのは、gamePaused状態とgameActive状態を持つstateMachine(boolまたはenumまたはGKState)のようなものです。私がupdateメソッドのgamePaused状態に入っているとき、自動的に再開しないように、isPaused {worldNode.paused = true}のように言っています。私は私の答えを更新する – crashoverride777

+0

うーん..私はそれを試みたが、とにかくそれを再開..それは私の更新メソッドが発砲した後にゲームが一時停止したように思えるが、私はそれを置くべきであるかわからない。しかし、いつも助けてくれてありがとう! – Gary

関連する問題