Ver la versión completa : Animaciones en Fenix
Buenas, como hoy estaba aburrido he empezado en esto del Fénix/DIV
Tengo muy poca experiencia y la verdad es que los tutoriales que hay o son muy específicos o estan muy desperdigados por la red.
Me he leido el post de (empezando con Fenix) y me he descargado todo lo necesario así como los ejemplos de OscarBraindead (geniales)
Mas o menos lo voy pillando pero ando muy perdido en una cosa. Las animaciones.
Cogiendo de base el primer programa ejemplo de Oscar (sale una bola que controlas por la pantalla con los cursores) estoy intentando crear la bola con una animación simple (3 frames) pero no hay manera.
Las animaciones en Fenix se hacen con los MAPS no? Puedo crear/modificar FPG pero a la hora de crear map animados no hay manera... ni con el Firebird ni con el FPGEDIT.
Alguien podría hecharme una manita? Muchas gracias
Wonder Boy
31/10/2004, 14:24
Hombre una respuesta así rápida y básica es que puedes cojer y almacenar en archivo .FPG los frames de la animación y luego en el programa gestionas el cambio de frame en la animación del sprite mediante la variable local graph del proceso del tal sprite...
Si tienes alguna duda pregúntalo :-)
Un Saludo.
Pues cualquier sample de codigo mostrando eso que dices me vendría de perlas la verdad.
Hummm... no hay el manual de DIV 1 o 2 colgado por ahí?
chemaris
31/10/2004, 15:13
yo tb estoy empezando con fenix, y me ha parecido bastante facil, el tema de las animaciones no lo se ya que aun no lo he mirado y no te puedo ayudar, como veo que usas el firebrid mirate la ayuda que es bastante completa e igual lo explica.
De todas maneras si alguien lo explica aqui mejor, ya que tb me interesa
codigo para hacer una animación infinita desde un fpg. Solo pongo el proceso:
//img la defines al principio como:
img=load_fpg("tu.fpg");
process animacion();
begin
file=img;
graph=1;
x=...
y=..
z=...
LOOP
graph++;
IF (graph=>finalanimacion) graph=1; END
FRAME;
END
END
finalanimacion es un numero, si tienes 4 imagenes pues pones 4.
Espero q lo piyes sino lo repito mejor ;).
Si no podéis visitar este link q acabo d subir un ejemplo completo:
http://www.gp32spain.com/ngames/modules.php?name=Forums&file=viewtopic&p=29&sid=c57bdd93098648469bcb132127fbdac0#29
Bueno mientras escribiais esto he conseguido hacer lo que quería "a mi manera"
Dejo akí el codigo del "programa" basado en el ejemplo de oscarbrainded nº1
//==================================================
//= Fenix ejemplo 1 =
//= =
//= Muestra un sprite y lo mueve por la pantalla =
//= =
//= Ejemplos para el port de Fénix para GP32. =
//= Por Oscar BraindeaD 2004 =
//= (www.geocities.com/oscarbraindead) =
//= Visita la web de Fénix: http://fenix.divsite.net =
//= Portado a GP32 por Chui. =
//==================================================
Program FenixEjemplo1;
Begin
//Inicia modo gráfico a 320X240 y modo 8bits de color (256 colores)
set_mode(m320x240);
Graph_mode=mode_8bits;
//Carga el fichero de gráficos
load_fpg("FenEjem\ejemplo.fpg");
//Crea el proceso nave
nave();
//Embucla el proceso ppal. hasta pulsar tab (en ordenador) o botón L en GP32
Loop
//El frame hace que se recalcule todo, si no se pone se quedará como "colgado"
Frame;
If(key(_tab)) Break; End
End
//Elimina TODOS los procesos que pudieran existir quedándose él solo
let_me_alone();
End
//==================================================
//= Proceso NAVE() =
//==================================================
Process nave()
Begin
//Le asignamos el gráfico deseado al proceso
graph=5;
//Le damos valor a sus coordenadas iniciales
x=100; y=100;
Loop
Frame;
//Detectamos las pulsaciones de las teclas/stick de GP32
If(key(_left)) x-=2; End
If(key(_right)) x+=2; End
If(key(_up)) y-=2; End
If(key(_down)) y+=2; End
If(graph==10) graph=5; End
graph++;
End
End
Mi personaje animado tiene 5 frames de animacion, dentro del FPG empieza con el numero 5 y acaba en el 10).
Explicacion del nuevo codigo para los que enpiezan (como yo) o para que me lo corrigais:
Basicamente he incluido un incremento dentro del Bucle principal (graph++) controlado por la sentencia (If(graph==10) graph=5; End) que condiciona la duracion de la animacion (cuando el valor de graph es 10 (ultimo frame de mi animacion) el "contador" de graph vuleve a ser 5 (primer frame de mi animacion)
En que puedo mejorar este "programa".
Realmente, Fenix no puede tratar con FPG animados? Como?
Con este programa hay alguna manera de dar cierto delay a la animacion (los frames se animan demasiado rapido para mi gusto).
PD:Gracias chicos por vuestras respuestas. Es dificil empezar sin tutos... aunque aprendo rapido.
EDITADO: Viendo el ejemplo de Netrix veo que no iva mal encaminado... XD
chemaris
31/10/2004, 20:39
hola yo tengo el mismo problema, la animacion es muy rapida y no da tiempo a ver nada, en mi caso es una bomba a la que se le consume la mecha, explota y despues desaparece, pero va tan rapido que no se ve nada,( la animacion esta compuesta por 8 frames),
por otra parte lo que hace es al principio dibuja los 8 frames superpuestos y despues realiza la animacion y desaparece
lo he hecho asi
bla bla bla
Process Bomba();
Begin
Loop;
If(puntos>750 AND puntos<800);
explosion();
signal(id,s_kill);
End
Frame;
End
End
Process explosion();
Begin
graph=40;
x=10+xra;
y=10+yra;
Loop
graph++;
If(collision(Type nave));
Menu();
End
If (graph=>48);
signal(id,s_kill);
End
Frame;
End
End
saludos
Si haces un frame(200); irá la mitad de rápido y puede q vaya como kiers, es una de las soluciones posibles...
chemaris
31/10/2004, 23:07
gracias ha quedado perfecto :D :D
Bueno, yo sigo con mis "trapicheos". XD
Necesitaría el source de un programa tipo PONG, lo mas sencillo posible.
Para enterarme de como funcionan las colisiones y el movimiento de la bola.
He estado buscando pero no encuentro ninguno... sabeis de alguno?
Thks!
Segata Sanshiro
01/11/2004, 22:20
No creéis que esto lo deberíamos hablar en NetrixGames? ^_^
Espero que el ejemplo de la Biblia os sirva de algo, aunque ni siquiera está comentado. A ver si consigo terminar pronto el nuevo "documento" que estoy escribiendo.
Licantropo
01/11/2004, 23:01
Os dejo una pagina con bastantes ejemplos, son ejemplos sencillos, pero que pueden aclarar cosas. No se si estan comentados (creo que no), pero son bastante sencillos, asi que no creo que tengais problemas en enteraros. Yo cuando empeze, comenze mirandome algunos de esos ejemplos.
http://usuarios.lycos.es/tgames/fenix.html
Gracias, esa pagina esta genial (se ha posteado alguna vez por aquí)
La verdad es que cuesta bastante empezar si tienes poca idea y no dispones de ningun manual/tutorial completo.
De mientras voy trasteando con los ejemplos y la ayuda del firebird... no se si conseguiré algo pero de momento me estoy divirtiendo que ya es bastante. XD
DreamerXL
01/11/2004, 23:36
Escrito originalmente por Hokutoy
Bueno, yo sigo con mis "trapicheos". XD
Necesitaría el source de un programa tipo PONG, lo mas sencillo posible.
Para enterarme de como funcionan las colisiones y el movimiento de la bola.
He estado buscando pero no encuentro ninguno... sabeis de alguno?
Thks!
Deberías intentarlo sacar tu antes de hacer Copy/Paste (Te aconsejo que pruebes así primero).
Piensa en las coordenadas de la pelota (Si le incrementas la 'X' y a la 'Y' [Por ejemplo] verás como la bola va en una dirección).
Para que rebote, cuando llegue a un límite, sólo tienes que cambiar el incremento [(Si llega al techo cambias el incremento de la 'Y' (Pasarías a decrementar)].
Es bastante sencillo (Si aún así te complica, subo yo mi código[En Fénix] ;))
PD: Sobre las colisiones, hay unos ejemplos en el foro (Busca).
Salu2!
Bueno pues ya tengo casi finalizado mi primer "juego" en Fenix.
La idea original es hacer un Street Fighter Pong pero esta version 0.1 se limita a ser un simple "Horizontal Hadoken Competition". Para 2 players o 1 Player a dos manos... :)
Para no tener ni idea de programar me esta quedando bastante majo (lo mejor sin duda son los graficos... de algo me tienen que servir los 2000 frames ripeados del BOR :D )
En cuanto le ponga vidas y un par de niveles lo subo junto al codigo fuente para su discusión y ayuda en optimización.
PD: Estoy teniendo problemas con la reproduccion de MIDIS. En el PC suena bien pero en la GP32 no me la reproduce.
Uso la expresion:
musica=load_song("ken.mid");
play_song(musica,-1);
Y nada, en el PC sí, en la GP32 no. El Fenix de Gp32 no reproduce Midis? Han de ser Midis con algun formato concreto?
Gracias!
http://personales.ya.com/hokutoy/zantetsu.gif
PD: A ver si la gente se anima con el Fenix que es realmente facil (con nociones basicas de Bucles e IFs ya puedes empezar a trastear)
creo que el fenix rulaba sobre las SDL de GP32 ¿no?, si ese es el caso necesitas unos archivos para el midi por software de las SDL, mira otros post sobre SDL a ver si das con ello, o en la pagina del proyecto SDL gp32 en sourceforge.
fagotero
05/11/2004, 15:26
Hola!
Bueno pues aquí hay otra persona con más dudas :(
Estoy intentando hacer una animación "controlada" es decir tenemos un personaje que cuando está parado, vá reproduciendo una animación (como si respirase), pero cuando se le dá hacia la derecha, izquierda....etc, salta a la animación de caminar, que está compuesta por una serie de frames (16).
Pues el problema que tengo yo, es que mientras está parado y se reproduce la animación "respirando" cuando le doy a la derecha (por ejemplo) se para la animación "respirando" y hace otra animación pero con sólo 2 frames.
Voy a poner el código que por ahora me está saliendo, ya que he intentado varias cosas pero en ninguna me salía nada parecido a lo que yo quería, y este código casi consigue hacer lo que yo quiero, pero....casi
Mini resumen de animaciones:
Animación "respirando": 4 frames.
Animación "caminando": 16 frames.
Código fuente (PASO DIRECTAMENTE AL PROCESO EN CUESTIÓN) :
Process marco();
Begin
graph=003;
x=160;
y=120;
Loop
graph++; //Animación de "respiración" cuando no se toca ninguna tecla
If (graph>006) graph=003; End
Frame(749);
If (key(_right)) x=x+3; graph=010; // Animación de "caminar"
If (graph=>025) graph=010; End
Frame(740);
End
Frame;
End
End
Process marco();
Begin
x=160;
y=120;
graph=3;
Loop
IF (NOT(Key(_right)))
graph++;
If (graph>6) graph=3; End
Frame(749);
END
If (key(_right)) IF (graph=<10) graph=10; END x+=3; graph++;
If (graph=>025) graph=10; End
Frame(740);
End
Frame;
End
END
fagotero
05/11/2004, 16:11
Muchas gracias por la ayuda Netrix ;)
Lizardos
05/11/2004, 16:18
Escrito originalmente por chemaris
hola yo tengo el mismo problema, la animacion es muy rapida y no da tiempo a ver nada, en mi caso es una bomba a la que se le consume la mecha, explota y despues desaparece, pero va tan rapido que no se ve nada,( la animacion esta compuesta por 8 frames),
A ver... en Div hay una función que marca la velocidad de cuadro que es set_fps(cuadros por segundo, frameskip) .
No sé si no está en fenix y a lo mejor me estoy colando. Se pone inmediatamente despues de iniciar el modo gráfico con set_mode().
Saludos, Lizardos
Damizean
05/11/2004, 17:40
Creo que si. Aunque bueno, de todas formas ya le pasé un codigo a Fagotero :P
Aqui os lo dejo por si a alguno le hace servicio :
Process Personaje(x,y); //Crea al desgraciado en X,Y
Private
int Animacion;
int AnimacionAnterior;
int ActFrame;
int FrmInicial;
int FrmReturn;
int FrmFinal;
int VelocidadAnimacion;
int Contador;
Begin
//Configurar la Animacion inicial
AnimacionAnterior=Animacion;
ActFrame=3;
FrmInicial=3;
FrmFinal=6;
VelocidadAnimacion=20;
Contador=0;
x=160;
y=120;
file=load_fpg("mifpg.fpg")
Loop
//Poner la animacion a 0 si eso en caso de que no toques teclas
Animacion=0;
//Gameplay
If (key(_left))
x-=1;
Animacion=1; // Animación de "caminar".
End
If (key(_right))
x+=1;
Animacion=1; // Animación de "caminar".
End
If (key(_left)) flags=1; End
If (key(_right)) flags=0; End
//Cambiar la animacion
if (AnimacionAnterior!=Animacion)
AnimacionAnterior=Animacion;
If (Animacion==0)
FrmInicial=3;
FrmReturn=3;
FrmFinal=6;
VelocidadAnimacion=20;
ActFrame=FrmInicial;
Contador=0;
End
If (Animacion==1)
FrmInicial=10;
FrmReturn=14;
FrmFinal=25;
VelocidadAnimacion=40;
ActFrame=FrmInicial;
Contador=0;
End
End
//Ahora ejecutar la animacion
Contador+=VelocidadAnimacion;
if (Contador>100)
Contador=0;ActFrame++;
End
if (ActFrame>FrmFinal)
ActFrame=FrmReturn;
End
graph=ActFrame;
Frame;
End
End
fagotero
06/11/2004, 23:45
Bueno ahora tengo otro problemilla :(
El caso es que estoy intentando reproducir la animación de disparo COMPLETA cuando se pulsa un botón, pero lo único que hace es reproducir la animación (repitiéndola) mientras tienes el botón en cuestión pulsado, es decir que si lo pulsas una vez, la animación no se reproduce por completo, y lo que yo quiero es que se reproduzca entera aunque sólo lo pulses una vez.
El código que uso es el que Damizean me pasó, es decir el de arriba, lo he intentado de varias maneras pero ninguna me ha funcionado :(
Saludos y gracias por la ayuda.
chemaris
07/11/2004, 00:22
si te sirve de algo asi lo he hecho yo
....
Process mira(x,y,z);
Begin
graph=60;
x=160;
y=210;
z=-512;
Loop;
If(key(_left) AND x>10);
x-=7;
End
If(key(_right) AND x<310);
x+=7;
End
If(key(_down) AND y<230);
y+=7;
End
If(key(_up) AND y>10);
y-=7;
End
If(key(_esc));
exit(0,"");
End
If(scan_code==_control AND NOT(id_bala));
id_bala=bala(x,y);
End
Frame;
End
End
Process bala(x,y);
Begin
graph=60;
Loop
graph++;
If(graph=>66);
id_bala=0;
signal(id,s_kill);
End
Frame(350);
End
End
Es bastente lioso (y fijo que no es la mejor manera) pero dados mis escasos conocimientos sobre Fenix a mí me saco del apuro. Supongo que solo te servirá si mientras sucede la animacion de disparar no puedes caminar/saltar/moverte/etc...
Basicamente consiste en que al pulsar la tecla de disparo llames a un nuevo processo (disparo, por ejemplo) que al entrar en el envíe un: signal(nombre_del_proceso_de_tu_personaje, s_sleep); para dejar dormido a tu personaje. En este proceso puedes crear tu animacion de disparar tranquilamente y al acabar el proceso, envia un: signal(nombre_del_proceso_de_tu_personaje, s_wakeup); para que tu personaje "despierte".
Sip, lo sé, es un poco cutre pero a mí me funciona... XD
PD: Lo malo de "splitear" el prota en diferentes procesos es que despues tienes que chekear colisiones en cada uno de ellos. Byes
PD2: Mi Street Fighter Pong me esta quedando niquelao... XD.
http://personales.ya.com/hokutoy/demo1.gif
http://personales.ya.com/hokutoy/demo2.gif
http://personales.ya.com/hokutoy/demo3.gif
http://personales.ya.com/hokutoy/demo4.gif
http://personales.ya.com/hokutoy/demo5.gif
Damizean
07/11/2004, 13:16
Escrito originalmente por Hokutoy
Es bastente lioso (y fijo que no es la mejor manera) pero dados mis escasos conocimientos sobre Fenix a mí me saco del apuro. Supongo que solo te servirá si mientras sucede la animacion de disparar no puedes caminar/saltar/moverte/etc...
Basicamente consiste en que al pulsar la tecla de disparo llames a un nuevo processo (disparo, por ejemplo) que al entrar en el envíe un: signal(nombre_del_proceso_de_tu_personaje, s_sleep); para dejar dormido a tu personaje. En este proceso puedes crear tu animacion de disparar tranquilamente y al acabar el proceso, envia un: signal(nombre_del_proceso_de_tu_personaje, s_wakeup); para que tu personaje "despierte".
Sip, lo sé, es un poco cutre pero a mí me funciona... XD
PD: Lo malo de "splitear" el prota en diferentes procesos es que despues tienes que chekear colisiones en cada uno de ellos. Byes
PD2: Mi Street Fighter Pong me esta quedando niquelao... XD.
http://personales.ya.com/hokutoy/demo1.gif
http://personales.ya.com/hokutoy/demo2.gif
http://personales.ya.com/hokutoy/demo3.gif
http://personales.ya.com/hokutoy/demo4.gif
http://personales.ya.com/hokutoy/demo5.gif
Eso no es nada viable, sobre todo por el hecho de que ocupará mucha mas memoria, costará mas proceso tendremos que comprobar colisiones con todas ellas y seria un coñazo en general.
Ademas, si usas el meteodo que dije antes puedes cambiarlo un poco para añadirle loops infinitos o que cuando acabe vuelva a una animacion determinada, asi podrias hacer que si mientras la animacion es disparar o x, los controles no sirvan de nada.
porque no al disparar guardas una variable disparo=true i luego vaya un if disparo=true hace la animacion de disparo i cuando acaba (graph=numframes animacion) vuelve a poner disparo a false? claro q si disparas i empiezas a andar saldra de la animacion... no?
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.