2010-10-29 6 views
1

Fondamentalement, j'ai deux routines: L'une est une vérification de collision CDK, et l'autre est une vérification générique d'un tableau. Ils sont tous deux dans le même événement de minuterie. Il y a deux tableaux - collisionList et MasterArray, et l'objet est dans les deux.Impossible de "removeChild" après avoir référencé l'objet précédemment

Tout d'abord, la routine de collision:

var collisions:Array = collisionList.checkCollisions(); 

for(var i:uint = 0; i < collisions.length; i++) 

{var firstShape: Sprite = collisions [i] .object1; If (firstShape.name == "Obj1") {
collisions [i] .object1.x = -20; collisionList.removeItem (collisions [i] .object1); }}

Ensuite, je dois:

 for each(var i in MasterArray) { 
    Shape1:Sprite = MasterArray[i]; 

si (i.x < 0) { removeChild (Shape1); MasterArray.splice (this, 1); }

 } 

Mais cela ne fonctionne pas. Cela me donne un énorme accident. Si je ne change pas l'objet x dans la routine de collision, au moment où il est sorti de l'écran par une autre fonction, il disparaît et tout va bien. Cependant, même si je viens de le toucher avec la routine de collision (par exemple, si je déclare que je veux que son x soit à 20), la prochaine fois que quelque chose se passe et le déplace à < 0, j'obtiens le même crash .

Si je ne fais rien sur la vérification de MasterArray et que je fais un removeChild lors de la vérification de collision, cela fonctionne bien aussi.

C'est l'erreur que je reçois dans les deux cas:

ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller. 

à flash.display :: DisplayObjectContainer/removeChild() à game2_Scene1_fla :: MainTimeline/Contrôlehoraire() à flash.utils :: minuterie/_timerDispatch() at flash.utils :: Minuteur/tick()

Merci!

Répondre

0

collisionList.removeChild(Shape1) est un problème imho: est Shape1:Sprite = MasterArray[i]; vraiment un enfant de collisionList? et quel type est collisionList?

+0

En fait, que removeChild (Shape1) est juste cela, ignorez le collisionList avant - c'est la saleté de quand je nettoyais. Cela ne fonctionne pas malgré tout. – Carlo

+0

@Carlo: alors, à quoi ressemble votre code problème maintenant? – www0z0k

0

Je pense que vous utilisez le pour chaque boucle faux dans votre deuxième morceau de code.

Chaque i dans MasterArray est un Sprite, non?
Vous vérifiez la position x de i, ce qui semble correct, mais en définissant Shape1 sur MasterArray [i], vous définissez probablement Shape1 sur null. (Vous cherchez un objet dans le MasterArray avec la clé 'i', qui est en fait un élément du MasterArray ...)

Alors vous essayez d'enleverChild (null) et tout éclate .

Vous souhaitez probablement remplacer votre boucle par une boucle normale pour la boucle. Quelque chose comme ceci:

for(var i:int=MasterArray.length-1; i>-1; i--) { 
    shape1:Sprite = MasterArray[i]; 
    if (shape1.x < 0) { 
     removeChild(shape1); 
     MasterArray.splice(i,1); 
    } 
} 
+0

Cela fonctionne chaque fois que je n'initialise pas la routine de collision. Par exemple, si j'ai défini si (shape1.x <400) { removeChild (shape1); MasterArray.splice (i, 1); } Tout ce qui est au début sera supprimé. C'est vrai. Cependant, quand je heurte l'un des objets (et ils sont enlevés par la routine de collision), le moment suivant il y a un shape1.x <400, j'ai la même erreur. Je pense que j'ai besoin de retirer l'objet du MasterArray pendant la routine de collision, mais comment puis-je le faire exactement, s'ils sont dans deux tableaux différents? – Carlo

+0

Hmm, eh bien, on ne sait pas exactement ce qui se passe dans le bloc supérieur du code. Qu'est-ce que collisionList? Que fait collisionList.removeItem()? Est-il possible que l'objet soit déjà retiré de la scène là-bas? Dans tous les cas, vous pouvez supprimer l'élément de MasterArray dans cette boucle en recherchant d'abord l'index: MasterArray.indexOf (collisions [i] .object1). Cela renverra l'index de l'élément dans MasterArray. Vous pouvez ensuite utiliser cet index pour l'épisser hors du MasterArray. – Cadin

Questions connexes