Comunidad de diseño web y desarrollo en internet online

Fallo de animación de personaje en un plataformas

Citar            
MensajeEscrito el 17 Nov 2010 03:24 pm
Saludos Cristalab, necesito otro de vuestros sabios consejos. Llevo tiempo con un juego de plataformas en flash y tengo la base hecha pero a su vez, me falla algo. Lo explico detalladamente aqui abajo:

El personaje se mueve, con 3 clips de pelicula que he creado dentro de el, normal (quieto), caminar (flechas derecha o izquierda) y salto (flecha hacia arriba). Funcionan, peor no tienen fin. Cuando desplazo al personaje por el nivel creado, hace la animación de moverse, pero cuando suelto la tecla y el eprsonaje deja de desplazarse, sigue haciendo la animación de caminar... como si quisiera bailar el moonwalk o algo asi... gracioso, pero innecesario. A su vez, si salto, cae al suelo del nivel con la postura de "salto" y en ningun caso vuelve a realizar la animación de "normal".

Las 3 animaciones (jugador1normal, Caminar y salto) son clips de película dentro del personaje (mcPlayer1) que es otro clip de película. El codigo para que el personaje haga esos movimientos esta en un clip a parte, no visible en el juego y es este:

Código ActionScript :

onClipEvent(enterFrame){
   Jugador=_root.mcPlayer1;
   if (Key.isDown(Key.RIGHT)){
      Jugador._xscale=100;
      Jugador.gotoAndStop("caminar");
   } else if (Key.isDown(Key.LEFT)) {
      Jugador._xscale=-100;
      Jugador.gotoAndStop("caminar");
   } else {
      Jugador.gotoAndStop("jugador1normal");
   } if (Key.isDown(Key.UP)){
      Jugador._yscale=100;
      Jugador.gotoAndStop("Salto");
   }
   this._visible=false;
}

¿Porque no vuelve a reproducir la animación normal si no pulso ninguna tecla y sigue reproduciendo la otra? Si fuera neecsario, podria subir el archivo .fla en formato cs4 y cs5. Espero vuestras respuestas para corregirme, XD.

PD: como otro fallo menor, el personaje en el aire saltando, hace la animación de caminar si pulso las flechas de dirección, no me preocupa tanto, pero también me gustaria corregir eso. Gracias adelantadas.

Por Kotaro

11 de clabLevel



 

Lleida, España

safari
Citar            
MensajeEscrito el 17 Nov 2010 04:58 pm
Lo que te falta es una variable o 2 que te avisen que estas o no gaciendo el pj po ej
este es el script que uso para mis jueos de plataformas

Código ActionScript :

var caminando:Number = 0;

   //jugador1

if (caminando == 0){mcPlayer1.gotoAndStop(3)
} else if (caminando == 2) 
{mcPlayer1.gotoAndStop(2)}
else if( caminando == 1) (mcPlayer1.gotoAndStop(1))

//izquierda
if(Key.isDown(Key.LEFT)){
mcPlayer1.dx -= mcPlayer1.vel;
caminando = 1;
saberdir = 1;
}
if(!(Key.isDown(Key.LEFT)&(Key.RIGHT))){caminando = 0;}

if(Key.isDown(Key.RIGHT)){ //derecha
mcPlayer1.dx += mcPlayer1.vel;
 caminando = 2;
 saberdir =  2;
}

//patada
if(Key.isDown(Key.DOWN)){
caminando = 10;
pegando= true;

if (saberdir == 2){mcPlayer1.gotoAndStop(4)}
else if (saberdir == 1){mcPlayer1.gotoAndStop(5)}}
if(!(Key.isDown(Key.DOWN))){pegando = false}

//arriba
if(Key.isDown(Key.UP)&&mcPlayer1.saltando==false){
salta(mcPlayer1);
}else if(Key.isDown(Key.UP)&&mcPlayer1.empezoSalto>0){
mcPlayer1.dy-=mcPlayer1.salto;
}
mcPlayer1.empezoSalto--;
}

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

firefox
Citar            
MensajeEscrito el 17 Nov 2010 05:13 pm
:? Variables no me faltan, este es el codigo que uso para mover el personaje (Este codigo esta en una capa de la pagina principal, no en el personaje.):

Código ActionScript :

stop();

