Comunidad de diseño web y desarrollo en internet online

Movimiento por la pantalla para un RGP

Citar            
MensajeEscrito el 04 Feb 2009 09:03 pm
Buenas,
Vereis tengo este código, pero tiene el fallo que si se mantiene la tecla pulsada, el codigo se ejecuta una y otra vez.

Código :

public function Principal():void
      {
         stage.addEventListener(KeyboardEvent.KEY_DOWN, TeclaPulsada);
         stage.addEventListener(KeyboardEvent.KEY_UP, TeclaSoltada);
      }
      private function TeclaPulsada(e:KeyboardEvent):void
      {
         switch(e.keyCode)
         {
            case Keyboard.UP:
               stage.addEventListener(Event.ENTER_FRAME, MoverArriba);
               break;
            case Keyboard.DOWN:
               stage.addEventListener(Event.ENTER_FRAME, MoverAbajo);
               break;
            case Keyboard.LEFT:
               stage.addEventListener(Event.ENTER_FRAME, MoverIzquierda);
               break;
            case Keyboard.RIGHT:
               stage.addEventListener(Event.ENTER_FRAME, MoverDerecha);
               break;
         }
      }

Para mi eso es un problema porque lo que necesito es que al pulsar una tecla, se añada el evento y se acabó. No quiero que siga ejecutando la funcion TeclaPulsada si deja pulsada la tecla, pero si pulta otra tecla quiero que se ejecute TeclaPulsada tambien una sola vez, aunque mantenga la tecla continuamente pulsada.
El evento ENTER_FRAME lo remuevo al soltar cada tecla.

Alguna idea de como podria hacer lo que digo??

Un saludo

Por X-TUS

94 de clabLevel



 

chrome
Citar            
MensajeEscrito el 04 Feb 2009 10:01 pm
He pensado en meter 4 variables booleanas, 1 para cada tecla.
Al pulsar la primera vez poner la variable a false y al soltar la tecla ponerla a true. Y dentro de cada case evaluar con un if el estado de la variable booleana, pero creo que deberia haber algo más sencillo que todo eso.

Un saludo

Por X-TUS

94 de clabLevel



 

chrome
Citar            
MensajeEscrito el 05 Feb 2009 03:42 pm
X-Tus, pues no. No hay otro modo más sencillo. De hecho es eso lo que se usa. Tenemos en cuatro variables booleanas "up","down","left" y "right" que al pulsar la tecla correspondiente se ponen a true y al soltarla tecla a false y, en un único onEnterFrame que se define en el stage (o en el rpg)

Código ActionScript :

stage.addEventListener(Event.ENTER_FRAME, moverRPG);

la función moverRPG incrementa la posición x e y según el valor de "up","down","left" y "right" sea true o false -y siempre que no se salgan de la pantalla, no choquen contra un objeto, etc, etc.

NOTA: Realmente la cosa se suele complicar un poco más para no depender de los fps que existan en cada momento (lo que se conoce como "Time Based Animation")
En un onEnterFrame se comprueba el tiempo transcurrido desde la última vez y se multiplica lo que cambiaría la x y la y por dicho tiempo. Vamos

Código ActionScript :

function moverRPG(event:Event) {
    var timeDiff:int = getTimer()-lastTime;
    lastTime += timeDiff;
    rpg.x += timeDiff*rpg.vel*(right);
    rpg.x -= timeDiff*rpg.vel*(left);
    rpg.y += timeDiff*rpg.vel*(down);
    rpg.y -= timeDiff*rpg.vel*(up);
}

Donde he supuesto que nuestro MC "rpg" tiene una variable "vel" (que es la velocidad) y, como variables de la clase tenemos, además de right, left, down y up, una variable "lastTime"
Estos "Time Based Animation" tienen la ventaja que la velocidad de nuestros MCs NO dependen de los fps de la película. Vale, a mayor fps el movimiento será más fluído. Recordemos que los fps no es un núemro que ponemos en las propiedades de nuestra película (que también) sino que se ven también condicionados por lo ocupada que esté la CPU en cada momento.
NOTA:Vale, he usado que, cuando realizamos una comparación, el valor devuelvo es true (vale 1) o false (vale 0). Lo hubiéramos podido hacer con "if"

Código ActionScript :

if (right){ //ó if (right==true)
   rpg.x += timeDiff*rpg.vel;
}

Lo que ocurre es que un "if" es bastante más "lento" que usar una multiplicación (son milimilimilimilimilisegundos), pero en un juego es importante ese tiempo.

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 05 Feb 2009 07:55 pm
He probado con las 4 variables + ifs y va muy fluido, el unico bug q tengo ahora es que tal y como he aplicado las animaciones, el personaje principal puede hacer el moonwalker, jejeje.
A ver si me pongo a corregirlo cuando tenga un rato...

Muchas gracias por toda la info. No tenia ni idea de lo del "Time Based Animation". No lo conocia. Cuando pueda me lo voy a estudiar a ver que tal.

Gracias

Por X-TUS

94 de clabLevel



 

chrome

 

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