Comunidad de diseño web y desarrollo en internet online

Problema con removeChild()

Citar            
MensajeEscrito el 01 Jul 2011 02:39 am
Buenas estoy creando un juego, os pongo el codigo para que veais donde me da el error:


Código Flex :

function mover(e:TimerEvent) {

 for each (var  Bala:Pistola in balas ) 
        {
         if ( Bala.hitTestObject( monstruo1 ) )
         {
            
            removeChild(monstruo1);
            
            }
}}


El error que me da es el siguiente:

ArgumentError: Error #2025: El objeto DisplayObject proporcionado debe ser un elemento secundario del llamador.
at flash.display::DisplayObjectContainer/removeChild()
at Smash/mover()
at flash.utils::Timer/_timerDispatch()
at flash.utils::Timer/tick()

El objeto supongo que se trata del monstruo1, pero no entiendo lo que debe ser un elemento secundario del llamador...

Haber si alguien me puede echar una ayudita!

Por Phyronx

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 01 Jul 2011 08:56 am
monstruo1 debe existir en el mismo contexto donde estas haciendo el removeChild.
Tienes que darnos mas detalles sobre donde creaste monstruo1, donde existen las balas (que son del tipo Pistola?) y donde has escrito ese script.

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 01 Jul 2011 09:18 am
A ver, tengo la clase Smash y la Monstruo1( Pistola es otra clase, pero el hittest funciona bien, ya que el monstruo desaparece, peor entonces sale el error).

En el contructor de la clase Smash, creo el monstruo1, y es en el Timer Event "mover", voy mirando si chocan y borrandolo...

Por Phyronx

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 01 Jul 2011 01:08 pm
ah! entonces pasa la segunda vez, o sea, el enterFrame sigue corriendo pero ya no hay monstruo que borrar.

Puedes remover el TimerEvent al mismo tiempo que borras al monstruo o poner un condicional feo antes del codicional de hitTest:

Código ActionScript :

if(monstruo1) if ( Bala.hitTestObject( monstruo1 ) )... 

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 01 Jul 2011 11:41 pm
Claro ostia, no lo pense ;)

El TimerEvent no lo puedo quitar ya que tambien controla otras cosas, lo que puedohacer, es usar el condicional feo. Cuando agrege mas monstruos los tendre que poner a cada uno en un array con nombres diferentes, y usar en cada vuelta del timer un FOR para comprobar el qie existe y sobre esos darle al hittest,no?
Eno ya me ire apañando ;) Aunque e salio otro error con el addchild ahora :), haber si alguien me lo puede aclarar:

http://foros.cristalab.com/addchild-me-da-error-t98918/

Bueno Acreonte, muchissimas gracias!!

Por Phyronx

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 02 Jul 2011 12:32 am
OSTIA OTRO ERROR!

Mira no se como ahora me funciona sin cambiarle nada, sin el condicional ni nada, lo que pasa es que al darle con la bala el clip desaparece, pero es como si siguiese moviendose, osea que desaparece la imagen pero el bicho sigue, y al tocarme, pantalla de game over...
Haber si he creado a un bicho con espiritu!!!

PD: Probe algo:

if (monstruo1){monstruo1.moverMonstruo();}
trace (monstruo1.x);
for each (var Bala:Pistola in balas )
{
if ( Bala.hitTestObject( monstruo1 ) )
{

removeChild(monstruo1);

}
Le dije con un condicional feo que si, monstruo1, lo moviera, que sino no... y un trace para ver si sigue moviendose... y efectivamente, su espiritu sigue en pie acechandome!

Por Phyronx

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 03 Jul 2011 10:06 pm
Que, ninguna solucion?? haber si sera un fantasma de verdad ;)

Por Phyronx

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 04 Jul 2011 07:36 pm
Es este tu codigo final o solo una prueba?

Código ActionScript :

if (monstruo1){monstruo1.moverMonstruo();}
trace (monstruo1.x);
for each (var Bala:Pistola in balas )
{
if ( Bala.hitTestObject( monstruo1 ) )
{

removeChild(monstruo1);

}

Quiza si luego del removeChild agregas un monstruo1 = null; asi dejara de existir y el colector de basura lo borrara de memoria; removeChild solamente lo borra del 'displayList' (las cosas visibles).

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 04 Jul 2011 09:15 pm
Hice lo de monstruo1 = null. Y me daba error. No me acuerdo cual era...

Por Phyronx

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 04 Jul 2011 09:19 pm
No te puede dar error!

Código ActionScript :

if ( Bala.hitTestObject( monstruo1 ) ) 
{ 
   removeChild(monstruo1); 
   monstruo1 = null;
} 

Y eso de 'no me acuerdo cual era', me hace pensar que esto te interesa poco y si es asi, porque debe interesarme a mi? prueba y si te da error se mas especifico.

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 04 Jul 2011 09:30 pm
Oye no te pongas asi hombre... He probado mil cosas y no me acuerdo del error de cada una, lo volveria a probar ahora mismo para decirtelo, pero como no podia continuar haciendo nada por este camino, me e liado a intentar poner en un array a los monstruos.. Y ahora me e bloqueado porque no se hacer que cada bala compruebe cada monstruo, osea arraybalas.hitTestObject( arraymonstruo).


PD: He borrado lo de los arrays, para poder ver el error:

TypeError: Error #2007: El valor del parámetro hitTestObject debe ser distinto de null.
at flash.display::DisplayObject/_hitTest()
at flash.display::DisplayObject/hitTestObject()
at Smash/mover()
at flash.utils::Timer/_timerDispatch()
at flash.utils::Timer/tick()

Me lo repite en cada bucle del timer...

Por Phyronx

41 de clabLevel



 

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.