Comunidad de diseño web y desarrollo en internet online

funcion que no puedo eliminar

Citar            
MensajeEscrito el 02 Ago 2010 11:43 pm
Hola como andan?
Tengo un juego en el AS3,, en el que tenes que mover una ranita en X para atrapar a las moscas que caen y haces puntos..
lo tengo casi terminado asi coom para entregar en el parcial, pero tengo un problema que no puedo arreglar porque cada vez que apreto en el boton que te lleva ajugar de nuevo
la funcion "mover" es llamada dos veces y afecta la velocidad del movimiento de la rana...

Sería facil removerla con

Código :

stage.removeEventListener(Event.ENTER_FRAME , mover);

me dijeron, pero cuando lo hago me dice el compilador que estoy accediendo a una propiedad no definida
No importa donde lo pongo.

Y me meti en foros en ingles, antes de encontrar este, poque no estoy muy ducho en el tema..

me dijeron que pruebe convirtiendo eso en variable asi queda una referencia , pero lo que me dijeron sigue sin funcionar
Si alguien me da una mano le agradeceria mucho


Entonces posteo el código, disculpen que esta muy comentado es que me lo piden asi

EL PRIMER FRAME DE AS, para el comienzo

Código :

//PARA QUE NO ARRANQUE DE UNA
stop();
//PARA MODIFICAR EL TEXTO DINAMICO DEL BOTON
start_mc.but_txt.text="Comenzar";
//PARA QUE LE BOTON ESTE HABILITADO
start_mc.buttonMode=true;
//ASI PODEMOS TOCAR SIN QUE INFLUYA LO DE ADENTRO DEL BOTON
start_mc.mouseChildren=false;

function comenzarjuego (e:MouseEvent):void{
   
   
   gotoAndStop("juego");
   
}
start_mc.addEventListener(MouseEvent.CLICK,comenzarjuego);


EL SEGUNDO FRAME DE AS, CON LA LINEA DE LA FUNCION MOVER Y EL JUEGO EN SI

Código :

//A LA RANA LE DAMOS LA CLASE QUE LE CREAMOS
var agarrador:Agarrador;
//PARA CREAR VARIOS ENEMIGOS
var crearIDenemigo:uint;
//VA A SERVIR PARA CADA CUANTO APARECEN
var velocidadJuego:uint;
var atrapadasText:TextField;
var erradasText:TextField;
var score:uint=0;

