Как эффективно приостановить игру в spritekit?

Это похоже на такую ​​базовую концепцию, но на самом деле нет хорошего ответа.

В настоящее время у меня довольно простая настройка, на сцене моей игры у меня есть enum gameState который в настоящее время либо inGame либо gamePaused .

У меня установлена ​​моя кнопка, и у меня это так просто, просто переключает gameState .

Затем, чтобы заставить его работать, у меня есть два отдельных метода обновления: один для того, когда gamePaused , один для когда inGame .

Это работает на 95% моей игры, так как обновления в моей игре можно легко запустить и остановить без каких-либо проблем. Есть некоторые проблемы, которые я не могу решить.

Прежде всего, это действия. Я использую SKActions для небольшого моего проекта (некоторое перемещение, масштабирование, выцветание …), и этот метод НЕ приостанавливает их. В некоторых случаях это может быть катастрофическим. Во-вторых, это не обрабатывает частицы, физику и некоторые другие вещи, которые напрямую не связаны с моими методами обновления.

Единственный ключ, который у меня есть, – self.view.paused = YES , но это тоже не сработает.

Во-первых, это МОЖЕТ исправить мои действия, частицы и физическую проблему … kinda. Но этот вопрос говорит о том, что SKActions самом деле НЕ РАСПРОСТРАНЕНЫ этим, но на самом деле полностью остановились. Это правда? Если да, то это не будет работать гладко, потому что мои действия выбрасываются из-под удара.

Кроме того, приостановка представления, похоже, делает то, что он говорит: прекратите все. ВСЕ. Вопрос с новичком здесь, но как я должен получить код для запуска в этот момент? Все отрезано. Это где мне нужны subViews ? Я еще никогда не использовал subView , но это похоже на то, что я хочу в этом случае.

Проще говоря, для меня есть много неотвеченных вопросов, и я не знаю, как действовать дальше. Я надеюсь, что существует некоторая «стандартная процедура» для приостановки работы в Sprite Kit , но, приостанавливая действия, останавливающие просмотр, я действительно не знаю, с чего начать.

Должен ли я отойти от использования действий? Является ли мое представление о приостановке звука subView ?

Я не хочу лепет, все, что я хочу знать, – это то, как вы делаете паузу в своем среднем проекте Sprite Kit . Дополнительная информация предоставляется по запросу.

6 Solutions collect form web for “Как эффективно приостановить игру в spritekit?”

Приостановка узла приостанавливает (не останавливает) действия узла, и я предполагаю, что пауза будет также применяться ко всем дочерним элементам приостановленного узла таким же образом. Все остальные неустановленные узлы будут продолжать выполнять свои действия до завершения.

У вас должен быть узел «игрового слоя» со всеми игровыми узлами в них, которые вы хотите приостановить, а затем просто приостановите узел «игрового слоя». Затем у вас есть узел «пауза в игровом меню», в котором вы добавляете все необходимые пункты меню паузы, которые будут продолжать нормально функционировать, даже если игровой слой приостановлен.

Будьте уверены, что вы не используете performSelector или NSTimer или GCD или любые другие методы планирования помимо действий или обновления: метод, потому что они не будут придерживаться приостановленного состояния узла.

Приостановка представления эффективно замораживает все в нем, приостановка сцены по мнению некоторых не приостанавливает обновление: звонки – но я не проверял это сам. Если это так, вы всегда можете проверить внутри метода обновления, приостановлен ли данный узел, на который вы отправляете сообщение, и если это так, решите не отправлять определенные сообщения этому узлу.

Я только что назвал функцию карты для всех дочерних элементов сцены и установил свойство paused равным true

 self.children.map{($0 as SKNode).paused = false} 

Установив его в true, вы можете легко отменить замораживание.

EDIT: лучше использовать for-loop для повторения над детьми.

 for node in self.children as [SKNode] { node.paused = false } 

Я могу рассказать вам, что я сделал в своей игре:

  1. Пауза SKView на -applicationWillResignActive: (или эквивалент, используя NSNotification s),

  2. Un-pause SKView on -applicationDidBecomeActive: (или эквивалент, используя NSNotification s),

Только для реальной игровой сцены я устанавливаю логический флаг _isPaused при _isPaused активной, и если это правда, я просто -update: метод -update: (обновления фреймов). (Я также показываю «приостановленное» меню, когда пользователь возобновляет приложение).

… Но моя игра – простая игра-головоломка, и нет длинных действий, которые должны продолжаться после паузы / резюме. Я не могу подтвердить прямо сейчас, что все действия прерваны, но я думаю, что это не так.

Я также использовал self.children.map{($0 as SKNode).paused = false} и он работает, если вы создаете var-тип типа SKSpriteNode и добавляете его поверх сцены. Но у меня также есть NSTimer, который я использую для создания спрайтов на сцене. Все, что сейчас находится на сцене, приостановлено, но спрайты продолжают появляться и перемещаться по экрану. Это не останавливает нереста.

Я попытался приостановить NSTimer, когда я вызываю вышеуказанный код, устанавливая повторы на false, а затем устанавливая его в true, когда я удаляю слой, но он не работает. Я также пробовал self.scene?.view?.paused = true но это замирает, и слой, который я создаю, даже не появляется на экране.

Вы должны установить делегат для представления!

 func PauseGame(){ self.scene.view.paused = true } fun playGame(){ self.scene.pause = false } 

Эта функция работает отлично, если вы не используете NSTimer для вызова функции. Если вы используете NSTimer, ваше представление будет прекрасным, но когда вы снова играете в игру с помощью игровых функций, вы увидите, что все функции, которые используют функцию NSTimer, которая работает в задней части, и ваш экран заполнены вашими sprite-kits . Поэтому, когда вы используете NSTimer в функции, вы должны сначала приостановить функции NSTimer, после чего эта функция работает отлично.

 //For Pause func pauseGame() { scene?.view?.paused = true } //For play. func playGame() { scene?.view?.paused = false } 
  • SKSpriteNode с изображением не будет окрашиваться
  • Восстановление Sprite Kit?
  • Ошибка: не удалось получить устройство ввода по умолчанию ... при работе на симуляторе
  • Правильный способ создания кнопки в Sprite Kit?
  • iOS Sprite Kit - свойство SKCpriteNode .CenterRect не работает
  • Как SceneKit не работает на весь экран
  • Sprite Kit - перемещение объекта в положение касания
  • Перемещение действий во время анимации
  • SKSpriteNode с UIImage из URL
  • Редактор сценария Sprite Kit GameScene.sks ширина и высота сцены
  • набор спрайтов - один узел с двумя физическими телами
  • Interesting Posts

    WKWebView зависает при загрузке локальной веб-страницы с определенной настройкой сети.

    iOS не может установить цвет фона для FXBlurView

    UINavigationController не отображает изображение пользовательской обратной кнопки на одном экране

    Как изменить цвет UIDatePicker?

    UIActivityViewController в iOS 7

    как получить контакты с помощью API адресной книги в программировании ios?

    Как установить уровень журнала на iOS 10?

    Как загрузить изображение для продукта с использованием API и установить свойства продукта в Spree в приложении iOS

    Изменение цвета и стиля текста шрифта кнопки UISearchBar

    AVplayer полностью удаляет видео из памяти

    Компиляция libical для armv7 и arm64 с cmake

    Контактная информация для пользователя iPhone

    Поставщик хранилища. Невозможно перечислить сборщики документов в режиме экспорта / перемещения, так как бета4

    Где удалить наблюдателя для NSNotification в Свифт?

    Как загрузить сцену в раскадровке с контроллера вида

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.