codigo movimiento personaje rpg flash

Iniciado por pajaras, 17 Noviembre 2011, 01:43 AM

0 Miembros y 1 Visitante están viendo este tema.

pajaras

Saludos a todos,
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

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;
         }
      }
   }
}

codigo encontrado en la web, como ejemplo