//PARA EMPEZAR CON EL JUEGO
function iniciarJuego():void{
//SPAWNEO A MI PERSONAJE
   agarrador=new Agarrador();
   //LA POSICION DE MI PERSONAJE
   agarrador.x=400;
   agarrador.y=510;
   //PARA QUE NO APAREZCA DE UNA EN EL STAGE
   addChild(agarrador);
   //PARA ESPECIFICAR CADA CUANTO APARECE UN ENEMIGO
   //A MENOR VALOR MAS RAPIDO APARECEN
   velocidadJuego=500;
   //PARA EL INTERVALO DE ENEMIGOS EN APARECER
   crearIDenemigo=setInterval(crearID,velocidadJuego);
   //ESCONDE EL MOUSE
   Mouse.hide();
   erradasText=new TextField();
   erradasText.x=50;
   erradasText.y=50;
   addChild(erradasText);
   atrapadasText=new TextField();
   atrapadasText.x=250;
   atrapadasText.y=50;
   addChild(atrapadasText);
   erradasText.text=atrapadasText.text="0";
   
   //PARA MOVER LA RANITA CON EL TECLADO
   //IMPORTAS LOS EVENTOS DE TECLADO
   
   import flash.events.KeyboardEvent;
   //LA SIGUIENTE LINEA ES PARA QUE NO PIERDA EL FOCUS
   //AL HABER HECHO CLICK EN EL BOTON "COMENZAR"
   stage.stageFocusRect = false;
   stage.focus = stage;
   //YA ESTAMOS SOBRE EL TECLADO EN SI
stage.addEventListener(KeyboardEvent.KEY_DOWN, presionoTecla);
stage.addEventListener(KeyboardEvent.KEY_UP, sueltoTecla);
//EL LISTENER PARA LA FUNCION MOVER QUE VA A ESCUCHAR A CADA FRAME
stage.addEventListener(Event.ENTER_FRAME , mover);

//LAS VARIABLES TRUE O FALSE DE MOVIMIENTO A IZQ./DER. DE LA RANITA
var izquierda:Boolean;
var derecha:Boolean;

//DOS VARIABLES QUE LAS USO PARA MARCAR QUE YA ROTO UNA VEZ
//QUE ES COMO LO QUIERO PORQUE SINO EN VEZ DE MOVERSE
//EL PERSONAJE RODARIA CADA VEZ

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 = true;
var bloqueadorLeft= true;

function mover(e:Event):void {
   if (derecha&&inclinadoDer==false) {
      agarrador.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) {
      agarrador.x+=15
      //MUEVE EN X Y AL ESCALAR CON +1 ES LO CONTRARIO AL -1
      //QUE SUCEDE CON LA IZQUIERDA QUE ES COMO HACER FLIP
      agarrador.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
      agarrador.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) {
      agarrador.x-=15;
      pulsadoLeft=true;
      //SCALE EN -1 PORQUE LA RANA 
      //DE POR SI YA VIENE DE LADO DERECHO
      agarrador.scaleX=-1
      bloqueadorLeft = false;
   }else {
      pulsadoLeft=false;
      }
      
   if (izquierda&&inclinadoIzq==false) {
      agarrador.rotation-=20;
      inclinadoIzq = true;
   }
   
   if (pulsadoLeft==false&&bloqueadorLeft==false){
      agarrador.rotation+=20;
      bloqueadorLeft = true;
      inclinadoIzq = false;
   }
   
//PARA QUE NO SE VAYA DEL STAGE   
   if(agarrador.x > stage.stageWidth - agarrador.width / 2){
   agarrador.x-=15
   }
   if(agarrador.x < agarrador.width / 2){
   agarrador.x+=15
   }
   
   //OTRA SOLUCION /* 
/*var agarradorRightSide = agarrador.x + agarrador.width;
if (agarradorRightSide >= 800) {
agarrador.x = 759 - agarrador.width;
}
else if (agarrador.x <= 0) {
agarrador.x = 1;
} */
}
function sueltoTecla(event:KeyboardEvent):void {
   switch (event.keyCode) {
      
      
      case Keyboard.LEFT :
         izquierda=false;
         break;
      case Keyboard.RIGHT :
         derecha=false;
         break;
      default :
         break;
   }
}


function presionoTecla(event:KeyboardEvent):void {
   switch (event.keyCode) {
      case Keyboard.LEFT :
         izquierda=true;
         break;
      case Keyboard.RIGHT :
         derecha=true;
         break;
      default :
         break;
   }
}
//
}

//ESTAMOS CREANDO A LOS ENEMIGOS , DE LA CLASE CAYENDO
function crearID():void{
   var enemigo:Cayendo=new Cayendo()
   //QUE ESTE EN Y FUERA DE LA PANTALLA Y ALEATORIAMENTE EN X
   enemigo.y=-50;
   enemigo.x=Math.random()*stage.stageWidth;
   enemigo.addEventListener(Event.ENTER_FRAME,dropEnemy);
   // ESTO ES PARA AGREGARLOA  LA DISPLAY LIST Y QUE APAREZCA SINO NO CAE
   addChild(enemigo);
}

function dropEnemy(e:Event):void{
   //esto es para hacer mas facil la caida y que caiga de a 10 x frame
   //y se le podria agregar cosas de hit detection
   // CADA movieclip clase CAYENDO esta observado por el enterframe
   var mc:Cayendo=Cayendo(e.target);
   //PARA LA VELOCIDAD DE LA CAIDA DE LOS ENEMIGOS
   //A MAYOR VALOR MAS RAPIDO CAEN
   mc.y+=10
   //CONTACTO CON LA RANA O NO ATAJADA POR ELLA
   if(mc.hitTestObject(agarrador)){
      //FUNCION
      atrapadas(mc);
   }else if(mc.y>stage.stageHeight){
      //FUNCION
      erradas(mc);
   }
   
}
function atrapadas(mc:Cayendo):void{
   //HAY QUE DETENER EL EVENTO DE ENTERFRAME DE QUE CAIGAN MAS
   mc.removeEventListener(Event.ENTER_FRAME,dropEnemy);
   removeChild(mc);
   atrapadasText.text=String(Number(atrapadasText.text)+1);
   
}
function erradas(mc:Cayendo):void{
   //HAY QUE DETENER EL EVENTO DE ENTERFRAME DE QUE CAIGAN MAS
   mc.removeEventListener(Event.ENTER_FRAME,dropEnemy);
   removeChild(mc);
   erradasText.text=String(Number(erradasText.text)+1);
   //PARA EL GAME OVER
   if(erradasText.text=="5"){
      gameOver();
}
}

