A Flash Developer Resource Site

Results 1 to 6 of 6

Thread: help with a child I cannot remove

  1. #1
    Junior Member
    Join Date
    Jul 2010
    Posts
    9

    help with a child I cannot remove

    Hello, I cant remove a child in the game i'm trying to make:

    Code:
    var rivaleses:rivales;
    
    function crearID():void {
       rivaleses=new rivales();
       var espacioalaizq:int= 0 + pasto1.width + borde1.width + rivaleses.width/2;
       var espacioalader:int= stage.stageWidth - (pasto2.width + borde2.width + rivaleses.width/2);
       var num:int = Math.floor(Math.random() * (espacioalader - espacioalaizq + 1)) + espacioalaizq;
       rivaleses.y=10;
       rivaleses.x= num;
       rivaleses.addEventListener(Event.ENTER_FRAME,dropEnemy);
       addChild(rivaleses);
    }
    
    
    function dropEnemy(e:Event):void {
       var caer:rivales=rivales(e.target);
       caer.y+=10;   
       if (caer.hitTestObject(coches) && coches.alpha== 1) {
          //coches.visible=false;
          coches.alpha= 0.5;
          numerodevidas-=1;      
          vidas();
       }
    }
    
    function fin(e:Event):void{
       rivaleses.removeEventListener(Event.ENTER_FRAME,dropEnemy);
       removeChild(rivaleses);
    
       //trace(rivales); //[class rivales]
       //trace(getChildAt(0),getChildAt(0).name);//[object MovieClip] pasto1
       //trace(getChildAt(1),getChildAt(1).name);//[object MovieClip] pasto1
       //trace(getChildAt(2),getChildAt(2).name);// [object Shape] instance3
       //trace(getChildAt(3),getChildAt(3).name);// [object MovieClip] rayas
       //trace(getChildAt(4),getChildAt(4).name); // [object Shape] instance6
       //trace(getChildByName("rivales"));//null
       //trace(getChildByName("rivaleses"));//null
       //trace(getChildByName("caer"));//null
    }
    Function CrearID comes from a setInterval.

    I get this error:


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

    It's caused by removeChild(rivaleses).

    I need to write removeChild(rivaleses) in order to eliminate the falling cars.
    Thanks, Lio

  2. #2
    Junior Member
    Join Date
    Feb 2011
    Posts
    16
    To what object is the fin function attached to? If it's not listening for the parent of rivaleses, then it's normal that you get Error #2025, because you're not specifying the parent of rivaleses.

    Here, I noticed you added rivaleses to the stage. Either specify to remove rivaleses from the stage or change the object that listens for "fin".

  3. #3
    Senior Member
    Join Date
    May 2010
    Location
    Russia: Western Siberia
    Posts
    268
    Here, I noticed you added rivaleses to the stage.
    Oh yeah? Where's that? There's no code that adds it to the stage.
    This code:
    Actionscript Code:
    addChild(rivaleses);
    means
    Actionscript Code:
    this.addChild(rivaleses);
    But not
    Actionscript Code:
    stage.addChild(rivaleses);

    To check if the display object can be removed from some container (in this case, the container is "this"), do something like this:
    Actionscript Code:
    if (this.contains(rivaleses)) this.removeChild(rivaleses);

  4. #4
    Junior Member
    Join Date
    Jul 2010
    Posts
    9
    Thank you a lot. I get the point, instead of not having full understanding of the topic "the stage, the parent, the display object". By doing

    if (this.contains(rivaleses)){
    this.removeChild(rivaleses);
    }

    It worked !! the child got removed.

    But can I bother you with a last question please ?

    You see, I got

    Code:
    var rivaleses:rivales;
    then in the function "CrearID", I state
    Code:
    rivaleses=new rivales();
    addChild(rivaleses)
    and then a Listener for the function that allows me to make rivaleses go "y+=10".

    So, why I should use
    Code:
    var caer:rivales=rivales(e.target);
    instead of just
    rivaleses.y+10; in the function dropEnemy ? Thank you. Lio

  5. #5
    Senior Member
    Join Date
    May 2010
    Location
    Russia: Western Siberia
    Posts
    268
    It's not necessary in this case.You can easily use
    Actionscript Code:
    rivaleses.y+10;
    And change this code:
    Actionscript Code:
    function dropEnemy(e:Event):void {
       var caer:rivales=rivales(e.target);
       caer.y+=10;  
       if (caer.hitTestObject(coches) && coches.alpha== 1) {
          //coches.visible=false;
          coches.alpha= 0.5;
          numerodevidas-=1;      
          vidas();
       }
    }
    for this:
    Actionscript Code:
    function dropEnemy(e:Event):void {
       rivaleses.y+=10;  
       if (rivaleses.hitTestObject(coches) && coches.alpha== 1) {
          //coches.visible=false;
          coches.alpha= 0.5;
          numerodevidas-=1;      
          vidas();
       }
    }

    It will work, because you declared "rivaleses" outsite of all functions (var rivaleses:rivales; ).
    The code with e.target would be necessary if your "rivaleses" variable was declared inside crearID() function.

    I'll try to explain. You add event listener for enter frame to rivaleses, so when enter frame event occurs on this object, the object will be the target of the event, and since it'd be unreachable for other functions, the only way to get it from dropEnemy() method, would be to check the target of the event, and probably assign it to a new local variable "caer", just for convenience.

    I hope that makes sense

    Cheers.
    Last edited by caseyryan; 02-27-2011 at 01:49 AM.

  6. #6
    Junior Member
    Join Date
    Jul 2010
    Posts
    9
    This will sound weird:

    Caseyryan, what you said makes sense, and it was what I though first ,but when I delete:

    Code:
    caer:rivales=rivales(e.event);
    and just write:

    Code:
    rivaleses.y+=10;
    (changing from now on the other parts of the code when wrote "caer" and now should say "rivaleses")

    And then play, I got an strange behavior:

    the first "rivaleses " that fall stops in the middle of the screen, at least 2 more do the same, and then the rest fall at a very high speed !!!


    Maybe the error lies in another part of the code... i'll post it full
    (sorry about my weak english)

    Part ONE
    (only significant up to the variables, then not..)

    Code:
    import flash.events.KeyboardEvent;
    
    var coches:coche;
    var rivaleses:rivales;
    // abajo amigo ,var rivaleses:rivales= new rivales();
    var velocidadJuego:uint;
    var crearIDenemigo:uint;
    var izquierda:Boolean;
    var derecha:Boolean;
    var arriba:Boolean;
    var abajo:Boolean;
    var timer:Timer = new Timer(1000,1);
    var numerodevidas:Number= 3
    var tiempo:Timer = new Timer(2000,1);
    ////////////////////////////////////////////////////////////////////////
    /*               BLOQUEADORES PARA QUE TUERZA Y NO RUEDE               */           
    
    var inclinadoIzq:Boolean;
    var inclinadoDer:Boolean;
    //  PARA SABER CUANDO SUELTO TECLA Y NO ESTA PULSADA
    var pulsadoLeft:Boolean;
    var pulsadoRight:Boolean;
    //PARA IMPEDIR QUE CUANDO YO QUIERA
    //QUE AL SOLTAR LA TECLA LA RANA VUELVA A SU POSICION 
    //ESTA SE PONGA A ROTAR PARA EL OTRO LADO SIN PARAR
    //EN TRUE ESTA ACTIVADO
    var bloqueadorRight:Boolean=true;
    var bloqueadorLeft:Boolean=true;
    
    ////////////////////////////////////////////////////////////////////////
    
    function iniciarJuego():void {
    	//SPAWNEO A MI PERSONAJE
    	coches=new coche();
    	//LA POSICION DE MI PERSONAJE
    	coches.x=300;
    	coches.y=370;
    	
    	addChild(coches);
    	coches.chispasizq.visible=false;
    	coches.chispasder.visible=false;
    	
    	velocidadJuego=500;
    	crearIDenemigo=setInterval(crearID,velocidadJuego);
    	Mouse.hide();
    	
    	stage.stageFocusRect=false;
    	stage.focus=stage;
    	
    	//YA ESTAMOS SOBRE EL TECLADO EN SI
    	stage.addEventListener(KeyboardEvent.KEY_DOWN, presionoTecla, false, 0, true);
    	stage.addEventListener(KeyboardEvent.KEY_UP, sueltoTecla, false, 0, true);
    	//EL LISTENER PARA LA FUNCION MOVER QUE VA A ESCUCHAR A CADA FRAME
    	stage.addEventListener(Event.ENTER_FRAME, mover, false, 0, true);
    }
    	
    	function mover(e:Event):void {
    		
    	if (derecha&&inclinadoDer==false) {
    		coches.rotation+=20;
    		//CON inclinadoDer Y EN TRUE YA SE MARCA QUE SE HIZO  
    		//Y NO VUELVA A HACERSE GRACIAS QUE EL IF LO PIDE
    		//EN FALSE
    		inclinadoDer=true;
    	}	
    		
    		if (derecha) {
    		coches.x+=9;
    		//MUEVE EN X Y AL ESCALAR CON +1 ES LO CONTRARIO AL -1
    		//QUE SUCEDE CON LA IZQUIERDA QUE ES COMO HACER FLIP
    		//coches.scaleX=+1;
    		//QUIERO QUE LA POSICION SE ARREGLE CUANDO SUELTO (DERECHA)
    		pulsadoRight=true;
    		//SACO EL BLOQUEO
    		bloqueadorRight=false;
    	} else {
    		pulsadoRight=false;
    	}
    		
    		//CUANDO ESTA SIN EL BLOQUEO Y LA TECLA DESPULSADO {
    	if (pulsadoRight==false&&bloqueadorRight==false) {
    		//ES ROTACION -10 PORQUE AL HACER (derecha) LE SUME +10
    		coches.rotation-=20;
    		//Y LUEGO DE QUE ARREGLE LA POSCION PONGO A
    		//bloqueadorRight EN TRUE PARA QUE NO SIGA HACIENDO -10  
    		//GRACIAS A LA CONDICION DEL IF,QUE LO PIDE EN FALSE
    		bloqueadorRight=true;
    		inclinadoDer=false;
    	}
    	
    		//////////////////////TODO LO MISMO PARA LA IZQUIERDA AHORA
    	//////////////////////AL REVES EL MOV. EN X Y LA ROTACION
    		
    		if (izquierda) {
    		coches.x-=9;
    		pulsadoLeft=true;
    		bloqueadorLeft=false;
    	} else {
    		pulsadoLeft=false;
    		}
    		
    		if (izquierda&&inclinadoIzq==false) {
    		coches.rotation-=20;
    		inclinadoIzq=true;
    	}
    	
    	if (pulsadoLeft==false&&bloqueadorLeft==false) {
    		coches.rotation+=20;
    		bloqueadorLeft=true;
    		inclinadoIzq=false;
    	}
    		
    		if (arriba) {
    		coches.y-=5;
    		}
    		if(abajo) {
    		coches.y+=4;
    		}
    		
    	if (coches.x>stage.stageWidth-coches.width/2 - 95) {
    		coches.x-=10;
    		coches.chispasder.visible=true;
    	}else{
    		coches.chispasder.visible=false;
    	}
    	
    	if (coches.x<coches.width/2 + 95) {
    		coches.x+=10;
    		coches.chispasizq.visible=true;
    	}else{
    		coches.chispasizq.visible=false;
    	}
    	
    	if (coches.y>stage.stageHeight-coches.height/2) {
    		coches.y-=4;
    	}
    	
    	if (coches.y<0 + coches.height/2) {
    		coches.y+=5;
    	}
    }
    	
    	function sueltoTecla(event:KeyboardEvent):void {
    	switch (event.keyCode) {
    		case Keyboard.LEFT :
    			izquierda=false;
    			break;
    		case Keyboard.RIGHT :
    			derecha=false;
    			break;
    		case Keyboard.UP :
    			arriba=false;
    			break;
    		case Keyboard.DOWN :
    			abajo=false;
    			break;
    		default :
    			break;
    	}
    }
    
    function presionoTecla(event:KeyboardEvent):void {
    	switch (event.keyCode) {
    		case Keyboard.LEFT :
    			izquierda=true;
    			break;
    		case Keyboard.RIGHT :
    			derecha=true;
    			break;
    		case Keyboard.UP :
    			arriba=true;
    			break;
    		case Keyboard.DOWN :
    			abajo=true;
    			break;
    		default :
    			break;
    	}
    }
    Part TWO:

    Code:
    function crearID():void {
    	rivaleses=new rivales();
    	var espacioalaizq:int= 0 + pasto1.width + borde1.width + rivaleses.width/2;
    	var espacioalader:int= stage.stageWidth - (pasto2.width + borde2.width + rivaleses.width/2);
    	var num:int = Math.floor(Math.random() * (espacioalader - espacioalaizq + 1)) + espacioalaizq;
    	rivaleses.y=10;
    	rivaleses.x= num;
    	rivaleses.addEventListener(Event.ENTER_FRAME,dropEnemy);
    	miniauto.addEventListener(Event.ENTER_FRAME,avanzaMini);
    	addChild(rivaleses);
    }
    
    function dropEnemy(e:Event):void {
    	var caer:rivales=rivales(e.target);
    	rivaleses.y+=10;
    	if (rivaleses.hitTestObject(coches) && coches.alpha== 1) {
    		//coches.visible=false;
    		coches.alpha= 0.5;
    		numerodevidas-=1;		
    		//trace(numerodevidas);
    		vidas();
    	}
    		if (numerodevidas== 0) {
    			rivaleses.visible=false;
    	}
    }
    
    function avanzaMini(e:Event):void {
    	if(miniauto.hitTestObject(bandera.bandera_llegada)) {
    	miniauto.removeEventListener(Event.ENTER_FRAME,avanzaMini);
    	clearInterval(crearIDenemigo);
    	timer.addEventListener(TimerEvent.TIMER,llamame_a_la_otra);
    	timer.start();
    	}else{
    	miniauto.y-=0.5;
    	}
    }
    function llamame_a_la_otra(e:TimerEvent):void{
    	llegada_grande.addEventListener(Event.ENTER_FRAME,banderaCuadros);
    }
    
    function banderaCuadros(e:Event):void {
    	llegada_grande.y+=17;
    	if(coches.hitTestObject(llegada_grande.llegada)) {
    		llegada_grande.removeEventListener(Event.ENTER_FRAME,banderaCuadros);
    		rivaleses.removeEventListener(Event.ENTER_FRAME,dropEnemy);
    		removeChild(rivaleses);
    		stage.removeEventListener(Event.ENTER_FRAME, mover);
    		rayas.stop();
    		coches.chispasder.visible=false;
    		coches.chispasizq.visible=false;
    		
    	}
    }
    
    function vidas():void {
    	coches.x=300;
    	coches.y=300; 
    	if (numerodevidas== 2){
    	vida3.visible=false;
    	tiempo.addEventListener(TimerEvent.TIMER,llamame_a_la_transparencia);
    	tiempo.start();
    	}
    if (numerodevidas== 1){
    	vida2.visible=false;
    	tiempo.addEventListener(TimerEvent.TIMER,llamame_a_la_transparencia);
    	tiempo.start();
    }
    if (numerodevidas== 0) {
    	vida1.visible=false;
    	rivaleses.addEventListener(Event.ENTER_FRAME,dropEnemy);
    	llegada_grande.removeEventListener(Event.ENTER_FRAME,banderaCuadros);
    
    	stage.removeEventListener(Event.ENTER_FRAME, mover);
    	rivaleses.visible=false;
    	removeChild(rivaleses);
    	removeChild(coches);
    	rayas.stop();
    	coches.chispasder.visible=false;
    	coches.chispasizq.visible=false;
    	clearInterval(crearIDenemigo);
    	miniauto.removeEventListener(Event.ENTER_FRAME,avanzaMini);
    }
    }
    	
    function llamame_a_la_transparencia(e:TimerEvent):void{
    	stage.addEventListener(Event.ENTER_FRAME, transparencia, false, 0, true);
    }
    
    function transparencia(e:Event):void{
    	if(coches.alpha<1){
    coches.alpha+=0.5;
    	}
    	else{
    	stage.removeEventListener(Event.ENTER_FRAME, transparencia); 
    	tiempo.stop();
    	tiempo.removeEventListener(TimerEvent.TIMER,llamame_a_la_transparencia);
    	}
    }
    iniciarJuego()
    Thank you for the help provided ! Lio

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  




Click Here to Expand Forum to Full Width

HTML5 Development Center