Título: codigo mlvimiento personaje flash (rpg) Publicado por: pajaras en 18 Noviembre 2011, 16:09 pm lo puse en programacion en general, pero creo que es mas adecuado aqui, lo siento por el doble post.
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 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; } } } } codigo encontrado en la web, como ejemplo |