function gameOver():void{
   //ACA PARA QUE CALCULE EL PUNTAHE
   score=Number(atrapadasText.text);
   removeChild(agarrador);
   clearInterval(crearIDenemigo);
   removeChild(atrapadasText);
   removeChild(erradasText);
   //removimos todos los child pero POR AHI SOBRABA ALGUNO
   while(numChildren>0){
   //SI REMOVES EL 0 NO CORRES PELIGRO DE QUE SE CORRAN
   getChildAt(0).removeEventListener(Event.ENTER_FRAME,dropEnemy);
   //CON ESTO SE VAN CHUPANDO TODS A LA POSICION DE CERO Y ASI SE ELIMINAN
   removeChildAt(0);
   }
   gotoAndStop("game over");
   Mouse.show();
}
iniciarJuego();
stage.removeEventListener(Event.ENTER_FRAME , mover);

/*I get this solution from this forum before

You are adding an additional EventListener for the function "mover"
without removing the previous one. So on every frame, the "mover" function
gets called twice.
You could remove it by calling
"stage.removeEventListener(Event.ENTER_FRAME , mover);" 
*/


EL TERCER FRAME, CON EL GAME OVER Y VOLVER A JUGAR

Código :

start_mc.but_txt.text="Jugar de nuevo";
//PARA QUE LE BOTON ESTE HABILITADO
start_mc.buttonMode=true;
//ASI PODEMOS TOCAR SIN QUE INFLUYA LO DE ADENTRO DEL BOTON
start_mc.mouseChildren=false;
start_mc.addEventListener(MouseEvent.CLICK,comenzarjuego);

score_txt.text="GAME OVER\nHas comido "+score+" moscas!."
/*function comenzarjuego (e:MouseEvent):void{
   
   
   gotoAndStop("juego");
   
}*/ //NO HACE FALTA REESCRIBIRLA

porque la verdad , no le encuentro la vuelta
gracias!

Por lio89

18 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Ago 2010 01:32 am
en el frame 2 estas declarando funciones dentro de funciones y ademas haces import dentro de funciones.
el import utilizalo arriba del todo y todos juntos ahi, cuando uses clases va a ser asi y es lo mas ordenado y se usa en todos los programas.
despues lo de funciones dentro de funciones no lo hagas. declara una por una.

yo el removeEventListener lo pondria quizas antes de ir al gotoAndStop gameover porque ahi es cuando se termina el juego y no deberia seguir haciendo loop la funcion mover entonces lo terminas ahi

stage.removeEventListener(Event.ENTER_FRAME , mover);
siempre que creas un listener es bueno removerlo cuando ya no lo uses mas por ejemplo en el 3er frame despues que hacen click en comenzarJuego adentro de la funcion start_mc.removeEventListener(MouseEvent.CLICK,comenzarjuego);

y asi con todo.
tambien otra cosa que te recomiendo es que cuando pases del frame 2 al 3 los objetos que creaste los borraria como agarrador=new Agarrador();
quizas si los vas agregando a un array luego lo puedes recorrer con un for y les asignas = null;
yo no soy de trabajar con frames sino con clases pero creo que seria bueno eso.

Saludos

Por 22

79 de clabLevel



 

Uruguay

safari
Citar            
MensajeEscrito el 03 Ago 2010 04:39 am
Muchas gracias, sabes.. se me hacia dificil darme cuenta lo que me decias ..pero me di cuenta al ver el
mal posicionamiento de un corchete que causaba que una cosa quedase dentro de la otra ...

Ahora funciona muy bien todo
Me gustaria pedirte que me dijeras como seria el tema del array para eliminar esos objetos porque me sale mal
y creo que es importante, si un corchete causa tanto lio no me quiero imaginar esto

Sabes, no puedo usar start_mc.removeEventListener(MouseEvent.CLICK,comenzarjuego); sin que me de error o me bloquee el listener que quiero remover sin que se haya ejecutado

Se nota que soy completamente novato?

Por lio89

18 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Ago 2010 04:33 pm
si hay que tener mucho cuidado donde se cierra cada cosa, lo mejor es cuando ya creas la funcion abrirla y cerrarla.

el tema del array seria algo asi.
var misObjectos:Array = new Array();

misObjetos.push(Objeto1);
misObjetos.push(Objeto2);

function borrarObjetos():void{
for(var i:int = 0; i < misObjetos.length; i++){
misObjetos[i] = null;
}

ahi lo que haces es crear un array y ir llenandolo con los objetos a borrar y luego antes que salta el game over aplicas la funcion borrarObjetos();

lo otro del remove tiene que ir dentro de la misma funcion comenzarjuego y antes del gotoAndStop que te cambia de frame.

hay un muy buen curso en
www.illasaron.com
de action script 3

Saludos
}

Por 22

79 de clabLevel



 

Uruguay

safari

 

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