From one animation to another with different transitions

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]