arrays - Error on AS3: TypeError: Error #1010: A term is undefined and has no properties -
i'm trying create collision code involving array of bullets , array of zombies. when tried code:
for(var bu:int = 0;bu < bullets.length; bu++){ for(var zo:int = 0;zo < zombiecount.length; zo++){ if(bullets[bu].hittestobject(zombiecount[zo])){ stage.removechild(zombiecount[zo]); zombiecount.splice(zo, 1); stage.removechild(bullets[bu]); bullets.splice(bu, 1); trace("hot hit") } } } i error message. tried code:
for(var bu:int = 0;bu < bullets.length; bu++){ for(var zo:int = 0;zo < zombiecount.length; zo++){ if(bullets[bu].hittestobject(zombiecount[zo])){ stage.removechild(zombiecount[zo]); if(zombiecount.splice(zo,1)!=null){ zombiecount.splice(zo, 1) } stage.removechild(bullets[bu]); bullets.splice(bu, 1) if(bullets.splice(bu,1)!=null){ bullets.splice(bu, 1) } trace("hot hit") } } } however, though message doesn't appear, objects(or rather remains?) stops there. if go original code, i'll keep receiving error messages. please help.
most issue because of 2 things:
you're splicing array inside loop iterates on said array forwards.
if you're going this, should iterate backwards doesn't mess index.
for example, let's
zombiecounthas 3 elements. first iterationzo = 0, let's hit test succeeds, splice array,zombiecounthas 2 elements. next iteration,zo=1, item used referencedzombiecount[1]inzombiecount[0]now. you've ended skipping item.
- you remove bullet, don't break out of inner loop (that loops through zombies) - problem here if more 1 zombie touching bullet, you'll end trying remove bullet multiple times , un-intentionally splicing different bullets out of array. error because @ point index
bubecomes out of range result of issue.
for exmaple, let's
bulletsarray has 2 elements , zombie array has3elements. first iterationbu0, let's hittest succeeds on first zombie in array. splicebullets, has 1 element. let's second zombie in array passes hittest. splicingbulletsagain, except it's second item ends getting spliced. let's third zombie in array passes hitest too, there nothing left inbulletsarray, trying splice anyway , remove non-existent object stage.
try instead:
//iterate backwards, if remove item array, it's last item , won't throw off order of array for(var bu:int = bullets.length-1;bu >= 0; bu--){ for(var zo:int = zombiecount.length-1;zo >= 0; zo--){ if (bullets[bu].hittestobject(zombiecount[zo])) { //remove zombie stage.removechild(zombiecount[zo]); zombiecount.splice(zo, 1); //remove bullet stage.removechild(bullets[bu]); bullets.splice(bu, 1); trace("hot hit"); break; //break out of inner loop (through zombies), since bullet has been destroyed } } }
Comments
Post a Comment