
Композитор является официальным менеджером сцены в Corona SDK. Что это? Рассмотрим на примере приложения «Часы». В этом приложении TabBar в нижней части, позволяет переключаться между часами, таймером, Сикундомером. Каждая из этих утилит можно считать отдельной сценой в плане Composer. По существу, composer позволяет писать код для сцен в виде отдельных .lua файлов, по одному для каждой сцены. Затем она дает вам API для переключения сцен при необходимости.
Для быстрого старта можно использовать шаблон который представлен ниже. Но имейте в виду этот шаблон включает функции для всех возможнх событий.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
local composer = require( "composer" ) local scene = composer.newScene() -- ----------------------------------------------------------------------------------------------------------------- -- All code outside of the listener functions will only be executed ONCE unless "composer.removeScene()" is called. -- ----------------------------------------------------------------------------------------------------------------- -- local forward references should go here -- ------------------------------------------------------------------------------- -- "scene:create()" function scene:create( event ) local sceneGroup = self.view -- Initialize the scene here. -- Example: add display objects to "sceneGroup", add touch listeners, etc. end -- "scene:show()" function scene:show( event ) local sceneGroup = self.view local phase = event.phase if ( phase == "will" ) then -- Called when the scene is still off screen (but is about to come on screen). elseif ( phase == "did" ) then -- Called when the scene is now on screen. -- Insert code here to make the scene come alive. -- Example: start timers, begin animation, play audio, etc. end end -- "scene:hide()" function scene:hide( event ) local sceneGroup = self.view local phase = event.phase if ( phase == "will" ) then -- Called when the scene is on screen (but is about to go off screen). -- Insert code here to "pause" the scene. -- Example: stop timers, stop animation, stop audio, etc. elseif ( phase == "did" ) then -- Called immediately after scene goes off screen. end end -- "scene:destroy()" function scene:destroy( event ) local sceneGroup = self.view -- Called prior to the removal of scene's view ("sceneGroup"). -- Insert code here to clean up the scene. -- Example: remove display objects, save state, etc. end -- ------------------------------------------------------------------------------- -- Listener setup scene:addEventListener( "create", scene ) scene:addEventListener( "show", scene ) scene:addEventListener( "hide", scene ) scene:addEventListener( "destroy", scene ) -- ------------------------------------------------------------------------------- return scene |
В нашем приложении Часы мы будем использовать четыре отдельных .lua файла это:
1 2 3 4 |
clock.lua alarm.lua stopwatch.lua countdowntimer.lua |
Будьте внимательны старайтесь избегать имен файлов встроенных в библиотеки Corona SDK. Например, вы не должны называть сцены timer.lua
или physics.lua
. В приведенном выше примере, в нашем main.lua
будет использоваться widget.newTabBar () и будет содержать код для вызова различных функций composer.gotoScene () которая будет нас перенаправлять на ту сцену которую мы выберем в нижнем тап-баре. Если вы хотите, увидеть в действии как работает composer можете ознакомится с этим примером с GitHub это образец бизнес приложения с возможностью публикации через rss канал, фотогаллереей и бидео которая использует стрим канала с youtube, также ест карты.
Для игр вы можете использовать такую структуру:
1 2 3 4 5 6 7 |
Menu.lua - главное меню. gamecredits.lua - авторы приложения. gamehelp.lua - помощь. gamesettings.lua - настройки. game.lua - фактический код игры. gameover.lua - сцена, которая показывает итоговые балы и указывает на окочание игры. levelover.lua - промежуточный экран. |
Для запуска composer нам понадобится всего две строчки в main.lua
1 2 |
local composer = require( "composer" ) composer.gotoScene( "menu" ) |
Последняя строчка кода указывает что стартовым экраном является menu.lua
В меню мы можем расположить основную навигацию такую как, помощь gamehalp.lua и вести нас будет туда вот такая строчка
1 |
composer.gotoScene( "gamehelp" ) |
Для того чтобы создать сцену нам необходимо сделать запрос у composer на построение, выводится она такой строкой:
1 |
local scene = composer.newScene() |
Сама сцена состоит из трех частей:
1. Сам объект, который описывает состояние сцены и информацию о нем.
2. Визуальная составляющая сцены, аудио.
3. И конец сцены return scene, что является обязательным.
Существует четыре события при помощи которых composer управляет структурой сцены это:
scene:create() — Композитор позволяет вам покаать сцену, но ее еще не существует.
scene:show() — Это событие срабатывает два раза, первый раз когда сцена готовится (will) к показу и второй когда ота выводится на экран (did).
scene:hide() — Так же как scene:show() выводится два раза.
scene:destroy() — Это событие полностью разрушает сцену.
В файле сцены событие содержит уникальную функцию. Далее приведен примет работы этих функций.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
function scene:create( event ) local sceneGroup = self.view end function scene:show( event ) local sceneGroup = self.view local phase = event.phase if ( phase == "will" ) then elseif ( phase == "did" ) then end end function scene:hide( event ) local sceneGroup = self.view local phase = event.phase if ( phase == "will" ) then elseif ( phase == "did" ) then end end function scene:destroy( event ) local sceneGroup = self.view end scene:addEventListener( "create", scene ) scene:addEventListener( "show", scene ) scene:addEventListener( "hide", scene ) scene:addEventListener( "destroy", scene ) |
Тепперь расмотрим каждое событиее более подробно.
scene:create()
В этой части мы распологаем всу графическую состовляющую контента так же аудио.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
local composer = require( "composer" ) local scene = composer.newScene() function scene:create( event ) local sceneGroup = self.view -- Добовляем в сцену здесь. -- Например можно добавит "sceneGroup". end scene:addEventListener( "create", scene ) return scene |
scene:show()
Как мы уже знаем состоит из двух фаз will и did, если мы наш код размещаем в области will то функция create не будет выполнятся снова, а если мы размести наш код в области did то это означает что это событие свершилось и здесь можно размещать такие элементы как таймер или остановить физику.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
local composer = require( "composer" ) local scene = composer.newScene() function scene:show( event ) local sceneGroup = self.view local phase = event.phase if ( phase == "will" ) then -- Сцена готовится к показу. elseif ( phase == "did" ) then -- Сцена уже на экране. -- Вставленный код начинает работать. -- Например, анимация, таймер. end end scene:addEventListener( "show", scene ) return scene |
scene:hide()
В этой части размещаются элементы которые мы хоти м остановить или скрыть. Работает полностью в тандеме с функцией show.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
local composer = require( "composer" ) local scene = composer.newScene() function scene:hide( event ) local sceneGroup = self.view local phase = event.phase if ( event.phase == "will" ) then -- Вызывается когда пользователь готов перейти на другой экран. elseif ( phase == "did" ) then -- Вызывается после пеерехода на другой экран. end end scene:addEventListener( "hide", scene ) return scene |
scene:destroy()
Применяется для полного уничтожения сцены всвязи с контролем памяти. Желательно утилизировать все объекты и аудио.
1 2 3 4 5 6 |
function scene:destroy( event ) local sceneGroup = self.view -- Вставляются элементы которые нужно удалить. end |
В других статьях мы продолжим разбираться с composer api. Спасибо за внимание