Как эффективно приостановить игру в 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 на основе касания
  • iOS реальное устройство получает EXC_BAD_ACCESS, когда runAction на узле
  • Spritekit: как заставить экран игрового экрана двигаться вверх, поскольку узел «прыгает» вдоль оси y?
  • AdMob Interstitial каждая пятая игра
  • Есть ли способ программирования игр без зависимости от частоты кадров?
  • Как я могу узнать, является ли SKTexture образ заполнителя
  • Как вы используете SKTextureFilteringNearest с SKTextureAtlas
  • SpriteKit: добавьте UIGestureRecognizer и определите, какой узел был взят
  • Spritekit: Разделение случайно расположенных нединамических «блочных» узлов на множество значений X и Y?
  • Создание уровней в iOS Sprite Kit Game
  • Изменить позицию SKSpriteNode с физическим
  • Interesting Posts

    Прокрутка программно UITableView с ускорением и замедлением

    Как загрузить CSV-файл с сервера в Objective-C

    IPv6 – Apple отклоняет приложение iOS

    XMPPFramework – подключение через SSL на Openfire

    Несколько делегатов для UITableView в быстром

    Firebase querying – я получаю некоторый тип NSArray как результат (только иногда)

    NSXMLParser останавливает синтаксический анализ после встречи с особым символом

    ПодготовитьToRecord crashing

    Как добавить пользовательский образ в страницуИндикатор в Swift?

    отображать данные из sqlite на ярлык с использованием FMDB

    Должен ли я использовать основные данные или нет?

    Каков правильный способ проверки допустимого IAP с сервером Apple?

    Swift 3 – Alamofilre 4.0 многостраничная загрузка изображения с прогрессом

    Моя кнопка местоположения не отображается (Google maps SDK, ios)

    Установка фона UILabel (проблема прозрачности с .png-файлами)

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