Hey guys,
the problem i have right now is when i die 3 times i get an “game over” screen and when i click on return it goes back but the gamelevel still continues in the background. so here is the code below that causes my problem.
this is the ship.lua
– ship.lua
– Creates the ship the user will control
local storyboard = require(“storyboard”)
Bullets = require(“Classes.bullet”)
local shootSnd = audio.loadSound(‘Sound/shoot.wav’)
–local gameLayer = display.newGroup()
local ship = {}
local ship_mt = { __index = ship }
local scene = scene – make scene a local variable for quick reference
local gameover_returntomenu
local shipLives = 3
function ship:new() – constructor, just creates the class, nothing else
local group = {}
return setmetatable( group, ship_mt )
end
function ship:init(xloc, yloc) --initializer, add any variables or images here
– create attributes
self.spaceship = display.newGroup( )
self.spaceship.name = “ship” – toegevoegd
self.turret = display.newRect(self.spaceship,0,-10,15,15)
self.turret:setFillColor ( 0, 255, 0 )
self.image = display.newRect(self.spaceship,0,10,60,25)
self.image:setFillColor ( 0, 255, 0 )
self.spaceship.x = display.contentWidth / 2
self.spaceship.y = display.contentHeight - 120
self.bullet = require(“Classes.bullet”)
self.direction = 4
self.bulletFired = {}
local borderCollisionFilter = { categoryBits = 4, maskBits = 6}
physics.addBody( self.spaceship, “dynamic”, {filter = borderCollisionFilter} )
gui_lives = display.newText("Lives: "…shipLives,0,0,“Kemco Pixel”,35)
gui_lives:setFillColor( 255 )
gui_lives.x = 65
gui_lives.y = 45
end
function ship:enterFrame()
– body
self.spaceship.x = self.spaceship.x + self.direction
end
function ship:buttonTouched(event)
– body
if (event.id == “RightButtonTouched”) then
self.direction = 4
Runtime:addEventListener( “enterFrame”, self )
elseif (event.id == “RightButtonReleased”) then
Runtime:removeEventListener( “enterFrame”, self )
elseif (event.id == “leftButtonTouched”) then
self.direction = -4
Runtime:addEventListener( “enterFrame”, self )
elseif (event.id == “leftButtonReleased”) then
Runtime:removeEventListener( “enterFrame”, self )
elseif (event.id == “FireButtonTouched”) then
--print(“fire!!!”)
audio.play(shootSnd)
local bullet = Bullets:new()
bullet:init(self.spaceship.x -0)
bullet:start( )
end
end
function ship.collision(self, event)
– body
print( “collision bomb” )
if(shipLives > 1) then
shipLives = shipLives - 1
gui_lives.text = "Lives: "…shipLives
gui_lives.x = 85
gui_lives.y = 45
elseif event.other.name == “bomb” then
--display.remove( event.other )
--ship.collision()
--group:insert(bg)
audio.stop( 1 )
Runtime:removeEventListener( “enterFrame”, self )
scene:removeEventListener(“buttonTouched”, self)
self.spaceship:removeEventListener( “collision”, self ) – collided with another physics body
self.spaceship:removeSelf()
local gameover_message = display.newText(“Game Over!”,0,0,“Kemco Pixel”, 58)
gameover_message.x = 400
gameover_message.y = 500
function returnToMenuTouch(event)
if(event.phase == “began”) then
storyboard.gotoScene(“menu”,“slideRight”,“1000”)
end
end
gameover_returntomenu = display.newText(“Return To Menu”,0,0,“Kemco Pixel”, 48)
gameover_returntomenu.x = 400
gameover_returntomenu.y = 600
gameover_returntomenu:addEventListener( “touch”, returnToMenuTouch)
– if event.other.name == “bomb” then
– Runtime:removeEventListener( “enterFrame”, self )
– scene:removeEventListener(“buttonTouched”, self)
– self.spaceship:removeEventListener( “collision”, self ) – collided with another physics body
– self.spaceship:removeSelf()
– self = nil
– --local gameoverText = display.newText(“Game Over!”, 0, 0, native.systemFont, 35)
– --gameoverText.x = display.contentCenterX
– --gameoverText.y = display.contentCenterY
– --gameLayer:insert(gameoverText)
– message = { – toegevoegd
– name = “gameOver”
– }
– scene:dispatchEvent(message)
end
end
function ship:start() — Create Listeneres, start things that need to be ‘running’
scene:addEventListener(“buttonTouched”, self)
self.spaceship:addEventListener( “collision”, self ) – collided with another physics body
scene:addEventListener(“returnToMenuTouch”,self)
end
return ship
my enemy.lua
– enemy.lua
– Create the Enemy’s and there functionality
local enemys = {}
local enemys_mt = { __index = enemys }
local scene = scene – make scene a local variable for quick reference
local bomb = require(“Classes.bomb”)
function enemys:new() – constructor, just creates the class, nothing else
local group = {}
return setmetatable( group, enemys_mt )
end
function enemys:init(xloc, yloc) --initializer, add any variables or images here
– create attributes
self.image = display.newImage(“Assets/Enemy.png”)
self.image.x = xloc
self.image.y = yloc
self.image.name = “enemy”
self.movement = 2
self.rightHit = 0
self.leftHit = 0
self.numberOfWallHits = 0
local borderCollisionFilter = { categoryBits = 8, maskBits = 9}
physics.addBody( self.image, “dynamic”, {filter = borderCollisionFilter} )
end
local function dropBomb( event, self )
timer.cancel( self.clock )
local newBomb = bomb:new()
newBomb:init(self.image.x - 10, self.image.y + 5)
newBomb:start( )
local delay = math.random(1000,10000)
self.clock = timer.performWithDelay( delay, function (event) dropBomb(event,self) end, 1)
end
function enemys.enterFrame(self, event)
self.image.x = self.image.x + self.movement
end
function enemys.collision( self, event )
–print( “in here” )
--self.movement = self.movement * -1
if event.other.name == “rightWall” then
local message = {
name=“hit_rightWall_event”
}
scene:dispatchEvent(message)
elseif event.other.name == “leftWall” then
local message = {
name=“hit_leftWall_event”
}
scene:dispatchEvent(message)
elseif event.other.name == “bullet” then
message = {
name = “enemyDead”
}
scene:dispatchEvent(message)
Runtime:removeEventListener( “enterFrame”, self )
self.image:removeEventListener( “collision”, self ) – collided with another physics body
scene:removeEventListener(‘hit_rightWall_event’, self)
scene:removeEventListener(‘hit_leftWall_event’, self)
self.image:removeSelf()
timer.cancel(self.clock)
self = nil
– elseif event.other.name == “shipDead” then
– print( “gameover” )
– scene:dispatchEvent(message)
– Runtime:removeEventListener( “enterFrame”, self )
– self.image:removeEventListener( “collision”, self ) – collided with another physics body
– scene:removeEventListener(‘hit_rightWall_event’, self)
– scene:removeEventListener(‘hit_leftWall_event’, self)
– self.image:removeSelf()
– timer.cancel(self.clock)
– self = nil
end
end
function enemys:start() — Create Listeneres, start things that need to be ‘running’
Runtime:addEventListener( “enterFrame”, self ) – runtime listener to move the enemy
self.image:addEventListener( “collision”, self ) – collide with another physics body
scene:addEventListener( “hit_rightWall_event”, self )
scene:addEventListener( “hit_leftWall_event”, self )
– voor de bom
local delay = math.random(1000, 10000)
self.clock = timer.performWithDelay( delay, function (event) dropBomb(event, self) end, 1)
end
local function checkNumHits( self )
--self.numberOfWallHits = self.numberOfWallHits + 1
if self.numberOfWallHits == 4 then
self.numberOfWallHits = 0 – toegevoegd
self.movement = self.movement + 1 – toegevoegd
timer.performWithDelay( 1, – 1 millisecond delay
function () – anonymous function to perform update
self.image.y = self.image.y + 30
end
, 1)
--self.numberOfWallHits = 0
end
end
function enemys.hit_rightWall_event( self, event )
self.rightHit = self.rightHit + 1
if ( self.rightHit == 1 ) then
self.movement = self.movement * (-1)
self.leftHit = 0
self.numberOfWallHits = self.numberOfWallHits + 1
end
checkNumHits(self)
end
function enemys.hit_leftWall_event( self, event )
self.leftHit = self.leftHit + 1
if ( self.leftHit == 1 ) then
self.movement = self.movement * (-1)
self.rightHit = 0
self.numberOfWallHits = self.numberOfWallHits + 1
end
checkNumHits(self)
end
return enemys
and the menu.lua where it goes back to
local storyboard = require( “storyboard” )
local scene = storyboard.newScene()
– include Corona’s “widget” library
local widget = require “widget”
– forward declarations and other locals
–local screenW, screenH, halfW, halfY = display.contentWidth, display.contentHeight, display.contentWidth*0.5, display.contentHeight*0.5
– Called when the scene’s view does not exist:
function scene:createScene( event )
local group = self.view
– display a background image
local bg = display.newImageRect(“Assets/background.png”, 768, 1024)
bg.x = display.contentWidth / 2
bg.y = display.contentHeight / 2
group:insert(bg)
– place a game title on the screen
local gametitle = display.newText(“Space Defender”,400,600,“Kemco Pixel”,80)
gametitle.x = display.contentWidth / 2
gametitle.y = 100
group:insert( gametitle )
– ‘onRelease’ event listener for playBtn
local function onPlayBtnRelease()
– go to level1.lua scene
storyboard.gotoScene( “storyboard-level1”, “slideLeft”)
--return true – indicates successful touch
end
local function onInstructionBtnRelease()
– go to Instruction.lua scene
storyboard.gotoScene( “instruction”, “slideLeft”)
--return true – indicates successful touch
end
local function onCreditsBtnRelease()
– go to Credits.lua scene
storyboard.gotoScene( “credit”, “slideLeft”)
--return true – indicates successful touch
end
– create a widget button (which will loads level1.lua on release)
playBtn = widget.newButton{
label=“Play Now”,
labelColor = { default={255} },
defaultFile = “Assets/Button.png”,
overFile = “Assets/Button_Purple.png”,
width=150, height=60,
left=300, top=250,
font = “Kemco Pixel”,
fontSize = 26,
onRelease = onPlayBtnRelease – event listener function
}
group:insert( playBtn )
instructionBtn = widget.newButton{
label=“Instruction”,
labelColor = { default={255} },
defaultFile = “Assets/Button2.png”,
overFile = “Assets/Button_Purple2.png”,
width=150, height=60,
left=300, top=350,
font = “Kemco Pixel”,
fontSize = 26,
onRelease = onInstructionBtnRelease – event listener function
}
group:insert( instructionBtn )
creditsBtn = widget.newButton{
label=“Credits”,
labelColor = { default={255} },
defaultFile = “Assets/Button3.png”,
overFile = “Assets/Button_Purple3.png”,
width=150, height=60,
left=300, top=450,
font = “Kemco Pixel”,
fontSize = 26,
onRelease = onCreditsBtnRelease – event listener function
}
group:insert( creditsBtn )
end
– Called immediately after scene has moved onscreen:
function scene:enterScene( event )
local group = self.view
if storyboard.getPrevious() ~= nil then
storyboard.removeScene(storyboard.getPrevious())
end
end
– If scene’s view is removed, scene:destroyScene() will be called just prior to:
function scene:destroyScene( event )
local group = self.view
if playBtn then
playBtn:removeSelf() – widgets must be manually removed
instructionBtn:removeSelf( )
creditsBtn:removeSelf( )
playBtn = nil
elseif instructionBtn then
instructionBtn:removeSelf( )
instructionBtn = nil
elseif creditsBtn then
creditsBtn:removeSelf( )
creditsBtn = nil
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 )
– “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
so the main problem lies in the ship.lua cuz i dont delete the scene i think, but to tell you the truth i really dont know how.
hope that someone can help me out of this.