#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 /