2017-01-16 14 views
0

Xcode 8 및 Swift 3에서 게임 일시 중지 후 "게임 재개"버튼을 표시하려고하지만 모든 것이 멈추었 기 때문에 제대로 할 수있는 방법을 찾지 못했습니다. 나는이 페이지 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 노드의 일부와 상호 작용할 수 있습니다. 우주 사수 게임에 종사하고있어 사용자가 여전히 우주선을 움직일 수 있고 총알이 움직이지 않아도 장면을 다시 시작할 때까지 도청 할 수 있습니다.

일시 정지 기능에 부울 "참"을 추가하고 위의 설명과 발사에 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 

}