Scenekit - несколько оверлейных экранов - PullRequest
0 голосов
/ 26 мая 2020

Вчера выложил с айпада этот вопрос и понял, что ужасно получилось. Итак, сегодня я публикую это снова, надеясь лучше понять мою проблему. Я пишу приложение для 3D-игры, используя SceneKit для отображения всей сцены и наложение SpriteKit для отображения элементов управления. Я почти закончил с игровой функцией basi c, и теперь мне нужно добавить экран меню. На этом этапе лучше выбрать соответствующие аспекты разработки, но позже это будет экран главного меню для выбора различных игровых параметров. Вкратце: типичный экран меню. Я подумал, что мне нужно использовать те же учетные данные, что и в игровой сцене, так как есть главный герой, которого можно увидеть со всех точек зрения, возможный уровень (также в 3D), а затем, конечно же, кнопки для pu sh, чтобы выбрать . Итак, опять же, требуется наложение между SceneKit и SpriteKit, а также способ переключения между двумя сценами с разными SceneKit и наложенным содержимым. Но это не работает так, как я думал. И мне сложно понять, почему это не так. Переключатель, который я пытаюсь выполнить, sh использует «настоящее с переходом», и он работает - я вижу анимацию. Только после этого я получаю консольную ошибку «сцена изменена с помощью обратного вызова рендеринга», хотя я думал, что аргумент «присутствует» отключит предыдущую сцену и активирует новую. Во-вторых, я не понимаю, как наложение SpriteKit переключается с первого на второе наложение. (Конечно, экран меню должен быть вставлен перед сценой игры, но это ничего не меняет в моей проблеме, которая заключается в переключении между ними.) Вот код, который я использую для отображения меню сцена:

    self.sceneView.scene = MenuScene()
    self.view.addSubview(self.sceneView)
    self.spriteMenuScene = MenuOLScene(size: self.view.bounds.size)
    self.sceneView.overlaySKScene = self.spriteMenuScene
    self.sceneView.delegate = self                                                      
    self.sceneView.scene?.physicsWorld.contactDelegate = self

Затем, когда нажата кнопка воспроизведения, я пытаюсь приостановить активную сцену (и приостановить сковерлей) и выполнить переход кроссфейда (и, возможно, стереть сковерлей, чтобы установить новый one):

    let transition = SKTransition.crossFade(withDuration: 0.5)
    self.sceneView.present(MainScene(), with: transition, incomingPointOfView: nil, completionHandler: {
        MainScene().isPaused = false})

И, как я уже упоминал, я получаю сообщение об ошибке: «Не разрешено изменять сцену et c. и может привести к cra sh ', что и произойдет вскоре после этого. Я никогда не доходил до того, чтобы установить новый сковерлей.

Теперь я отчаянно ищу помощи, чтобы описать стабильный способ выполнения sh этого стандартного требования любой 3D-игры. Если у кого-то есть эти ценные знания, поделитесь, пожалуйста, со мной.

...