This is how my game logic looks like in the game storyboard
---------------------------------------------------------------------------------- -- -- scenetemplate.lua -- ---------------------------------------------------------------------------------- local physics = require "physics" physics.start() require "sprite" local storyboard = require( "storyboard" ) local scene = storyboard.newScene() local jungleFirstFrame local jungleScndFrame local dangerPost local dangerScndPost local hero local invisibleTile local heroDies local score local scoreText local pinkMonster local greenMonster ---------------------------------------------------------------------------------- -- -- NOTE: -- -- Code outside of listener functions (below) will only be executed once, -- unless storyboard.removeScene() is called. -- --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -- BEGINNING OF YOUR IMPLEMENTATION --------------------------------------------------------------------------------- -- Called when the scene's view does not exist: function scene:createScene( event ) local group = self.view jungleFirstFrame = display.newImage("images/bg.png") jungleFirstFrame:setReferencePoint(display.BottomLeftReferencePoint) jungleFirstFrame.x = -50 jungleFirstFrame.y = 290 jungleFirstFrame.speed = 3 jungleFirstFrame.myName = "jungleFirstFrame" group:insert(jungleFirstFrame) jungleScndFrame = display.newImage("images/bg.png") jungleScndFrame:setReferencePoint(display.BottomLeftReferencePoint) jungleScndFrame.x = 550 jungleScndFrame.y = 290 jungleScndFrame.speed = 3 jungleScndFrame.myName = "jungleScndFrame" group:insert(jungleScndFrame) jungleThrdFrame = display.newImage("images/bg.png") jungleThrdFrame:setReferencePoint(display.BottomLeftReferencePoint) jungleThrdFrame.x = 1150 jungleThrdFrame.y = 290 jungleThrdFrame.speed = 3 jungleThrdFrame.myName = "jungleThrdFrame" group:insert(jungleThrdFrame) dangerPostSpriteSheet = sprite.newSpriteSheet("images/danger\_post.png", 64, 64) dangerPostSprites = sprite.newSpriteSet(dangerPostSpriteSheet, 1, 4) sprite.add(dangerPostSprites, "dangerPosts", 1, 4, 200, 0) dangerPost = sprite.newSprite(dangerPostSprites) dangerPost.x = 500 dangerPost.y = 260 dangerPost.speed = 3 dangerPost.collided = false dangerPost.myName = "dangerPost" dangerPost:prepare("dangerPosts") dangerPost:play() physics.addBody(dangerPost, "static",{density=.1, bounce=0, friction=.2, radius=30}) group:insert(dangerPost) dangerScndPost = sprite.newSprite(dangerPostSprites) dangerScndPost.x = 700 dangerScndPost.y = 260 dangerScndPost.speed = 3 dangerScndPost.collided = false dangerScndPost:prepare("dangerPosts") dangerScndPost:play() dangerScndPost.myName = "dangerScndPost" physics.addBody(dangerScndPost, "static", {density=.1, bounce=0, friction=.2, radius=30}) group:insert(dangerScndPost) invisibleTile = display.newImage("images/jet.png") invisibleTile:setReferencePoint(display.BottomLeftReferencePoint) invisibleTile.x = 0 invisibleTile.y = 320 invisibleTile:scale(1,3) physics.addBody(invisibleTile, "static", { bounce=0.1, friction=.2, radius=50}) invisibleTile.isVisible=false invisibleTile.myName = "invisibleTile" group:insert(invisibleTile) ceiling = display.newImage("images/jet.png") ceiling:setReferencePoint(display.BottomLeftReferencePoint) ceiling.x = 0 ceiling.y = 20 ceiling.isVisible=false ceiling.myName = "ceiling" physics.addBody(ceiling, "static", { bounce=0.1, friction=.2, radius=10}) group:insert(ceiling) heroSpriteSheet = sprite.newSpriteSheet("images/Hero\_run\_sprite2.png", 62, 64) heroSprites = sprite.newSpriteSet(heroSpriteSheet, 1, 12) sprite.add(heroSprites, "heroSprite", 1, 4, 200, 0) hero = sprite.newSprite(heroSprites) hero.x = 100 hero.y = 100 hero.speed = 3 hero.collided = false hero.myName = "hero" hero:prepare("heroSprite") hero:play() physics.addBody(hero, {density=0.1, bounce=0.1, friction=.2, radius=15}) group:insert(hero) pinkMonsterSpriteSheet = sprite.newSpriteSheet("images/pink\_monster2.png",64, 64) pinkMonsterSprites = sprite.newSpriteSet(pinkMonsterSpriteSheet, 1, 6) sprite.add(pinkMonsterSprites, "pinkMOnsterSprite", 1, 4, 1000, 0) pinkMonster = sprite.newSprite(pinkMonsterSprites) pinkMonster.x = 600 pinkMonster.y = 100 pinkMonster.initY = pinkMonster.y pinkMonster.speed = 5 pinkMonster.amp = math.random(20, 100) pinkMonster.angle = math.random(1,360) pinkMonster.speed = math.random(2,6) pinkMonster.collided = false pinkMonster.myName = "pinkMonster" pinkMonster:prepare("pinkMOnsterSprite") pinkMonster:play() physics.addBody(pinkMonster, "static", {density=0.1, bounce=0.1, friction=.2, radius=20}) group:insert(pinkMonster) pinkMonster2 = sprite.newSprite(pinkMonsterSprites) pinkMonster2.x = 700 pinkMonster2.y = 100 pinkMonster2.initY = pinkMonster2.y pinkMonster2.speed = 4 pinkMonster2.amp = math.random(20, 100) pinkMonster2.angle = math.random(1,360) pinkMonster2.speed = math.random(2,6) pinkMonster2.collided = false pinkMonster2.myName = "pinkMonster2" pinkMonster2:prepare("pinkMOnsterSprite") pinkMonster2:play() physics.addBody(pinkMonster2, "static", {density=0.1, bounce=0.1, friction=.2, radius=20}) group:insert(pinkMonster2) pinkMonster3 = sprite.newSprite(pinkMonsterSprites) pinkMonster3.x = 700 pinkMonster3.y = 100 pinkMonster3.initY = pinkMonster3.y pinkMonster3.speed = 1 pinkMonster3.amp = math.random(20, 100) pinkMonster3.angle = math.random(1,360) pinkMonster3.speed = math.random(2,6) pinkMonster3.collided = false pinkMonster3.myName = "pinkMonster2" pinkMonster3:prepare("pinkMOnsterSprite") pinkMonster3:play() physics.addBody(pinkMonster3, "static", {density=0.1, bounce=0.1, friction=.2, radius=20}) group:insert(pinkMonster3) greenMonsterSpriteSheet = sprite.newSpriteSheet("images/green\_monster.png",64, 64) greenMonsterSprites = sprite.newSpriteSet(greenMonsterSpriteSheet, 1, 5) sprite.add(greenMonsterSprites, "greenMOnsterSprite", 1, 4, 1000, 0) greenMonster = sprite.newSprite(greenMonsterSprites) greenMonster.x = 400 greenMonster.y = 260 greenMonster.initY = greenMonster.y greenMonster.speed = 10 greenMonster.amp = math.random(20, 100) greenMonster.angle = math.random(1,360) greenMonster.speed = math.random(2,6) greenMonster.collided = false greenMonster.myName = "greenMonster" greenMonster:prepare("greenMOnsterSprite") greenMonster:play() physics.addBody(greenMonster, "static", {density=0.1, bounce=0.1, friction=.2, radius=20}) group:insert(greenMonster) heroDiesSpriteSheet = sprite.newSpriteSheet("images/hero\_dies\_sprite4.png", 64, 64) heroDiesSprites = sprite.newSpriteSet(heroDiesSpriteSheet, 1, 6) sprite.add(heroDiesSprites, "heroDiesSprite", 1, 4, 2000, 1) heroDies = sprite.newSprite(heroDiesSprites) heroDies.x = 100 heroDies.y = 100 heroDies.speed = 3 heroDies.collided = false heroDies:prepare("heroDiesSprite") heroDies.isVisible = false group:insert(heroDies) --setting up score score = 0 scoreText = display.newText("Score : 0", 0, 0, "Helvetica", 15 ) --scoreText.x = 10 + centerX scoreText.y = 10 group:insert(scoreText) ----------------------------------------------------------------------------- -- CREATE display objects and add them to 'group' here. -- Example use-case: Restore 'group' from previously saved state. ----------------------------------------------------------------------------- end ---------------------------------------------------------------------------------- ------------ CUSTOM FUNCTIONS ---------------------------------------------------- ---------------------------------------------------------------------------------- function moveGreenMonster(self, event) if self.x \< -50 then self.x = math.random(600, 800) else self.x = self.x - math.random(2,6) print(self.speed) end end function scrollJungle(self, event) if self.x \< -1195 then self.x = 600 else self.x = self.x - self.speed end score = score + 1 scoreText.text = "Score : "..score end function placeDangerPost(self, event) if self.x \< -50 then self.x = math.random(600, 1100) else self.x = self.x - self.speed end end function placeMonster(self, event) if self.x \< -50 then self.x = math.random(600, 1100) self.amp = math.random(30, 100) self.angle = math.random(1,90) self.speed = math.random(1,5) else self.x = self.x - self.speed self.angle = self.angle + .1 self.y = self.amp \* math.sin(self.angle) + self.initY end end function jumpHero(self, event) self:applyForce(0,-1.5, self.x, self.y) end function touchScreen(event) if event.phase == "began" then hero.enterFrame = jumpHero Runtime:addEventListener("enterFrame", hero) end if event.phase == "ended" then Runtime:removeEventListener("enterFrame", hero) end end function gameOver() storyboard.gotoScene("restart", "fade", 400) end local function onCollision(event) if ( event.phase == "began" ) then if(event.object1.myName~="invisibleTile" and event.object2.myName~="invisibleTile") then Runtime:removeEventListener("enterFrame", jungleFirstFrame) Runtime:removeEventListener("enterFrame", jungleScndFrame) Runtime:removeEventListener("enterFrame", jungleThrdFrame) Runtime:removeEventListener("enterFrame", dangerPost) Runtime:removeEventListener("enterFrame", dangerScndPost) Runtime:removeEventListener("enterFrame", pinkMonster) Runtime:removeEventListener("enterFrame", pinkMonster2) Runtime:removeEventListener("enterFrame", pinkMonster3) Runtime:removeEventListener("enterFrame", greenMonster) Runtime:removeEventListener("touch", touchScreen) Runtime:removeEventListener("collision", onCollison) hero.bodyType="static" hero.isVisible=false heroDies.x = hero.x heroDies.y = hero.y heroDies.isVisible = true heroDies:play() timer.performWithDelay(2000, gameOver, 1) end end end -- Called immediately after scene has moved onscreen: function scene:enterScene( event ) storyboard.removeScene("restart") storyboard.removeScene("start") local group = self.view Runtime:removeEventListener("enterFrame", jungleFirstFrame) Runtime:removeEventListener("enterFrame", jungleScndFrame) Runtime:removeEventListener("enterFrame", jungleThrdFrame) Runtime:removeEventListener("enterFrame", dangerPost) Runtime:removeEventListener("enterFrame", dangerScndPost) Runtime:removeEventListener("enterFrame", pinkMonster) Runtime:removeEventListener("enterFrame", pinkMonster2) Runtime:removeEventListener("enterFrame", pinkMonster3) Runtime:removeEventListener("enterFrame", greenMonster) Runtime:removeEventListener("touch", touchScreen) Runtime:removeEventListener("collision", onCollison) ----------------------------------------------------------------------------- jungleFirstFrame.enterFrame = scrollJungle Runtime:addEventListener("enterFrame", jungleFirstFrame) jungleScndFrame.enterFrame = scrollJungle Runtime:addEventListener("enterFrame", jungleScndFrame) jungleThrdFrame.enterFrame = scrollJungle Runtime:addEventListener("enterFrame", jungleThrdFrame) dangerPost.enterFrame = placeDangerPost Runtime:addEventListener("enterFrame", dangerPost) dangerScndPost.enterFrame = placeDangerPost Runtime:addEventListener("enterFrame", dangerScndPost) pinkMonster.enterFrame = placeMonster Runtime:addEventListener("enterFrame", pinkMonster) pinkMonster2.enterFrame = placeMonster Runtime:addEventListener("enterFrame", pinkMonster2) pinkMonster3.enterFrame = placeMonster Runtime:addEventListener("enterFrame", pinkMonster3) greenMonster.enterFrame = moveGreenMonster Runtime:addEventListener("enterFrame", greenMonster) Runtime:addEventListener("touch", touchScreen) Runtime:addEventListener("collision", onCollision) ----------------------------------------------------------------------------- end -- Called when scene is about to move offscreen: function scene:exitScene( event ) local group = self.view ----------------------------------------------------------------------------- Runtime:removeEventListener("enterFrame", jungleFirstFrame) Runtime:removeEventListener("enterFrame", jungleScndFrame) Runtime:removeEventListener("enterFrame", jungleThrdFrame) Runtime:removeEventListener("enterFrame", dangerPost) Runtime:removeEventListener("enterFrame", dangerScndPost) Runtime:removeEventListener("enterFrame", pinkMonster) Runtime:removeEventListener("enterFrame", pinkMonster2) Runtime:removeEventListener("enterFrame", pinkMonster3) Runtime:removeEventListener("enterFrame", greenMonster) Runtime:removeEventListener("touch", touchScreen) Runtime:removeEventListener("collision", onCollison) ----------------------------------------------------------------------------- end -- Called prior to the removal of scene's "view" (display group) function scene:destroyScene( event ) local group = self.view ----------------------------------------------------------------------------- -- INSERT code here (e.g. remove listeners, widgets, save state, etc.) ----------------------------------------------------------------------------- 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 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