Comunidad de diseño web y desarrollo en internet online

Movimientos de personajes en Juegos RPG tipo Zelda

En este tip voy a explicarles como realizar los movimientos de un personaje en un juego RPG, debido a que me encuentro realizando un juego de este estilo y queria mostrarles la forma en la que lo he realizado. Más adelante voy a publicar otro tip de como manejar los obstáculos y las colisiones.

Este es el ejemplo del movimiento:


(pulsar en el fondo verde y mover las flechas para que se mueva la niña)


Cada postura del personaje corresponde a un fotograma del MovieClip que contiene a la niña.

La explicación está en el código. Voy a comentar el código para que quede lo más claro posible.

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


Descargar Archivos

La niña tierna la saque de http://www.spriters-resource.com. Una web que colecciona Sprites de juegos de varias consolas.

Hay mas web que coleccionan sprites de juegos:
http://www.retrogamezone.co.uk/
http://www.videogamesprites.net/
http://laalianza.forogratis.es/index.php/
http://timesprites.orgfree.com/
http://www.gsarchives.net/index2.php

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate