En la universidad estoy haciendo un videojuego con flash, y estoy empezando a hacer el codigo para el movimiento de un personaje en camara isometrica y el fondo hecho con tiles. La cuestión es que para hacer el movimiento, tengo que hacer como "maquina de estados" para cada estado definir sus posibles movimientos, y este codigo puede ser muy largo. He buscado por la web, y hay ya codigos echos, pero no me acaban de gustar (muchos if, o echos con booleans, prefiero switch, case, break). Alguien de vosotros tiene o ha elaborado un codigo para esta funcion de mover un personaje?
PD: videojuego RPG, tipo zelda o boxhead.
Gracias a todos, pajaras
Código:
package
{
import flash.display.MovieClip;
import flash.events.KeyboardEvent; // Clase que permite detectar cuando una tecla se pulsa
import flash.ui.Keyboard; // Clase que se necesita para reconocer las teclas pulsadas
import flash.events.TimerEvent; // Clase que perminte crear temporizadores
import flash.utils.Timer;
public class JuanitaCaminando extends MovieClip // Esta es la clase del juego
{
// 4 Boleanos que permiten saber cuales flechas estan pulsadas
// Cuando de pulsa se pone en true y cuando se suelta en false
private var pulsadoLeft :Boolean = false;
private var pulsadoRight :Boolean = false;
private var pulsadoDown :Boolean = false;
private var pulsadoUp :Boolean = false;
// 2 Boleanos que indican el que estado esta juanita
private var caminando :Boolean = false;
private var parada :Boolean = true;
// Numero que indica hacia donde esta mirando juanita.
// Se utiliza para el movimiento y para la postura.
// Esta basado en las agujas de reloj.
// EJEM: Cuando direccion es 300 (osea 3:00), juanita se mueve a la derecha
// Cuando direccion es 130 (osea 1:30), juanita se mueve a la diagonal derecha
private var direccion :uint;
private var velocidad :uint = 4; // pixeles que se desplaza juanita
// Hay dos Timer para que el movimiento sea mas fluido...
// y para que el personaje se quede parada viendo en diagonal.
private var tiempoParaGirar :Timer = new Timer(50, 0);
private var tiempoParaMover :Timer = new Timer(20, 0);
public function JuanitaCaminando()
{
// listener que aviza cuando se pulsa una tecla
stage.addEventListener(KeyboardEvent.KEY_DOWN, pulsarTecla);
// listener que aviza cuando se suelta una tecla
stage.addEventListener(KeyboardEvent.KEY_UP, soltarTecla);
tiempoParaGirar.addEventListener(TimerEvent.TIMER, giraJuanita);
// activando temporizador que actualiza la postura de juanita.
// Ejecuta la funcion giraJuanita que esta mas abajo
tiempoParaGirar.start();
tiempoParaMover.addEventListener(TimerEvent.TIMER, moverJuanita);
}
// Funcion que se ejecuta cuando se pulsa una tecla
private function pulsarTecla(e:KeyboardEvent):void
{
// Segun la tecla que se pulse se activan los boleanos.
// investigar sobre switch en la ayuda de flash
switch(e.keyCode)
{
case Keyboard.LEFT:
pulsadoLeft = true;
break;
case Keyboard.RIGHT:
pulsadoRight = true;
break;
case Keyboard.UP:
pulsadoUp = true;
break;
case Keyboard.DOWN:
pulsadoDown = true;
break;
default:
break;
}
// Condicional que activa el temporizador que actualiza el movimiento de juanita
if (caminando == false)
{
tiempoParaMover.start(); // Se ejecuta moverJuanita();
}
// Esto hace que solo se active cuando se pulsa la tecla.
// y no siempre que este presionada
caminando = true;
}
private function soltarTecla(e:KeyboardEvent):void
{
// lo mismo que la funcion pulsarTecla pero al revez
switch(e.keyCode)
{
case Keyboard.LEFT:
pulsadoLeft = false;
break;
case Keyboard.RIGHT:
pulsadoRight = false;
break;
case Keyboard.UP:
pulsadoUp = false;
break;
case Keyboard.DOWN:
pulsadoDown = false;
break;
default:
break;
}
// Condicional que desactiva el temporizador, cuando todas...
// .. las teclas estan sueltas
if (pulsadoLeft == false &&
pulsadoRight == false &&
pulsadoUp == false &&
pulsadoDown == false )
{
caminando = false;
tiempoParaMover.stop(); // No se ejecuta moverJuanita();
}
}
// Funcion que controla la postura de juanita.
private function giraJuanita(e:TimerEvent):void
{
if (caminando == true)
{
// Caminado 12:00
// Dependiendo de las teclas pulsadas,..
// y si no ha sido antes verdadero este condicional...
// el MC llamado juanita va a un fotograma llamado caminando1200
// que corresponde a la postura correspondiente
if (pulsadoLeft == false &&
pulsadoRight == false &&
pulsadoUp == true &&
pulsadoDown == false &&
direccion != 1200)
{
juanita.gotoAndStop("caminando1200");
direccion = 1200; // Esto hace que solo se ejecute una vez
}
// Caminado 1:30
if (pulsadoLeft == false &&
pulsadoRight == true &&
pulsadoUp == true &&
pulsadoDown == false &&
direccion != 130)
{
juanita.gotoAndStop("caminando130");
direccion = 130;
}
// Caminado 3:00
if (pulsadoLeft == false &&
pulsadoRight == true &&
pulsadoUp == false &&
pulsadoDown == false &&
direccion != 300)
{
juanita.gotoAndStop("caminando300");
direccion = 300;
}
// Caminado 4:30
if (pulsadoLeft == false &&
pulsadoRight == true &&
pulsadoUp == false &&
pulsadoDown == true &&
direccion != 430)
{
juanita.gotoAndStop("caminando430");
direccion = 430;
}
// Caminado 6:00
if (pulsadoLeft == false &&
pulsadoRight == false &&
pulsadoUp == false &&
pulsadoDown == true &&
direccion != 600)
{
juanita.gotoAndStop("caminando600");
direccion = 600;
}
// Caminado 7:30
if (pulsadoLeft == true &&
pulsadoRight == false &&
pulsadoUp == false &&
pulsadoDown == true &&
direccion != 730)
{
juanita.gotoAndStop("caminando730");
direccion = 730;
}
// Caminado 9:00
if (pulsadoLeft == true &&
pulsadoRight == false &&
pulsadoUp == false &&
pulsadoDown == false &&
direccion != 900)
{
juanita.gotoAndStop("caminando900");
direccion = 900;
}
// Caminado 10:30
if (pulsadoLeft == true &&
pulsadoRight == false &&
pulsadoUp == true &&
pulsadoDown == false &&
direccion != 1030)
{
juanita.gotoAndStop("caminando1030");
direccion = 1030;
}
parada = false;
}
// Este else hace que cuando se detenga juanita, quede en la postura adecuada
else if(parada == false)
{
parada = true;
switch(direccion)
{
case 1200:
juanita.gotoAndStop("parada1200");
break;
case 130:
juanita.gotoAndStop("parada130");
break;
case 300:
juanita.gotoAndStop("parada300");
break;
case 430:
juanita.gotoAndStop("parada430");
break;
case 600:
juanita.gotoAndStop("parada600");
break;
case 730:
juanita.gotoAndStop("parada730");
break;
case 900:
juanita.gotoAndStop("parada900");
break;
case 1030:
juanita.gotoAndStop("parada1030");
break;
default:
break;
}
direccion = 0; // Para que no patine, si se oprime rapido la tecla.
}
}
private function moverJuanita(e:TimerEvent):void
{
// Dependiendo de la postura, camina hacia una direccion o otra.
// Esta es la mejor opcion cuando se trabaja con colicoines.
switch(direccion)
{
case 1200:
juanita.y -= velocidad;
break;
case 130:
// Lo de velocidad-1 es para que no vaya mas...
// ... rapido en diagonal que hacia los lados
juanita.x += velocidad-1;
juanita.y -= velocidad-1;
break;
case 300:
juanita.x += velocidad;
break;
case 430:
juanita.x += velocidad-1;
juanita.y += velocidad-1;
break;
case 600:
juanita.y += velocidad;
break;
case 730:
juanita.x -= velocidad-1;
juanita.y += velocidad-1;
break;
case 900:
juanita.x -= velocidad;
break;
case 1030:
juanita.x -= velocidad-1;
juanita.y -= velocidad-1;
break;
default:
break;
}
}
}
}