2017-01-16 18 views
0

Xcode 8とSwift 3で、ゲームを一時停止した後にシーンに「Resume Game」ボタンを表示しようとしていますが、適切にそうする方法が見つかりませんでした。私はこのページのMikeのアドバイスに続きました“Tap To Resume” Pause text SpriteKitしかし、それは役に立たなかった。SpriteKitでゲームシーンを一時停止した後に再開ボタンを表示しようとしています

func pauseGame() { 
    self.isPaused = true 
    self.physicsWorld.speed = 0 
    self.speed = 0.0 
    self.scene?.view?.isPaused = true 
} 

それは少しやり過ぎのように見えるかもしれないが、それは動作します:私の一時停止ボタンをタップすると

は、それが次のコードでポーズ機能を実行します。私は私の一時停止機能から

self.scene?.view?.isPaused = true 

を削除した場合、私はボタンを再開するために、タップを表示することができるよ、私はまだシーンでSpriteKitベースのノードの一部と対話することができます。私は宇宙飛行士のゲームに取り組んでいるので、ユーザーは宇宙船を動かすことができ、弾丸は、シーンを再開するまで移動しませんが、タップすることができます。

一時停止機能にブール値 "true"を追加し、上記の発砲と移動にIF文を追加することを考えましたが、それは少し複雑です。

シーンを一時停止するときに[再開]ボタンを表示する方法についてのご意見はありますか?

+0

一時停止機能の最初の行として再開ボタンを表示してみませんか? –

+0

私はそれを試みましたが、再開ボタンが表示される前にすべてが停止します。実際、上には示されていませんが。このコードは、pauseGame関数の前にボタンを表示するために呼び出されます。 –

+1

これはあなたが探しているものかもしれないhttp://stackoverflow.com/questions/25824984/how-to-pause-completely-a-game-spritekit-scenekit-swift – 0x141E

答えて

1

あなたの完全な例は次のようになります。上記の私の問題については、以下のコードを使用して動作しました。追加のコードは、一時停止ボタンも閉じます。これで私は多分fadeInとfadeOutアクションを両方のボタンに追加することができます。

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch: AnyObject in touches { 

     let pointOfTouch = touch.location(in: self) 

     let nodeUserTapped = atPoint(pointOfTouch) 

     if nodeUserTapped.name == "PauseButton" { 
      if (self.isPaused == false) { 
       pauseGame() 
      } 
     } 

     if nodeUserTapped.name == "ResumeButton" { 
      if (self.isPaused == true) { 
       resumeGame() 
      } 

     } 
    } 
} 


// MARK: - pauseGame 
func pauseGame() { 
    self.isPaused = true 
    currentGameState = gameState.pauseGame 
    self.physicsWorld.speed = 0 
    self.speed = 0.0 
    if (backgroundMusicIsOn == true) { 
     backingAudio.stop() 
    } 
    if resumeButton.isHidden == true { 
     resumeButton.isHidden = false 
    } 
    if pauseButton.isHidden == false { 
     pauseButton.isHidden = true 
    } 
} 


// MARK: - resumeGame 
func resumeGame() { 
    self.isPaused = false 
    currentGameState = gameState.inGame 
    self.physicsWorld.speed = 1 
    self.speed = 1.0 
    if (backgroundMusicIsOn == true) { 
     backingAudio.play() 
    } 
    if resumeButton.isHidden == false { 
     resumeButton.isHidden = true 
    } 
    if pauseButton.isHidden == true { 
     pauseButton.isHidden = false 
    } 
} 
2

完全に一時停止したため、シーンのノードと対話できません。シーンのすべての子ノードをすべて一時停止します。これを避けるには、特定のSKNode(レイヤー)だけを一時停止します。

別のノードをSKNodeに追加すると、シーン全体を一時停止するのではなく、一時停止したいレイヤー(SKNode)(gameLayer)だけを一時停止することができます。それはこのようになります:

ノード今、あなたの代わりに、シーンに子を追加するには、それがの一部になりたい層にそれを追加したいとき

let gameLayer = SKNode() 
let pauseLayer = SKNode() 

に初期化します:

はメイン層

gameLayer.addChild(gameSceneNode) 
pauseLayer.addChild(resumeButton) 

Dに子ノードを追加します。この例では

gameLayer.isPaused = true 

注こと:on't

addChild(gameLayer) 
addChild(pauseLayer) 

は、この層の書き込みを一時停止するにはあまりにも

がシーンにレイヤを追加シーンにレイヤーを追加することを忘れgameLayerのすべてのノードは一時停止されますが、pauseLayerのすべてのノードは停止しません。私はニックの提案を試してみるだろうと確信している私の次の試合のために

func pauseGame() { 

    gameLayer.isPaused = true 
    pauseLayer.isHidden = false 
    gameLayer.physicsWorld.speed = 0 
    gameLayer.speed = 0.0 

} 

func unpauseGame() { 

    gameLayer.isPaused = false 
    pauseLayer.isHidden = true 
    // Whatever else you need to undo 

} 
関連する問題