Попытка отобразить кнопку возобновления после приостановки игровой сцены на SpriteKit
Я работаю с Xcode 8 и Swift 3, пытаясь отобразить кнопку "Возобновить игру" на моей сцене после приостановки игры, но, поскольку все останавливается, я не нашел способа сделать это правильно. Я следовал совету Mike на этой странице "Нажмите, чтобы возобновить". Приостановите текст 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 к запуску и перемещению выше, но мне кажется, что это немного усложняет ситуацию.
Любые предложения о том, как я могу отобразить кнопку "Возобновить" при приостановке сцены?
2 ответа
Для моей следующей игры я уверен, что попробую предложение Ника. Что касается моей проблемы выше, она работала с использованием кода, показанного ниже. Дополнительный код должен также отменить кнопку паузы. Теперь, когда это работает, я могу добавить действия 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
}
}
Вы не можете взаимодействовать с какими-либо узлами на вашей сцене, потому что вы полностью приостановили ее, что ставит на паузу все ее дочерние элементы, то есть все на сцене. Чтобы избежать этого, пауза только определенная SKNode
s (слои).
Добавить определенные узлы в разные SKNode
Поэтому вместо приостановки всей сцены вы можете приостановить только слой (SKNode), который хотите приостановить (gameLayer). Это будет выглядеть примерно так:
Инициализировать узлы
let gameLayer = SKNode()
let pauseLayer = SKNode()
Теперь, когда вы хотите добавить дочерний элемент в сцену, вместо этого добавьте его в слой, частью которого вы хотите, чтобы он был:
Добавить дочерние узлы в основные слои
gameLayer.addChild(gameSceneNode)
pauseLayer.addChild(resumeButton)
Не забудьте добавить слои на сцену тоже
Добавьте слои на сцену
addChild(gameLayer)
addChild(pauseLayer)
Чтобы приостановить слой, напишите это:
gameLayer.isPaused = true
Обратите внимание, что в этом примере все узлы на 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
}