Storyboard & Display Objects

Hello All,

I have been playing around with storyboard for the past couple of days and I have a few doubts.

I have a scene game.lua which has an array of display objects which will be updated every frame. When I switch to a different scene and come back to the game scene all the display objects doesn’t seem to reset to its original position IF the loadLevel()  is called from scene:createScene(). However it seems to reset all the positions fine when the loadLevel() is called from scene:enterScene( event ).

Any idea why this happens? Any help would be really apprecieated! 

– game.lua

local storyboard = require("storyboard") local scene = storyboard.newScene() local collectable = require("collectable") local obstacle = require("obstacle") local physics = require "physics" physics.start(); physics.pause( ) local function loadLevel(level)     local group = scene.view     local levelData = require("Levels.level" .. level)     local items = levelData.collectables     local obs = levelData.obstacles     for i=1,#items do         local item = collectable.new(i, items[i].x, items[i].y)         table.insert(collectables, item)         group:insert(collectables[i].renderObject)     end     for i=1,#obs do         local ob = obstacle.new(obs[i].x, obs[i].y)         table.insert(obstacles, ob)         group:insert(obstacles[i].renderObject)     end end function scene:createScene( event )     local group = self.view     -- loadLevel(currentLevel)    -- Doesn't reset the positions end function scene:enterScene( event )     local group = self.view     physics.start();     loadLevel(currentLevel)    -- Works fine end  

– menu.lua

function scene:enterScene( event )     local group = self.view     local previous = storyboard.getPrevious()     if previous ~= "main" and previous then               storyboard.removeScene(previous)     end     storyboard.gotoScene( "game", "fade", 500 ) end  

Are you removing the game scene when you move to another scene? It would seem it is staying in memory, and when you return the createScene function is not called - this is only called when the scene does not yet exist in memory. enterScene is called each time you go to the scene.

I see you have some code in menu.lua to remove the previous scene - but is this code in all scenes?

Hello Nick

Thanks for your reply. The createScene function is called when the game scene is called from menu. I still couldn’t find whats causing this. I have posted all the files for your perusual. Any help would be really helpful. Thanks

– game.lua

--------------------------------------------------------------------------------------- -- Requires ----------------------------------------------------------------------------------------- local storyboard = require("storyboard") local scene = storyboard.newScene() local collectable = require("collectable") local physics = require "physics" physics.start(); physics.pause( ) ----------------------------------------------------------------------------------------- -- Globals Variables ----------------------------------------------------------------------------------------- local currentLevel = 1 local prevTime = 0 local collectables = {} local screenW = display.contentWidth local screenH = display.contentHeight local halfW = display.contentWidth\*0.5 ----------------------------------------------------------------------------------------- -- Local Functions for this scene ----------------------------------------------------------------------------------------- local function loadLevel(level) &nbsp;&nbsp;&nbsp;&nbsp;local group = scene.view &nbsp;&nbsp;&nbsp;&nbsp;local levelData = require("Levels.level" .. level) &nbsp;&nbsp;&nbsp;&nbsp;local items = levelData.collectables &nbsp;&nbsp;&nbsp;&nbsp;local obs = levelData.obstacles &nbsp;&nbsp;&nbsp;&nbsp;for i=1,#items do &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local item = collectable.new(i, items[i].x, items[i].y) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.insert(collectables, item) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;group:insert(collectables[i].renderObject) &nbsp;&nbsp;&nbsp;&nbsp;end end ----------------------------------------------------------------------------------------- -- Scene Functions ----------------------------------------------------------------------------------------- -- Called when the scene's view does not exist: function scene:createScene( event ) &nbsp;&nbsp;&nbsp;&nbsp;local group = self.view &nbsp;&nbsp;&nbsp;&nbsp;--loadLevel(currentLevel)&nbsp;&nbsp;&nbsp;&nbsp; -- Doesn't Work here end -- Called immediately after scene has moved onscreen: function scene:enterScene( event ) &nbsp;&nbsp;&nbsp;&nbsp;local group = self.view &nbsp;&nbsp;&nbsp;&nbsp;physics.start(); &nbsp;&nbsp;&nbsp;&nbsp;loadLevel(currentLevel)&nbsp;&nbsp;&nbsp;&nbsp;-- Workd here end local function enterFrame(event) &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;print("enterFrame" ) &nbsp;&nbsp;&nbsp;&nbsp;local curTime = event.time &nbsp;&nbsp;&nbsp;&nbsp;local dt = (curTime - prevTime) /(1000) &nbsp;&nbsp;&nbsp;&nbsp;prevTime = curTime &nbsp;&nbsp;&nbsp;&nbsp;local i = 1 &nbsp;&nbsp;&nbsp;&nbsp;while i \<= #collectables do &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;collectables[i]:update(dt) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(collectables[i]:checkwithinbounds()) then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = i + 1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;collectables[i]:destroy() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.remove(collectables,i) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end &nbsp;&nbsp;&nbsp;&nbsp;end end function ChangeScene( event ) &nbsp;&nbsp;&nbsp;&nbsp;storyboard.gotoScene( "menu", "fade", 500 ) end -- Called when scene is about to move offscreen: function scene:exitScene( event ) &nbsp;&nbsp;&nbsp;&nbsp;local group = self.view &nbsp;&nbsp;&nbsp;&nbsp;Runtime:removeEventListener( "enterFrame", enterFrame ) &nbsp;&nbsp;&nbsp;&nbsp;Runtime:removeEventListener("tap", ChangeScene ) end -- If scene's view is removed, scene:destroyScene() will be called just prior to: function scene:destroyScene( event ) &nbsp;&nbsp;&nbsp;&nbsp;local group = self.view &nbsp;&nbsp;&nbsp;&nbsp;package.loaded[physics] = nil &nbsp;&nbsp;&nbsp;&nbsp;physics = nil end ----------------------------------------------------------------------------------------- -- Add Event Listners ----------------------------------------------------------------------------------------- scene:addEventListener( "createScene", scene ) scene:addEventListener( "enterScene", scene ) scene:addEventListener( "exitScene", scene ) scene:addEventListener( "destroyScene", scene ) Runtime:addEventListener( "enterFrame", enterFrame ) Runtime:addEventListener( "tap", ChangeScene ) ----------------------------------------------------------------------------------------- return scene &nbsp;

