La verdad es que soy demasiado nuevo en esto de AS3 y diran que el codigo que les estoy pasando es una locura pero bueno ustedes son mi ultima oportunidad y esperanza :/ . Intentare de darles esto de la forma mas ordenada posible.
La idea: Este codigo lo que se supopne que hace es que hay un fantasma y al pasar por donde esta el protagonista(pacman) le lanza un rayo.(aca entra addchild, agrega una "deadball" y esta a su vez al saber la hubicacion de pacman sube o baja).
El codigo: //////////////// mi problema se los enseño depues de este codigo ////////
Código ActionScript :
var minposi:Number=1; var maxposi:Number=4; var pocisiondelghost:Number=0; var actuar:Boolean=true; var moverseghost:Boolean=false; var tiempoenqueaparece:Timer=new Timer(6000,1); ///saca un numero al azar cada cierto tiempo tiempoenqueaparece.addEventListener(TimerEvent.TIMER, tiempapaghost); function tiempapaghost (aost:TimerEvent){ pocisiondelghost=Math.floor(Math.random()*(maxposi-minposi+1)+minposi); tiempoenqueaparece.stop(); } ////determina un lugar al azar para aparecer stage.addEventListener(Event.ENTER_FRAME, goshtA); function goshtA (gosta:Event):void{ if (nivelrecord>=6 && actuar){ tiempoenqueaparece.start(); if(pocisiondelghost==1){ actuar=false; ghost.rotation=-90 ghost.x=733,15; ghost.y=33,95; pocisiondelghost=0; moverseghost=true; tiempoenqueaparece.reset(); }else if(pocisiondelghost==2){ actuar=false; ghost.rotation=90 ghost.x=-55,35 ghost.y=33,95; pocisiondelghost=0; moverseghost=true; tiempoenqueaparece.reset(); }else if(pocisiondelghost==3){ actuar=false; ghost.rotation=-90 ghost.x=733,15; ghost.y=443,05; pocisiondelghost=0; moverseghost=true; tiempoenqueaparece.reset(); }else if(pocisiondelghost==4){ actuar=false; ghost.rotation=90 ghost.x=-55,35; ghost.y=440,05; pocisiondelghost=0; moverseghost=true; tiempoenqueaparece.reset(); } } } //// agrega la deadball stage.addEventListener(Event.ENTER_FRAME, principal); function principal (gosth:Event){ var deadballMC:Sprite=new Sprite; addChild(deadballMC); var deadballnueva:MORTALdeadball=new MORTALdeadball; colidead.x=ghost.x colidead.y=ghost.y if (moverseghost && pacman.hitTestObject(colidead)){ moverseghost=false; ghost.gotoAndPlay("lanzar"); deadballnueva.y=ghost.y; deadballnueva.x=ghost.x; deadballMC.addChild(deadballnueva); } //// quita la deadball si pasa los limites del mapa stage.addEventListener(Event.ENTER_FRAME, quitabala ); function quitabala (eventoquitabala :Event){ if (deadballnueva != null){ if (deadballMC.numChildren>0 && (deadballnueva.hitTestObject(quitarayo2) || deadballnueva.deadcigarro2.hitTestObject(quitarayo1))){ deadballMC.removeChild(deadballnueva); actuar=true; }}} ///// quita la deadball si toca a pacman stage.addEventListener(Event.ENTER_FRAME, tocapacman) function tocapacman(evento2:Event){ if (deadballnueva != null){ if (pacman.hitTestObject(deadballnueva) && deadballMC.numChildren>0 ){ deadballMC.removeChild(deadballnueva); pacman.gotoAndPlay("dead"); skinpacman.gotoAndPlay("dead"); Mspacman.gotoAndPlay("dead"); fantasma1.visible=false; fantasma1.x=348,4; fantasma1.y=180,7; fantasma2.visible=false; fantasma2.x=310,3; fantasma2.y=224,90; fantasma3.visible=false; fantasma3.x=349,8; fantasma3.y=224,90; fantasma4.visible=false; fantasma4.x=389,3; fantasma4.y=224,90; velocidadfantasma=0; direccion2=1; direccion3=2; direccion2=1; vivo=false; velocidad=0; vidas-=1; reaparece=true; tener=false; tiemporeapa.start(); actuar=true; } } } //// deadball sube o baja segun sea la hubicacion deadballnueva.addEventListener(Event.ENTER_FRAME, bajaosube); function bajaosube(eventobajaosube:Event){ if (pacman.y>ghost.y){ deadballnueva.deadcigarro2.y+=8; }else if (pacman.y<ghost.y){ deadballnueva.deadcigarro2.y-=8; }else if (deadballMC.numChildren>0){ deadballMC.removeChild(deadballnueva); } } //// remueve todos los enterframes al perder todas las vidas addEventListener(Event.ENTER_FRAME, removerenterframes); function removerenterframes(remover:Event){ if (vidas<0 && deadballMC.numChildren>0){ deadballnueva.removeEventListener(Event.ENTER_FRAME, bajaosube); stage.removeEventListener(Event.ENTER_FRAME, tocapacman) stage.removeEventListener(Event.ENTER_FRAME, quitabala ); removeEventListener(Event.ENTER_FRAME, removerenterframes); deadballMC.removeChildAt(0); } } } ///////////////// ///// movimiento del fantasma stage.addEventListener(Event.ENTER_FRAME, goshtH2); function goshtH2 (gosth2:Event){ if(moverseghost && pacman.x>ghost.x){ ghost.x+=4; }else if(moverseghost && pacman.x<ghost.x){ ghost.x-=4; }else if (moverseghost==false && pacman.x<ghost.x){ ghost.x+=4; }else{ ghost.x-=4; } }
///////////////
El problema: el codigo funciona perfectamente en el su momento, lo que pasa es que una vez que pasas a otra pantalla del juego (ya sea game over) el flash da "Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo." eso significa que en la otra pantalla hay algo a lo que no se puede acceder porque no existe, por lo que intente arreglarlo con removeEventListener, pero si se dan cuenta hay EnterFrames dentro de el Enterframe llamado "principal" y los removeEventListener no funciona con los enter frames que estan el dentro del "EnterFrame principal" por lo que opte por separar todos los EnterFrames para que no esten todos dentro de "principal" pero ahora lo que deja de funcionar es el addchild (el fantassma deja de lanzar el rayo) pero se arregla el error de "Nulo" intente de muchas formas relacionar el addchild con los otro enter frames pero no lo consigo.
PD: el codigo del juego completo es muy grande casi 2500 lineas de codigo pero creanme si pongo de solo lectura solo esta parte del codigo tambien se arregla.