SKScene перестает отвечать на запросы, находясь в режиме ожидания

Здравствуйте, у меня есть игра SceneKit. Весь игровой процесс ведется в одной сцене, и когда игра заканчивается, наложение спрайт-набора действует как экран игры, и когда они снова попадают в игру, метки спрайт-набора исчезают, и игра сбрасывает все в одной и той же сцене.

Мой выпуск в игре окончен. Если пользователь нажимает кнопку воспроизведения в течение нескольких секунд, то все идет хорошо. Но если пользователь сидит в игре более 5 секунд, то сцена останавливается. Я действительно запутался, поскольку приложение бездействует, когда оно зависает, и я не получаю ошибок. Кроме того, использование памяти и ЦП во время игры значительно ниже, чем во время игры. Кроме того, само это приложение не заморожено, как будто я нажимаю кнопку меню, оно просто прекрасно переходит на новый контроллер представления.

Без утечек памяти или ошибок я действительно понятия не имею, с чего начать искать что-то не так? Может ли кто-то указать мне в правильном направлении

Еще немного понимания происходящего: игра представляет собой короткую полуминутную игру, в которой используется симуляция физики. Таймер срабатывает каждые 0,01 секунды, что влияет на ход игры. Когда игра окончена (вызвана столкновением одного узла с другим), узел игрока удаляется, для переменной устанавливается значение false, чтобы при срабатывании таймера игры ничего не происходило, а в оверлейном наборе спрайтов создавалось множество узлов меток, которые выступать в качестве игры над меню.

Опять же, все отлично работает, если пользователь нажимает кнопку воспроизведения в течение пяти секунд. Нажатие на воспроизведение скрывает все метки, создает узел игроков в начальной позиции и устанавливает для переменной таймеров значение true.

Вот код для настройки сцены

// create a new scene
scene = SCNScene()
sceneView = SCNView()
sceneView.frame = self.view.frame
sceneView.autoresizingMask = UIViewAutoresizing.allZeros
sceneView.scene = scene
sceneView.autoenablesDefaultLighting = false
sceneView.allowsCameraControl = false
sceneView.showsStatistics = false
sceneView.backgroundColor = UIColor.blackColor()
scene.physicsWorld.gravity = SCNVector3Make(0, -30, 0)
scene.physicsWorld.contactDelegate = self
self.view = sceneView
self.MarbleGeo = SCNSphere(radius: 1.3)
hud = Hud(size: self.view.frame.size, game: self)
sceneView.overlaySKScene = hud

редактировать

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

println("Before check")
MenuLabel.runAction(moveButtonsOut, completion: { () -> Void in
    self.scoreLabel.removeFromParent()
    self.MyGame.Setup()
    self.MyGame.Restart(true, Level: self.MyGame.level)
    self.startTimer()
    println("should have called the game to begin by now")
    //self.playing = true
    //self.MyGame.addMarble()
})

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

редактировать

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

Надеюсь это поможет.

1 ответ

Решение

Ваша сцена SceneKit играет? Сцена играет, когда у вас есть

  • scene.playing = YES
  • SCNAction экземпляры бега
  • неявная или явная анимация

Наложение сцены SpriteKit обновляется, только когда сцена SceneKit. Поэтому, если сцена SceneKit не отображается повторно, действия, установленные в оверлее, могут не выполняться.

Решением может быть установка playing свойство или добавить действия к объектам SceneKit вместо объектов SpriteKit.

Это не связано, но старайтесь держаться подальше от таймеров. SceneKit предоставляет несколько обратных вызовов игрового цикла, которые позволят вам делать то, что вы хотите.

Другие вопросы по тегам