«didRemoveListeners» (нулевое значение) при вызове storyboard: purge/removeScene. Как добавить / удалить DisplayObject через scene.view?

#android #iphone #lua #coronasdk #corona-storyboard

#Android #iPhone #lua #coronasdk #corona-раскадровка

Вопрос:

Мне нужна помощь с моим маленьким проектом здесь…

У меня есть игра с двумя сценами (меню и игра), и я не могу корректно изменять сцены. Моя главная проблема в том, что я не могу удалить всю свою сцену.правильно просматривать DisplayObjects, поскольку storyboard.purgeScene («игра») генерирует эту ошибку:

 "didRemoveListeners" (a nil value)
  

Вот объясненный мой код:

  • В «Сцене меню» я вызываю storyboard.goToScene("game")
  • Внутри CreateScene в «game» я создаю свои DisplayObject и вставляю их в GroupView ( scene.view )
  • Далее в моем коде я создаю различные DisplayObjects (шары) с физикой и добавляю их в scene.view через

     stageGroupView:insert(ball)
      

    stageGroupView объявлена ли локальная переменная поверх модуля, назначенного display.getCurrentStage( ) в createScene «игры»

  • Когда в моих детекторах столкновений выполняется условие, я вызываю goToScene («меню»), которое, если я правильно понял, запускает прослушиватель exitScene моей сцены «игры».

  • Внутри «exitScene» я удаляю всех своих слушателей и таймеры
  • Внутри «didExitScene» я пытался очистить / удалить сцену, но каждый раз я получаю вышеупомянутую ошибку времени выполнения.

На этом этапе, если я оставлю didExitScene пустым, раскадровка выполнит свою работу, кроме игровой сцены.просмотр не стирается. Я просто хочу знать эффективный способ добавления динамически созданного DisplayObject в мою сцену.просмотреть и иметь возможность очистить / удалить мою сцену без ошибок во время выполнения.

Вот некоторые части моего кода для лучшего понимания:

 local function addBall(ball)
     stageGroupView:insert(ball)
end

function scene:exitScene( event )
local group = self.view

timer.cancel( spawnTimer )
timer.cancel( gameTimer )

background:removeEventListener( "touch", onTouch )
player:removeEventListener( "touch", onTouch )
player:removeEventListener( "collision", onPlayerCollision )
bottomBorder:removeEventListener( "collision", onBottomBorderCollision )
rightBorder:removeEventListener( "collision", onRightBorderCollision )
end


function scene:didExitScene(event)

--local group = self.view
--group:removeSelf()
storyboard.purgeScene( "game" )

end
  

Как вы можете видеть, я даже попробовал group: removeSelf(), чтобы стереть мою scene.view, но с незначительными результатами… Появляется другая ошибка времени выполнения, вызванная goToScene «menu» («игра»), как только я выхожу и повторно вхожу в сцену «game»:

неверный аргумент #-2 для ‘insert» (ожидаемый прокси, получил nil) в функции ‘insert’?:в функции ‘goToScene’ в menu.lua.

Комментарии:

1. Пожалуйста, покажите didRemoveScene функцию и откуда она вызывается.

2. @Schollii Прошу прощения, я допустил ошибку в вопросе. Функция didRemoveScene не существует в моем коде, это была своего рода опечатка для didExitScene, которая является истинным местом, где я пытаюсь удалить / очистить игровую сцену. — (Отредактировал вопрос!)

3. Тогда, пожалуйста, исправьте свой пост и исправьте форматирование кода с таким отступом.

4. В вашем сообщении все еще есть 2 ссылки на didRemoveListeners (заголовок и сообщение об ошибке, я мог бы заменить, но я бы не хотел ничего портить).

Ответ №1:

Я прошу вас вызвать storyboard.removeScene (MenuScene), прежде чем вызывать игровую сцену. Не используйте сцену очистки, поскольку это не освободит всю память. Убедитесь, что все ваши отображаемые объекты вставлены в self.view. Любые сомнения относительно сцены очистки и удаления сцены проверьте это здесь :http://coronalabs.com/blog/2012/07/31/storyboard-scene-purging-vs-removal /