– menu.lua

local storyboard = require( "storyboard" ) local scene = storyboard.newScene() -- include Corona's "widget" library local widget = require "widget" -------------------------------------------- -- forward declarations and other locals local playBtn -- 'onRelease' event listener for playBtn local function onPlayBtnRelease() &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;-- go to level1.lua scene &nbsp;&nbsp;&nbsp;&nbsp;--storyboard.removeScene( "game" ) &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;storyboard.gotoScene( "game", "fade", 500 ) &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;return true&nbsp;&nbsp;&nbsp;&nbsp;-- indicates successful touch end ----------------------------------------------------------------------------------------- -- BEGINNING OF YOUR IMPLEMENTATION --&nbsp; -- NOTE: Code outside of listener functions (below) will only be executed once, --&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unless storyboard.removeScene() is called. --&nbsp; ----------------------------------------------------------------------------------------- -- Called when the scene's view does not exist: function scene:createScene( event ) &nbsp;&nbsp;&nbsp;&nbsp;local group = self.view &nbsp;&nbsp;&nbsp;&nbsp;-- display a background image &nbsp;&nbsp;&nbsp;&nbsp;local background = display.newImageRect( "background.jpg", display.contentWidth, display.contentHeight ) &nbsp;&nbsp;&nbsp;&nbsp;background.anchorX = 0 &nbsp;&nbsp;&nbsp;&nbsp;background.anchorY = 0 &nbsp;&nbsp;&nbsp;&nbsp;background.x, background.y = 0, 0 &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;-- create/position logo/title image on upper-half of the screen &nbsp;&nbsp;&nbsp;&nbsp;local titleLogo = display.newImageRect( "logo.png", 264, 42 ) &nbsp;&nbsp;&nbsp;&nbsp;titleLogo.x = display.contentWidth \* 0.5 &nbsp;&nbsp;&nbsp;&nbsp;titleLogo.y = 100 &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;-- create a widget button (which will loads level1.lua on release) &nbsp;&nbsp;&nbsp;&nbsp;playBtn = widget.newButton{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label="Play Now", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;labelColor = { default={255}, over={128} }, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default="button.png", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;over="button-over.png", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width=154, height=40, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onRelease = onPlayBtnRelease&nbsp;&nbsp;&nbsp;&nbsp;-- event listener function &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;playBtn.x = display.contentWidth\*0.5 &nbsp;&nbsp;&nbsp;&nbsp;playBtn.y = display.contentHeight - 125 &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;-- all display objects must be inserted into group &nbsp;&nbsp;&nbsp;&nbsp;group:insert( background ) &nbsp;&nbsp;&nbsp;&nbsp;group:insert( titleLogo ) &nbsp;&nbsp;&nbsp;&nbsp;group:insert( playBtn ) end -- Called immediately after scene has moved onscreen: function scene:enterScene( event ) &nbsp;&nbsp;&nbsp;&nbsp;local group = self.view &nbsp;&nbsp;&nbsp;&nbsp;local previous = storyboard.getPrevious() if previous ~= "main" and previous then &nbsp; &nbsp; &nbsp; storyboard.removeScene(previous) end &nbsp;&nbsp;&nbsp;&nbsp;-- INSERT code here (e.g. start timers, load audio, start listeners, etc.) &nbsp;&nbsp;&nbsp;&nbsp; end -- Called when scene is about to move offscreen: function scene:exitScene( event ) &nbsp;&nbsp;&nbsp;&nbsp;local group = self.view &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;-- INSERT code here (e.g. stop timers, remove listenets, unload sounds, etc.) &nbsp;&nbsp;&nbsp;&nbsp; end -- If scene's view is removed, scene:destroyScene() will be called just prior to: function scene:destroyScene( event ) &nbsp;&nbsp;&nbsp;&nbsp;local group = self.view &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;if playBtn then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;playBtn:removeSelf()&nbsp;&nbsp;&nbsp;&nbsp;-- widgets must be manually removed &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;playBtn = nil &nbsp;&nbsp;&nbsp;&nbsp;end end ----------------------------------------------------------------------------------------- -- END OF YOUR IMPLEMENTATION ----------------------------------------------------------------------------------------- -- "createScene" event is dispatched if scene's view does not exist scene:addEventListener( "createScene", scene ) -- "enterScene" event is dispatched whenever scene transition has finished scene:addEventListener( "enterScene", scene ) -- "exitScene" event is dispatched whenever before next scene's transition begins scene:addEventListener( "exitScene", scene ) -- "destroyScene" event is dispatched before view is unloaded, which can be -- automatically unloaded in low memory situations, or explicitly via a call to -- storyboard.purgeScene() or storyboard.removeScene(). scene:addEventListener( "destroyScene", scene ) ----------------------------------------------------------------------------------------- return scene &nbsp;

– collectable.lua

local collectable = {} local collectable\_mt = {\_\_index = collectable} ----------------------------------------------------------------------------------------- -- Private Functions ----------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------- -- Public Functions ----------------------------------------------------------------------------------------- function collectable.new( \_id, \_x, \_y) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;local newCollectable = { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderObject = display.newImageRect("Assets/coin.png", 75, 75), &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;physics.addBody(newCollectable.renderObject, "static", { density=73.0, friction=0.3, bounce=0.3 }) &nbsp;&nbsp;&nbsp;&nbsp;newCollectable.renderObject.x = \_x &nbsp;&nbsp;&nbsp;&nbsp;newCollectable.renderObject.y = \_y &nbsp;&nbsp;&nbsp;&nbsp;newCollectable.renderObject.name = "collectable" &nbsp;&nbsp;&nbsp;&nbsp;newCollectable.renderObject.id = \_id &nbsp;&nbsp;&nbsp;&nbsp;newCollectable.renderObject.isSensor = true &nbsp;&nbsp;&nbsp;&nbsp;return setmetatable( newCollectable, collectable\_mt ) end function collectable:translate(\_x, \_y) &nbsp;&nbsp;&nbsp;&nbsp;self.renderObject.x = self.renderObject.x - \_x &nbsp;&nbsp;&nbsp;&nbsp;self.renderObject.y = self.renderObject.y - \_y end function collectable:update(\_dt) &nbsp;&nbsp;&nbsp;&nbsp;local speed = 100 &nbsp;&nbsp;&nbsp;&nbsp;self.renderObject:translate(-(speed \* \_dt), 0) end function collectable:checkwithinbounds(\_dt) &nbsp;&nbsp;&nbsp;&nbsp;if (self.renderObject.x + 75/2 \<= 0) then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false &nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true &nbsp;&nbsp;&nbsp;&nbsp;end end function collectable:destroy() &nbsp;&nbsp;&nbsp;&nbsp;self.renderObject:removeSelf() &nbsp;&nbsp;&nbsp;&nbsp;self.renderObject = nil end return collectable &nbsp;

– level1.lua

local levelData = {}; levelData.collectables = { {x = 542, y = 262}, {x = 870, y = 262}, {x = 1030, y = 534}, {x = 1670, y = 166}, {x = 1878, y = 166}, } return levelData; &nbsp;

– main.lua 

-- hide the status bar display.setStatusBar( display.HiddenStatusBar ) -- include the Corona "storyboard" module local storyboard = require "storyboard" -- load menu screen storyboard.gotoScene( "menu" ) &nbsp;

Are you removing the game scene when you move to another scene? It would seem it is staying in memory, and when you return the createScene function is not called - this is only called when the scene does not yet exist in memory. enterScene is called each time you go to the scene.

I see you have some code in menu.lua to remove the previous scene - but is this code in all scenes?

Hello Nick

Thanks for your reply. The createScene function is called when the game scene is called from menu. I still couldn’t find whats causing this. I have posted all the files for your perusual. Any help would be really helpful. Thanks

– game.lua

--------------------------------------------------------------------------------------- -- Requires ----------------------------------------------------------------------------------------- local storyboard = require("storyboard") local scene = storyboard.newScene() local collectable = require("collectable") local physics = require "physics" physics.start(); physics.pause( ) ----------------------------------------------------------------------------------------- -- Globals Variables ----------------------------------------------------------------------------------------- local currentLevel = 1 local prevTime = 0 local collectables = {} local screenW = display.contentWidth local screenH = display.contentHeight local halfW = display.contentWidth\*0.5 ----------------------------------------------------------------------------------------- -- Local Functions for this scene ----------------------------------------------------------------------------------------- local function loadLevel(level) &nbsp;&nbsp;&nbsp;&nbsp;local group = scene.view &nbsp;&nbsp;&nbsp;&nbsp;local levelData = require("Levels.level" .. level) &nbsp;&nbsp;&nbsp;&nbsp;local items = levelData.collectables &nbsp;&nbsp;&nbsp;&nbsp;local obs = levelData.obstacles &nbsp;&nbsp;&nbsp;&nbsp;for i=1,#items do &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local item = collectable.new(i, items[i].x, items[i].y) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.insert(collectables, item) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;group:insert(collectables[i].renderObject) &nbsp;&nbsp;&nbsp;&nbsp;end end ----------------------------------------------------------------------------------------- -- Scene Functions ----------------------------------------------------------------------------------------- -- Called when the scene's view does not exist: function scene:createScene( event ) &nbsp;&nbsp;&nbsp;&nbsp;local group = self.view &nbsp;&nbsp;&nbsp;&nbsp;--loadLevel(currentLevel)&nbsp;&nbsp;&nbsp;&nbsp; -- Doesn't Work here end -- Called immediately after scene has moved onscreen: function scene:enterScene( event ) &nbsp;&nbsp;&nbsp;&nbsp;local group = self.view &nbsp;&nbsp;&nbsp;&nbsp;physics.start(); &nbsp;&nbsp;&nbsp;&nbsp;loadLevel(currentLevel)&nbsp;&nbsp;&nbsp;&nbsp;-- Workd here end local function enterFrame(event) &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;print("enterFrame" ) &nbsp;&nbsp;&nbsp;&nbsp;local curTime = event.time &nbsp;&nbsp;&nbsp;&nbsp;local dt = (curTime - prevTime) /(1000) &nbsp;&nbsp;&nbsp;&nbsp;prevTime = curTime &nbsp;&nbsp;&nbsp;&nbsp;local i = 1 &nbsp;&nbsp;&nbsp;&nbsp;while i \<= #collectables do &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;collectables[i]:update(dt) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(collectables[i]:checkwithinbounds()) then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = i + 1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;collectables[i]:destroy() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.remove(collectables,i) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end &nbsp;&nbsp;&nbsp;&nbsp;end end function ChangeScene( event ) &nbsp;&nbsp;&nbsp;&nbsp;storyboard.gotoScene( "menu", "fade", 500 ) end -- Called when scene is about to move offscreen: function scene:exitScene( event ) &nbsp;&nbsp;&nbsp;&nbsp;local group = self.view &nbsp;&nbsp;&nbsp;&nbsp;Runtime:removeEventListener( "enterFrame", enterFrame ) &nbsp;&nbsp;&nbsp;&nbsp;Runtime:removeEventListener("tap", ChangeScene ) end -- If scene's view is removed, scene:destroyScene() will be called just prior to: function scene:destroyScene( event ) &nbsp;&nbsp;&nbsp;&nbsp;local group = self.view &nbsp;&nbsp;&nbsp;&nbsp;package.loaded[physics] = nil &nbsp;&nbsp;&nbsp;&nbsp;physics = nil end ----------------------------------------------------------------------------------------- -- Add Event Listners ----------------------------------------------------------------------------------------- scene:addEventListener( "createScene", scene ) scene:addEventListener( "enterScene", scene ) scene:addEventListener( "exitScene", scene ) scene:addEventListener( "destroyScene", scene ) Runtime:addEventListener( "enterFrame", enterFrame ) Runtime:addEventListener( "tap", ChangeScene ) ----------------------------------------------------------------------------------------- return scene &nbsp;

– menu.lua

local storyboard = require( "storyboard" ) local scene = storyboard.newScene() -- include Corona's "widget" library local widget = require "widget" -------------------------------------------- -- forward declarations and other locals local playBtn -- 'onRelease' event listener for playBtn local function onPlayBtnRelease() &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;-- go to level1.lua scene &nbsp;&nbsp;&nbsp;&nbsp;--storyboard.removeScene( "game" ) &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;storyboard.gotoScene( "game", "fade", 500 ) &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;return true&nbsp;&nbsp;&nbsp;&nbsp;-- indicates successful touch end ----------------------------------------------------------------------------------------- -- BEGINNING OF YOUR IMPLEMENTATION --&nbsp; -- NOTE: Code outside of listener functions (below) will only be executed once, --&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unless storyboard.removeScene() is called. --&nbsp; ----------------------------------------------------------------------------------------- -- Called when the scene's view does not exist: function scene:createScene( event ) &nbsp;&nbsp;&nbsp;&nbsp;local group = self.view &nbsp;&nbsp;&nbsp;&nbsp;-- display a background image &nbsp;&nbsp;&nbsp;&nbsp;local background = display.newImageRect( "background.jpg", display.contentWidth, display.contentHeight ) &nbsp;&nbsp;&nbsp;&nbsp;background.anchorX = 0 &nbsp;&nbsp;&nbsp;&nbsp;background.anchorY = 0 &nbsp;&nbsp;&nbsp;&nbsp;background.x, background.y = 0, 0 &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;-- create/position logo/title image on upper-half of the screen &nbsp;&nbsp;&nbsp;&nbsp;local titleLogo = display.newImageRect( "logo.png", 264, 42 ) &nbsp;&nbsp;&nbsp;&nbsp;titleLogo.x = display.contentWidth \* 0.5 &nbsp;&nbsp;&nbsp;&nbsp;titleLogo.y = 100 &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;-- create a widget button (which will loads level1.lua on release) &nbsp;&nbsp;&nbsp;&nbsp;playBtn = widget.newButton{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label="Play Now", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;labelColor = { default={255}, over={128} }, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default="button.png", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;over="button-over.png", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width=154, height=40, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onRelease = onPlayBtnRelease&nbsp;&nbsp;&nbsp;&nbsp;-- event listener function &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;playBtn.x = display.contentWidth\*0.5 &nbsp;&nbsp;&nbsp;&nbsp;playBtn.y = display.contentHeight - 125 &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;-- all display objects must be inserted into group &nbsp;&nbsp;&nbsp;&nbsp;group:insert( background ) &nbsp;&nbsp;&nbsp;&nbsp;group:insert( titleLogo ) &nbsp;&nbsp;&nbsp;&nbsp;group:insert( playBtn ) end -- Called immediately after scene has moved onscreen: function scene:enterScene( event ) &nbsp;&nbsp;&nbsp;&nbsp;local group = self.view &nbsp;&nbsp;&nbsp;&nbsp;local previous = storyboard.getPrevious() if previous ~= "main" and previous then &nbsp; &nbsp; &nbsp; storyboard.removeScene(previous) end &nbsp;&nbsp;&nbsp;&nbsp;-- INSERT code here (e.g. start timers, load audio, start listeners, etc.) &nbsp;&nbsp;&nbsp;&nbsp; end -- Called when scene is about to move offscreen: function scene:exitScene( event ) &nbsp;&nbsp;&nbsp;&nbsp;local group = self.view &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;-- INSERT code here (e.g. stop timers, remove listenets, unload sounds, etc.) &nbsp;&nbsp;&nbsp;&nbsp; end -- If scene's view is removed, scene:destroyScene() will be called just prior to: function scene:destroyScene( event ) &nbsp;&nbsp;&nbsp;&nbsp;local group = self.view &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;if playBtn then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;playBtn:removeSelf()&nbsp;&nbsp;&nbsp;&nbsp;-- widgets must be manually removed &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;playBtn = nil &nbsp;&nbsp;&nbsp;&nbsp;end end ----------------------------------------------------------------------------------------- -- END OF YOUR IMPLEMENTATION ----------------------------------------------------------------------------------------- -- "createScene" event is dispatched if scene's view does not exist scene:addEventListener( "createScene", scene ) -- "enterScene" event is dispatched whenever scene transition has finished scene:addEventListener( "enterScene", scene ) -- "exitScene" event is dispatched whenever before next scene's transition begins scene:addEventListener( "exitScene", scene ) -- "destroyScene" event is dispatched before view is unloaded, which can be -- automatically unloaded in low memory situations, or explicitly via a call to -- storyboard.purgeScene() or storyboard.removeScene(). scene:addEventListener( "destroyScene", scene ) ----------------------------------------------------------------------------------------- return scene &nbsp;

– collectable.lua

local collectable = {} local collectable\_mt = {\_\_index = collectable} ----------------------------------------------------------------------------------------- -- Private Functions ----------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------- -- Public Functions ----------------------------------------------------------------------------------------- function collectable.new( \_id, \_x, \_y) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;local newCollectable = { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderObject = display.newImageRect("Assets/coin.png", 75, 75), &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;physics.addBody(newCollectable.renderObject, "static", { density=73.0, friction=0.3, bounce=0.3 }) &nbsp;&nbsp;&nbsp;&nbsp;newCollectable.renderObject.x = \_x &nbsp;&nbsp;&nbsp;&nbsp;newCollectable.renderObject.y = \_y &nbsp;&nbsp;&nbsp;&nbsp;newCollectable.renderObject.name = "collectable" &nbsp;&nbsp;&nbsp;&nbsp;newCollectable.renderObject.id = \_id &nbsp;&nbsp;&nbsp;&nbsp;newCollectable.renderObject.isSensor = true &nbsp;&nbsp;&nbsp;&nbsp;return setmetatable( newCollectable, collectable\_mt ) end function collectable:translate(\_x, \_y) &nbsp;&nbsp;&nbsp;&nbsp;self.renderObject.x = self.renderObject.x - \_x &nbsp;&nbsp;&nbsp;&nbsp;self.renderObject.y = self.renderObject.y - \_y end function collectable:update(\_dt) &nbsp;&nbsp;&nbsp;&nbsp;local speed = 100 &nbsp;&nbsp;&nbsp;&nbsp;self.renderObject:translate(-(speed \* \_dt), 0) end function collectable:checkwithinbounds(\_dt) &nbsp;&nbsp;&nbsp;&nbsp;if (self.renderObject.x + 75/2 \<= 0) then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false &nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true &nbsp;&nbsp;&nbsp;&nbsp;end end function collectable:destroy() &nbsp;&nbsp;&nbsp;&nbsp;self.renderObject:removeSelf() &nbsp;&nbsp;&nbsp;&nbsp;self.renderObject = nil end return collectable &nbsp;

– level1.lua

local levelData = {}; levelData.collectables = { {x = 542, y = 262}, {x = 870, y = 262}, {x = 1030, y = 534}, {x = 1670, y = 166}, {x = 1878, y = 166}, } return levelData; &nbsp;

– main.lua 

-- hide the status bar display.setStatusBar( display.HiddenStatusBar ) -- include the Corona "storyboard" module local storyboard = require "storyboard" -- load menu screen storyboard.gotoScene( "menu" ) &nbsp;