//variables
var velLateral:Number = 3;
var friccion:Number = .8;
var friccionAire:Number = .8;
var gravedad:Number = -3;
var tiempoSalto:Number = 4;
var salto:Number = 30/tiempoSalto;
var velMaxima:Number = 20;

var puntoIzq:Number = -15;
var puntoDer:Number = 15;
var puntoBajo:Number = 25;
var puntoArriba:Number = -25;
 
onEnterFrame = manejarPersonaje;
inicializarPersonaje(mcPlayer1);
mcPlayer1.onEnterFrame = aplicarMovimiento;

function inicializarPersonaje(mc:MovieClip):Void{
   if(mc.dx==undefined){
      mc.dx = 0;
      mc.dy = 0;
      mc.saltando = true;
      mc.empezoSalto=0;
   }
   mc.friccion = friccion;
   mc.vel = velLateral;
   mc.salto = salto;
}

function manejarPersonaje():Void{
   //jugador1
   if(Key.isDown(Key.LEFT)){
      mcPlayer1.dx -= mcPlayer1.vel;
      correIzq(mcPlayer1);
   }
   if(Key.isDown(Key.RIGHT)){
      mcPlayer1.dx += mcPlayer1.vel;
   }
   
   if(Key.isDown(Key.UP)&&mcPlayer1.saltando==false){
      salta(mcPlayer1);
   }else if(Key.isDown(Key.UP)&&mcPlayer1.empezoSalto>0){
      mcPlayer1.dy-=mcPlayer1.salto;
   }
   mcPlayer1.empezoSalto--;
}

function salta(mc:MovieClip):Void{
   inicializarPersonaje(mc);
   mc.friccion = friccionAire;
   mc.dy -= mc.salto;
   mc.saltando = true;
   mc.empezoSalto=tiempoSalto;
}

function aplicarMovimiento():Void{
   this._x+=this.dx;
   this.dx*=this.friccion;
   
   if(this.dx>velMaxima){
      this.dx=velMaxima;
   }else if(this.dx<-velMaxima){
      this.dx=-velMaxima;
   }
   
   this._y+=this.dy;
   
   if(!mcSuelo.hitTest(this._x,this._y+puntoBajo+1,true)){
      this.saltando = true;
   }
   
   if(this.saltando){
      this.suelo = 0;
      this.dy-=gravedad;
      if(this.dy>salto*tiempoSalto){
         this.dy = salto*tiempoSalto;
      }
   }
   
   checarColisiones(this);
   
   vCam._x=this._x;
   vCam._y=this._y;
   vCam.camControl();
}

function checarColisiones(mc:MovieClip):Void{
   
   //pega arriba
   while(mcSuelo.hitTest(mc._x,mc._y+puntoArriba,true)){
      mc._y++;
      mc.dy = Math.abs(mc.dy);
   }
   
   //pega abajo
   while(mcSuelo.hitTest(mc._x,mc._y+puntoBajo,true)){
      mc.saltando = false;
      mc._y--;
      mc.dy = 0;
   }
   
   //pega izq   
   while(mcSuelo.hitTest(mc._x+puntoIzq+1,mc._y,true)){
      mc._x++;
      mc.dx=0;
   }
   while(mcSuelo.hitTest(mc._x+puntoIzq+1,mc._y+puntoBajo/2,true)){
      mc._x++;
      mc.dx=0;
   }
   
   //pega der
   while(mcSuelo.hitTest(mc._x+puntoDer-1,mc._y,true)){
      mc._x--;
      mc.dx=0;
   }
   while(mcSuelo.hitTest(mc._x+puntoDer-1,mc._y+puntoBajo/2,true)){
      mc._x--;
      mc.dx=0;
   }
}

:? Yo no cree el codigo, lo vi en un tutorial de internet y al ver que era perfecto, ahora es el que utilizo. Es un control que no pienso cambiar, ya que es realmente bueno, solo lo tocare si me soluciona el problema de la animación. ¿es problema de este codigo? El movimiento me lo hace bien, lo que me falla es la animación... no se...

Por Kotaro

11 de clabLevel



 

Lleida, España

safari
Citar            
MensajeEscrito el 17 Nov 2010 05:54 pm
El mio es un molificación de ese mismo código pero no me entendiste, te voy a dar una solución mira crea en el mismo mc que
tenes al player las animaciones correspondientes cundo esta quieto y crea en el onEnterFrame
un

Código ActionScript :

