Hi!
I have a parachuter (paraChuter) spawning from a helicopter. Then it move down (transition) to the ground, and before hitting ground it changes animation to a landing animation (paraLanding), transition some more, then becoming a footsoldier (soldierFrag) that shoots a grenade and moves on the spot, then becomes a running soldier (soldierRun) and runs out of screen.
I don’t know if this is the right way to go. From one function to another I want the previous object to be removed (to be replaced with the new sprite).
This code works, until I shoot down the soldier with
table.insert(toRemove,event.other)
then I get the error message:
main.lua:369: attempt to call method 'removeSelf' (a nil value)
stack traceback:
which is this line:
local function paraLanding(event)
--if event.other ~= nil then
event:removeSelf() -- \<====
How should I best do this kind of problem? And how do I detect if the object is nil?
---- Remove collided enemy planes
for i = 1, #toRemove do
toRemove[i].parent:remove(toRemove[i])
toRemove[i] = nil
end
---- Enemy soldier starts running
local function soldierRun(event)
event:removeSelf()
local sheet = sprite.newSpriteSheet( "images/enemies/soldier\_run.png", 130, 120 )
thetime = 8000
local spriteSet = sprite.newSpriteSet(sheet, 1, 7)
sprite.add( spriteSet, "soldierrunning", 1, 12, 100, 0 )
local soldierRuns = sprite.newSprite( spriteSet )
soldierRuns.x = event.x
soldierRuns.y = event.y
soldierRuns.xScale = 0.5
soldierRuns.yScale = 0.5
soldierRuns:prepare("soldierrunning")
soldierRuns:play()
transition.to( soldierRuns, { time=thetime, alpha=1, x=-20, onComplete = function(self) self.parent:remove(self); self = nil; end } )
enemiesLayer:insert(soldierRuns)
end
---- Enemy soldier throws frag
local function soldierFrag(event)
event:removeSelf()
local sheet = sprite.newSpriteSheet( "images/enemies/soldier\_frag.png", 130, 120 )
thetime = 2000
local spriteSet = sprite.newSpriteSet(sheet, 1, 7)
sprite.add( spriteSet, "soldierfragging", 1, 68, 100, 1 )
local soldierFrags = sprite.newSprite( spriteSet )
soldierFrags.x = event.x-15
soldierFrags.y = event.y+20
soldierFrags.xScale = 0.5
soldierFrags.yScale = 0.5
soldierFrags:prepare("soldierfragging")
soldierFrags:play()
------------ Frags explodes
function goFrag()
local sheet = sprite.newSpriteSheet( "images/explosions/frag.png", 260, 283 )
thetime = 2000
local spriteSet = sprite.newSpriteSet(sheet, 1, 5)
sprite.add( spriteSet, "frag", 1, 40, 100, 1 )
-- Sets random throw hit
stringX = math.random(100, 150)
stringY = math.random(10, 20)
local throwFrag = sprite.newSprite( spriteSet )
throwFrag.x = soldierFrags.x-stringX
throwFrag.y = soldierFrags.y-stringY
throwFrag.xScale = 0.5
throwFrag.yScale = 0.5
throwFrag:prepare("frag")
throwFrag:play()
timer.performWithDelay( 1, healthP, 1)
end
timer.performWithDelay( 2000, goFrag, 1)
transition.to( soldierFrags, { time=thetime, alpha=1, x=soldierFrags.x, y=soldierFrags.y, onComplete = soldierRun } )
enemiesLayer:insert(soldierFrags)
end
---- Parachuter landing animation
local function paraLanding(event)
--if event.other ~= nil then
event:removeSelf()
local sheet = sprite.newSpriteSheet( "images/enemies/para\_land.png", 261, 240 )
thetime = 400
local spriteSet = sprite.newSpriteSet(sheet, 1, 7)
sprite.add( spriteSet, "paraLander", 1, 9, 400, 1 )
paraLand = sprite.newSprite( spriteSet )
paraLand.x = event.x
paraLand.y = event.y
paraLand.xScale = -0.5
paraLand.yScale = 0.5
paraLand:prepare("paraLander")
paraLand:play()
transition.to( paraLand, { time=thetime, alpha=1, x=eventx, y=event.y+20, onComplete = soldierFrag } )
enemiesLayer:insert(paraLand)
--end
end
---- Enemy copter
stringHeight = math.random(20, 130) -- Random height
if event.time - timeLastCopter \>= math.random(4000, 5000) then
local sheet = sprite.newSpriteSheet( "images/enemies/copter.png", 324, 155 )
thetime = 10000
local spriteSet = sprite.newSpriteSet(sheet, 1, 1)
sprite.add( spriteSet, "copter", 1, 4, 100, 0 )
copter = sprite.newSprite( spriteSet )
copter.x = 520
copter.y = stringHeight
copter.xScale = 0.5
copter.yScale = 0.5
copter:prepare("copter")
copter:play()
copter.name = "copter"
physics.addBody(copter, "kinematic", {bounce = 0, shape=pentagonShape})
transition.to( copter, { time=thetime, alpha=1, x=-420, y=stringHeight, onComplete = function(self) self.parent:remove(self); self = nil; end } )
enemiesLayer:insert(copter)
----------- Parachuters, 20% chance no chuter
randParaX = math.random(1, 5)
if randParaX \> 1 then
local function spawnPara()
local sheet = sprite.newSpriteSheet( "images/enemies/para\_glide.png", 261, 240 )
thetime = math.random(5000, 7000)
local spriteSet = sprite.newSpriteSet(sheet, 1, 7)
sprite.add( spriteSet, "paraChuter", 1, 31, 400, 1 )
paraChuter = sprite.newSprite( spriteSet )
paraChuter.x = copter.x-35
paraChuter.y = copter.y
randDir = math.random(1, 2)
paraChuter.xScale = -0.5
paraChuter.yScale = 0.5
paraChuter:prepare("paraChuter")
paraChuter:play()
paraChuter.name = "paraChuter"
pentagonShape = { 2, 17 , -12, 39 , -13, 16 , -9, -1 }
physics.addBody(paraChuter, "kinematic", {bounce = 0, shape=pentagonShape})
-- Before ground, start paraLanding animation
transition.to( paraChuter, { time=thetime, alpha=1, x=copter.x-60, y=250, onComplete = paraLanding; } )
gameLayer:insert(paraChuter)
end
-- Spawns random 1-4, with 500 delay
randPara = math.random(1, 4)
timer.performWithDelay( 500, spawnPara, randPara)
end
timeLastCopter = event.time
end
Best regards,
joelwe [import]uid: 54640 topic_id: 9957 reply_id: 309957[/import]