Ver la versión completa : [Ayuda] ¿Como asigno salto y animación a una tecla?
Rivroner
27/10/2009, 03:59
Pues a ver, tengo un problemilla (otro y van :D).
En mi código tengo el salto asignado al control y lo quiero dejar ahí pero no sé como decirle que una vez pulsado el botón de salto me haga la animación de salto que quiero.
En el código sólo pone, si está bajando pon el gráfico de bajada y pone graph=195 (por ejemplo), pero yo quiero que me haga una animación de 40 frames.Pero lo he estado intentanto y nada, soy incapaz y eso que tengo el ejamplo de andar a ambos lados, pero no consigo usar un código similar para el salto.
Sé que esto es muy ambiguo pero a ver si me ayudáis, hasta ahora me habéis sacado de casi todas (maldita Z :D). [wei]
Muchas gracias de verdad. :brindis:
cybernoid
27/10/2009, 08:39
Hola,
Bueno, no te doy codigo fenix por que ahora mismo no tengo fenix por aqui.
A ver si esto te ayuda.
La idea es tener "Estados", ESTADO_ANDANDO,ESTADO_SALTANDO, ETC,ETC
la idea seria mas o menos esta:
if (key==UP && ESTADO==ESTADO_EN_SUELO)
{
estado=ESTADO_SALTANDO;
frame=FRAME_INICIO_SALTO;
}
if (estado==ESTADO_SALTANDO)
{
[CODIGO DE SALTO]
frame++;
if (frame==FRAME_FIN_SALTO)
{
frame=FRAME_INICIO_SALTO;
}
if (y==SUELO)
{
estado=ESTADO_EN_SUELO;
}
}
espero que te ayude.
Además de usar estados como dice cybernoid, asegúrate que estás haciendo una instrucción Frame cada vez que cambias el número del gráfico. Si no lo haces no se va a ver nada de la animación.
Riv, seguramente tengas que aumentar el la variable local graph cada frame.
Para eso las animaciones deberian ser consecutivas
Rivroner
27/10/2009, 16:09
A ver, yo tengo esto:
If (key(_control) OR joy.button1)
velocidad_gravedad=-12; // -12 y salta
End
Else // Si el protagonista si baja
graph=195; // Pon el grafico de bajar
End
Ese graph=195 hace que cuando salto y cuando baja del salto se me vea el gráfico de bajar, pero quiero una animación completa en ese rango y no soy capaz de meterla.
He probado a meter el código de andar pero con la animación de saltar que tengo y nada, no da error pero tampoco funciona.
Este fragmento está dentro de este tocho, os lo pongo:
Process jack(x,y,z);
Private
incx=0; // Variable para comprobar paredes
ultima_y=0; // Variable para mirar si sube
ultima_veloc=0; // Variable para comprobar paredes
id2; // Identificador de uso general
Begin
ctype=c_scroll; // Mete dentro del scroll
scroll.camera=id; // Hace que le siga la c*mara
graph=100;
priority=1;
z=-5;
Loop
// Lee el teclado y el joystick
If ((key(_right) OR joy.right) AND velocidad<2)
velocidad+=1; // Sube velocidad a la derecha
flags=0; // Mira a la derecha
Else
If ((key(_left) OR joy.left) AND velocidad>-2)
velocidad-=1; // Sube velocidad a la izquierda
flags=1; // Mira a la izquierda
Else // Si no hay nada pulsado
If (velocidad>0) // Frena a la derecha
velocidad-=1;
End
If (velocidad<0) // O frena a la izquierda
velocidad+=1;
End
End
End
// Mira si el protagonista choca con las paredes
ultima_veloc=velocidad; // Guarda la velocidad en 'ultima_veloc'
If (ultima_veloc<>0) // Y si se mueve
incx=ultima_veloc/abs(ultima_veloc); // Halla la direccion
While (ultima_veloc<>0) // 'ultima_veloc' sirve de contador
// Comprueba que no de por debajo
If (map_get_pixel(1,2,(x+incx)/2,(y-2)/2)<>120)
// Ni que de por encima
If (map_get_pixel(1,2,(x+incx)/2,(y-32)/2)<>120)
x+=incx; // Y si no da, mueve al mu¤eco
End
End
ultima_veloc-=incx; // Resta 'ultima_veloc' hasta que sea cero
End
End
// Si choca con una plataforma crea un nuevo protagonista
If (id2=collision(Type plataforma))
// Tiene que estar bajando y por encima de la plataforma
If (velocidad_gravedad>0 AND abs(x-id2.x)<50 AND y<=id2.y+24) //<50
jack_plataforma(x-id2.x,id2,50,8);
End
End
// Si choca con una plataforma de metal crea un protagonista nuevo
If (id2=collision(Type plataforma_metal))
// Tiene que estar bajando y por encima de la plataforma
If (velocidad_gravedad>0 AND abs(x-id2.x)<36 AND y<=id2.y+12) //<36
jack_plataforma(x-id2.x,id2,36,-7);
End
End
gravedad(); // Funcion para hallar la gravedad del protagonista
If (en_pantalla()) // Si el protagonista no baja
If (velocidad<>0) // Y se mueve
graph++; // Cambia de grafico para animarlo
If (graph>160)
graph=101;
End
Else
graph=100; // Si no se mueve ponen el grafico por defecto
End
//*Esto de arriba en negrita funciona perfectamente y me hace la animación bien.
// Lee que las teclas (Espacio y Control) o el joystick
If (key(_control) OR joy.button1)
play_wav(s_salto2,0); // Si esta pulsado haz sonido
velocidad_gravedad=-12; // -12 y salta
//AQUI es donde intento meter el código de arriba en negrita que funciona.Pero claro, usando el rango que corresponde a las animaciones que tengo en el fpg.
End
Else // Si el protagonista si baja
graph=195; // Pon el grafico de bajar
End
If (ultima_y<y) // Comprueba si esta bajando
muerte=true; // Si baja puede matar
Else
muerte=false; // Si sube o esta quieto le pueden matan
End
// Comprueba colision con osos
If (id2=collision(Type oso))
puntos+=350;
Else
// Comprueba colision con abejas y fantasmas
If (id2=collision(Type voladores))
puntos+=575;
Else
// Comprueba colision con aranias
If (id2=collision(Type arania))
puntos+=825;
Else
// Comprueba colision con cabezas de monstruo
If (id2=collision(Type cabeza))
puntos+=150;
Else
// Comprueba colision con calabazas
If (id2=collision(Type calabaza))
puntos+=425;
End
End
End
End
End
If (id2) // Comprueba si ha habido cualquier tipo de colision
If (muerte) // Y si esta bajando y puede matar
velocidad_gravedad=-12; // Hace botar al protagonista
estrellas(id2.x,id2.y); // Crea estrellas vistosas
signal(id2,s_kill); // Elimina al monstruo que ha originado la colision
play_wav(s_burbuja,0); // Y hace ruido de pompas
Else // Si no puede matar, entonces el protagonista
muerte_jack(); // Esta muerto
End
End
// Si es fuego, directamente mata al protagonista
If (collision(Type fuego)) muerte_jack(); End
// Si son bolas, directamente mata al protagonista
If (collision(Type bola)) muerte_jack(); End
// Si es disparo de las cabezas, directamente mata al protagonista
If (collision(Type disparo_cabeza)) muerte_jack(); End
// Si es bola de pinchos, directamente mata al protagonista
If (collision(Type bola_final)) muerte_jack(); End
// Comprueba si hay colision con los bonos
If (id2=collision(Type bono))
play_wav(s_bonos,0); // Haz sonido
bonos++; // Incrementa numero de bonos
puntos+=1000; // Suma puntos
estrellas(id2.x,id2.y); // Crea estrella vistosas
signal(id2,s_kill); // Elimina los bonos de pantalla
If (bonos>=10) // Y si tiene mas de 10 bonos
bonos-=10; // Resta 10 bonos en la cuenta
vidas++; // Y suma una vida
// Pone un mensaje de vida conseguida
idtextovida=write(fuente1,160,150,4,"VIDA EXTRA");
contadortextovida=0;
contextovida=1;
End
End
// Espera cuatro segundos hasta quitar el mensaje
If (contextovida==1)
contadortextovida++;
End
If (contadortextovida>99 AND contextovida==1)
delete_text(idtextovida);
contextovida=2;
End
// Actualiza las variables internas del scroll cero
move_scroll(0);
If (nivel==1) // En el nivel uno
If (y>300) // Si ha pasado el borde inferior
muerte_jack(); // Mata al protagonista
End
If (x>3400) // Si ha llegado al extremo derecho
// Si no ha acabado el nivel y no se ha creado el primer monstruo
If (NOT fin_nivel AND NOT get_id(Type hijo_malvado_cabeza))
hijo_malvado(); // Crea monstruo fin de fase
energia_enemigo=6; // Crea barra de energ¡a del monstruo
id_barra_enemigo=barra_energia(); // Guarda identificador de la barra de
// para quitarla si pasas fase con truco
Else // Si esta creado el monstruo
// Comprueba si el protagonista a chocado
If (collision(Type hijo_malvado))
muerte_jack(); // Y si lo toca lo mata
End
End
End
Else
// Si estas en la fase dos y en la posicion final
If (nivel==2 AND x==58 AND y==53)
fin_nivel=true; // Acaba el nivel
End
End
ultima_y=y; // Guarda y en ultima_y para comprobar luego si baja
Frame;
End
End
He escrito algunos comentarios importantes dentro del spoiler.
Segata Sanshiro
27/10/2009, 16:52
Supongo que habrá algún conflicto entre la parte de arriba y la de abajo. Cuando pulsas el botón de saltar, se cambia el gráfico a 195 y se debería ver bien durante un fotograma. Pero a la siguiente ejecución del bucle, la parte de arriba cambia el gráfico a 101 ó 160 o el que sea.
Deberías hacer lo que te dicen de tener estados y además separar la parte que gestiona en qué estado estás de la parte que gestiona el gráfico del personaje dependiendo del estado.
Rivroner
27/10/2009, 17:55
Ya, pero es que no lo cambia, se queda en la postura de salto 195.
Quiero decir que no es qeu me haga ese fotograma y luego en el aire me haga el movieminto de andar no, sólo hace ese graph=195
Tu código se podría resolver de la siguiente forma:
If (key(_control) OR joy.button1)
velocidad_gravedad=-12; // -12 y salta
End
Else // Si el protagonista si baja
graph++;
if (graph<195 or graph>"última_imagen_de_la_animación")
graph=195; // Pon el grafico de bajar
end
End
Ahora, si quieres retardarlo es un poco más complejo.
De todas formas, sigue el consejo de Segata: guarda una variable con el estado de lo que esté haciendo tu personaje, y cuando termines de controlar el movimiento, crea una zona para los gráficos. Podría ser algo así:
graph++;
switch (estado)
case ANDAR:
if (graph<1 or graph>10) graph=1; end
end
case SALTAR:
if (graph<11 or graph>20) graph=11; end
end
case COMER:
if (graph<21 or graph>30) graph=21; end
end
case ESTUDIAR:
exit();
end
end //switch
Rivroner
27/10/2009, 18:41
Nada Drumpi, al poner eso ni siquiera puedo compilar el programa me da un unknown identifier "procces" o sea que algo hay mal puesto, he probado con los ; y los end y nada, no lo arreglo.
EDITO:Vale, sí que va, pero queda fatal :D, pasaba que yo había quitado el or del if, pensaba que podía elegir no que tenían que estar las 2 partes :D
Ahora lo que pasa es que me hace la animación 3 veces en el salto. :D
¿Eso metiéndole algún frame para que lo haga poco a poco y sólo 1 vez se solucionaría ?
Gracias a todos de verdad :)
EDITO:Lo del poner un frame (100) por ejemplo medio funciona pero ralentiza el gráfico cuando cae. :D
El tema es que tengo una animación que tiene su parte de estirar las piernas para el salto y volar hasta arriba y luego la de caida y medio agacharse al caer de la gravedad.Igual debo poner en el if otra cosa como if gravedad=0 (esto sería al llegar arriba y quedarse parado)
Bueno, sigo probando :D
¡Estoy enganchado al FENIX, no puedo dejarlo, llevo 3 semanas que sólo "JUEGO" al FENIX [wei]!
Me estoy convirtiendo en uno de vosotros :brindis:
If (key(_control) OR joy.button1)
velocidad_gravedad=-12; // -12 y salta
End
Else // Si el protagonista si baja
contador++;
if (contador==5)
contador=0;
graph++;
if (graph<195 or graph>"última_imagen_de_la_animación")
graph=195; // Pon el grafico de bajar
end
end //if contador
End
Rivroner
27/10/2009, 19:29
¿Con eso que consigo Drumpi?
Bueno, mientras contestas voy a probarlo. :D
EDITO:¡WOW, funciona de lujo tío, qué maquinón estás hecho :D!
Ahora lo que quiero es saber como funciona ese contador, no parece complicadao pero no doy pa más y me gustaría comprender el porqué con eso ya va perfecto. :)
¡Gracias again :)!
lo unico que hace ese contador es que se cambia de imagen cada 5 frames, de manera que en vez de cambiarlo a toda ostia, como te pasaba inicialmente, va algo mas lento...
Rivroner
27/10/2009, 22:45
Sí, ya me he dao cuenta, asias Jurk :)
Al final lo he puesto a 3 , a 5 no me sacaba la animación entera ni en los saltos con más caida.
pasate por el Foro de BennuGD!
Yo, aunque no participo mucho, si que utilizo un monton el foro y el wiki.
Rivroner
27/10/2009, 23:25
Yo es que uso Fenix :D
Que ya que ya, que me pasaré, el otro día me registré :)
Este es el típico código de retardo de animaciones. Obviamente te puse 5 como un valor al azar, es trabajo tuyo decidir el retardo entre imágenes.
Por si a alguien no le ha quedado claro, lo que hace es contar frames, y cuando ha contado cinco, entra en el if y ejecuta lo de dentro, que es cambiar la animación al siguiente gráfico.
Es mejor que usar frame(500) (no sé por qué, pero hay quien lo usa :confused:), porque de esa forma se quedaría congelado el proceso y no reaccionaría a nada, porque no ejecutaría código durante 5 frames.
Y Rivroner: aunque sea el foro de Bennu, también se resuelven dudas de Fenix sin problemas, casi todos los que estamos allí venimos del viejo foro de Fenix, el que estaba alojado en divsite, y que ya casi nadie visita (aunque aun nos pasamos de vez en cuando).
Lo único es que no te dejes abducir por Splinter si no quieres cambiar... Lleva ya creo año y medio y aun no ha conseguido arrastrarme del todo :D:D:D
Además, te puedes llevar una sorpresa con lo que se está desarrollando por allí.
Rivroner
28/10/2009, 02:09
Ya hombre, si ya insinuo eso en mi anteriro post, sé que en ese foro me ayudaríais igual. :)
Y sí, este contador funciona mucho mejor que el frame, el frame me hacía una especie de cámara lenta.Lo usaré para repeticiones o algo así.O al matar a un super bicho final de fase. :D
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.