if(KeyisUp(Key.Left or Key.RIGHT){ gotoAndStop(quieto) }//o gotoAndPlay si quito tiene anomacion

el echo es que por si solo flash no sabe que tiene que detener la animación eso se lo tienes que ordenar tu

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

firefox
Citar            
MensajeEscrito el 17 Nov 2010 07:03 pm
el simbolo para or en AS es ||

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

firefox
Citar            
MensajeEscrito el 17 Nov 2010 07:26 pm
¿Debo ponerlo en el primer codigo que he pasado? Actionscript no parece reconocer que significa KeyisUp... peor creo que el codigo que he puesto antes ya lo dice:

Código ActionScript :

onClipEvent(enterFrame){ 
   Jugador=_root.mcPlayer1; 
   if (Key.isDown(Key.RIGHT)){ 
      Jugador._xscale=100; 
      Jugador.gotoAndStop("caminar"); 
   } else if (Key.isDown(Key.LEFT)) { 
      Jugador._xscale=-100; 
      Jugador.gotoAndStop("caminar"); 
   } else { 
      Jugador.gotoAndStop("jugador1normal"); 
   } if (Key.isDown(Key.UP)){ 
      Jugador._yscale=100; 
      Jugador.gotoAndStop("Salto"); 
   } 
   this._visible=false; 
}

El codigo alega que si pulso LEFT o RIGHT haga las animaciones, y cuando no las pulso, que reinicie la animación anterior de "jugador1normal". No se si habre instertado mal tu codigo o en sitio equivocado, pero no me ha funcionado.

Por Kotaro

11 de clabLevel



 

Lleida, España

safari
Citar            
MensajeEscrito el 17 Nov 2010 09:30 pm
Wow tienes tremendo lió, ese código que es? cual usas el otro o este para manejar el Pj?

mira como te voy a mostrar mas o menos como lo haría yo desde 0
Creamos nuestra película bla bla creamos un MC(en nuestro caso Player1) dentro de e
creamos 3 nuevos mc uno caminando a la derecha otro a la izquierda y otro haciendo una animación quieto
bien tenemos nuestro MC instanciado como "Player1"
bien ahora en el Primer KeyFrame de nuestra escena principal ponemos este código

Código ActionScript :


var listKey:Object = new Object();//creamos un objeto a escuchar
//le asignamos a nuestro objeto la propiedad onKeyDonw osea cuando presione una tecla llama a la función manejaPj
listKey.onKeyDown = function () {
manejaPj(Player1)
//Lo mismo pero ahora cuando soltamos una tecla
listKey.onKeyUp = function () {
Quieto(Player1,3)
}
Key.addListener(listKey);
//Aca estan las acciones correspondientes a cada evento
function manejaPj(MC:MovieClip, Anim1:MovieClip,Anim2:MovieClip,Anim3:MovieClip)
{
if(Key.isDown(Key.LEFT)){MC.gotoAndStop(2);MC._x-=6}
if(Key.isDown(Key.RIGHT)){MC.gotoAndStop(1);MC._x+=6}
}
function Quieto(MC:MovieClip,f:Number)
{
MC.gotoAndStop(f)
}

esta seria creo yo la manera mas correcta de hacerlo la otra manera que te dije antes no funciona me equivoque = ahí otra maneras con el código que tenes pero si no lo entender completa mente el código que estas usando te va a causar muchos problemas en el futuro te recomiendo que empieces con tu propio código, aunque no sea perfecto te va a ser mas facil en el futuro

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

firefox
Citar            
MensajeEscrito el 17 Nov 2010 10:41 pm
He hecho alguna prueba mas y he solucionado parte del problema cambiado el script del personaje, cambiado los gotoAndStop, por gotoAndPlay, sin tocar nada mas. A veces me vuelve a la animación "jugador1normal" (la de cuando esta quieto), pero usualmente sigue con las animaciones de caminar o salto. En verdad no creo que sea lo que busco, asi que he vuelto a dejarlo todo en gotoAndStop.

Perdón si estoy liando mucho esto, es un poco dificil de explicar y tampoco tengo mucho dominio de actionscript, aunque me defienda normalmente. por ello, dejo aqui mi "juego" en versión beta para flash CS4 y CS5. como ya he dicho, el movimiento con teclado esta perfecto, solo falla la animación del personaje al caminar... Pesa muy poco, pues son apenas 5 cajas de vectores y el personaje, sin musica, ni fotografias, ni efectos, ni nada. Las animaciones estan dentro del personaje.... Gracias y a ver si esta vez lo soluciono por fin.

PD: MaxiSan20, tu ayuda de momento me ha permitido arregar alguna cosilla y te estoy muy agradecido. Si puedo facilitarte las cosas dejando aqui el proyecto disponible, pues mucho mejor. No busco que me hagan el trabajo los demas, solo que se me ayude
PD2: No es un virus ni lo tiene, tengo cosas mejores que hacer que ir fastidiando a los demas, y todavia menos a programadores y flasheros...

Por Kotaro

11 de clabLevel



 

Lleida, España

safari
Citar            
MensajeEscrito el 18 Nov 2010 12:04 am
Che sabes que me abre una pagina en blanco si podes subilo a MU,
y justamente por lo que me dices es que te digo que empieces de 0 tu código mira yo no soy exporto y me falta
bastante para considerarme avanzado apenas hace unos mese que estoy intensivo con as y me he dado cuenta que si
quiero hacer un juego lo mejor es escribe el código linea por linea uno mismo aunque el código no sea tuyo
hacer copy paste no te ayuda en nada a aprender mira te subo un ejemplo de los movimientos con el código que te pase
http://www.megaupload.com/?d=O6GLPXK2
solo es un consejo si de lo contrario solo quieres hacer tu juego y no aprender realmente como anda tu juego bueno entonces
capas que si te conviene agarrar otro script y modificar los MC. Yo como sugerencia te diria toma como referencia el código
que conseguiste y investiga para que sirve cada código que hay en el así tu puedes hacer uno personalizado a tu manera.
Yo te ayudo en todo lo que pueda ya que gracias a la ayuda de algunos clabels he aprendido mucho y devolverlo que pueda.
mira yo creo que para un juego de plataformas lo mas dificil es pensar en la aventura y no el tema de programación, si queres
te ayudo y terminas ese juego con un código personalizado solo para tu juego.

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

firefox
Citar            
MensajeEscrito el 18 Nov 2010 01:07 am
ya pude descargar, el código para ese script es "perfecto" solo para cuando tienes un Pj cuadrado con esas medidas pero,
cuando quieras poner un pj con cualquier otra característica las colisiones empiezan a fallar por mas que modifiques los puntos
no vas a lograr las misma precisión aunque es bueno el método que usa para las colisiones no es el mejor ni la mejor manera, bueno
como te dije si tienes una aventura pensada me gustaría ayudarte con el código, ya que seria una buena practica para ambos.

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

firefox
Citar            
MensajeEscrito el 18 Nov 2010 02:27 pm
Vale, te paso mi contacto por mensaje privado de foro. Si algun otro usuario se anima a resolver el problema....

Por Kotaro

11 de clabLevel



 

Lleida, España

safari
Citar            
MensajeEscrito el 19 Nov 2010 01:06 am
Con esto lo solucionas el problema

Código ActionScript :

var listKey:Object = new Object();//creamos un objeto a escuchar 
listKey.onKeyUp = function () { 
Quieto() 
} 
Key.addListener(listKey); 
//Aca estan las acciones correspondientes a cada evento 

function Quieto(MC:MovieClip,f:Number) 
{ 
Nombre_instancia_de_tu_layer.gotoAndStop(X)//donde esta la x pone el numero de fotorama que usas para la cuando este quieto 
} 

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

firefox
Citar            
MensajeEscrito el 19 Nov 2010 02:41 am
en la funcion Quieto borralo lo que ahy dentro de los parentesis quedaria Quieto()

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

firefox
Citar            
MensajeEscrito el 19 Nov 2010 03:20 pm
Espera, no entiendo este codigo, ¿donde se lo inserto, al personaje o al script normal?, ¿Que cambio del codigo para que me funcione? ¿Y que es un elemento a escuchar", audio?

Por Kotaro

11 de clabLevel



 

Lleida, España

safari
Citar            
MensajeEscrito el 20 Nov 2010 12:47 pm
No se si lo estoy haciendo bien con el cogido que me has pasado, ¿Como tendria que insertarlo exactamente en mi archivo? Creo que me estoy complicando mucho...

Por Kotaro

11 de clabLevel



 

Lleida, España

safari

 

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