Ver la versión completa : Animaciones Fenix me estoy volviendo loco
Vamos a ver estoy intentando aprender a programar en fenix y tengo un problemon con la animaciones.
He encontrado un monton de maneras de como hacerlas pero no se como añadirlo al codigo que ya tengo.
La animacion la quiero hacer desde un FPG, y las imagenes van del 8 al 15.
Es la pantalla de Game Over.
Mi codigo:
PROGRAM juego_laberinto;
GLOBAL
INT id1;
int vidas;
END
BEGIN
set_mode(320,240,16,MODE_WINDOW);
id1=load_fpg("imagenes.fpg");
vidas=3;
menu();
END
process menu()
begin
x=160; y=120; file=id1; graph=7;
vidas=3;
Loop
if (key(_enter)) break;end
if (key(_space)) exit();end
frame;
end
laberinto();
personaje();
vida();
end
PROCESS personaje()
BEGIN
x=150; y=130; file=id1; graph=1;
LOOP
IF (key(_up)) advance(3); END
IF (key(_down)) advance(-3); END
IF (key(_left)) angle=angle+7500; END
IF (key(_right)) angle=angle-7500; END
IF (COLLISION(type laberinto)) vidas=vidas-1; break; END
IF (collision(type laberinto)) break; end
FRAME;
END
personaje();
end
PROCESS laberinto()
BEGIN
x=160; y=120; file=id1; graph=2;
LOOP
if (COLLISION(type gameover))break; end
FRAME;
END
END
PROCESS gameover()
BEGIN
LET_ME_ALONE();
x=160; y=120; file=id1; Graph=8;
LOOP
if (key(_space)) exit(); end
if (key(_enter)) break; end
Frame;
end
while(key(_enter))
frame;
end
menu();
end
Process vida()
BEGIN
x=160; y=120;
loop
if (vidas==3) graph=4; end
if (vidas==2) graph=5; end
if (vidas==1) graph=6; end
if (vidas==0) break; end
frame;
end
gameover();
end
No se como añadir la animacion al proceso de Game Over. Quiero que al morir se anime del grafico 8 al 15 y no se repita mas(que se quede parado en el grafico 15).
No se como añadir la animacion al proceso de Game Over. Quiero que al morir se anime del grafico 8 al 15 y no se repita mas(que se quede parado en el grafico 15).
Hace unos meses que no toco fenix, pero creo que lo mas facil seria asi.
loop
graph=graph+1;
frame;
if (graph==15) break;
end
PROCESS gameover()
BEGIN
LET_ME_ALONE();
x=160; y=120; file=id1; Graph=8;
loop
graph=graph+1;
frame;
if (graph==15) break;
if (key(_space)) exit(); end
if (key(_enter)) break; end
end
menu();
end
el unico problema que se me ocurriria es que cuando vuelves a llamar a menu() al final del gameover, el gameover no morira porque tendra a menu como hijo. Entonces tendras que poner que gameover no siga pintandose (graph=-1??) pero el problema es que seguira vivo. se te crea un bucle menu->juego->gameover->menu que no se como arreglar.
lo unico que se me ocurre es que no llames a menu() desde ahi, sino que en el proccess principal como tendras un bucle, pongas que cuando la variable gameover es true (o algo asi) vuelva a crear el menu.
Aiken
Muchas Gracias Aiken pero poniendolo asi me da un error en la linea 65 que corresponde al begin del proceso Vida.
BUHOnero
13/11/2007, 23:15
PROCESS gameover()
BEGIN
LET_ME_ALONE();
x=160; y=120; Graph=8;
loop
graph=graph+1;
frame;
if (graph==15) break; end
if (key(_space)) exit(); end
if (key(_enter)) break; end
end
menu();
end
Poniendo eso me da error en el mismo sitio. En el begin del proceso vida.
BUHOnero
13/11/2007, 23:20
me lo miro mañana con mas calma... que ahora no toy fino :D
Poniendo eso me da error en el mismo sitio. En el begin del proceso vida.
no te sobrara faltara algun begin o end en algun otro lado?
Aiken
< - >
if (graph==15) break; end
sabia yo que se me olvidaba algo. y lo que es peor se nos olvida algo mas :D
Aiken
no se nos olvida nada mas. Era yo el que habia vuelto a copiar mal y me habia comido ese end.
Muchas Gracias
no se nos olvida nada mas. Era yo el que habia vuelto a copiar mal y me habia comido ese end.
Muchas Gracias
pues nada tio! a ver si se te da bien el fenix y haces cosillas interesantes ;)
Aiken
Tengo un problemilla con la animacion cuando sale el Game Over, aparte de que la animacion va muy rapido el solo se va al menu.
Hay alguna manera para hacer que la animacion vaya mas despacio(que deje un tiempo entre imagen e imagen).
Y como hago para que se quede en la ultima imagen i no vuelva solo al menu???
Es que es la primera vez que me meto con animaciones y me estan molestando bastante.
bueno, en vez de poner una imagen por frame, repite imagenes en distintos frames...
Podrias calcular el tiempo a ojo sabiendo el framerate que usas. Por ejemplo, si vas a 30FPS y quieres que el game over dure 2 sg, deberias de pintar 60 veces game over...
No lieis al pobre pipilio...
Tu deja el proceso tal que así.
PROCESS gameover()
BEGIN
LET_ME_ALONE();
x=160; y=120; file=id1; Graph=7;
loop
if (graph<15) graph=graph+1; end
if (key(_space)) exit(); end
if (key(_enter)) break; end
frame;
end
menu();
end
Así se verá la animación y se quedará el game over estático hasta que pulses start o space.
BUHOnero
15/11/2007, 23:14
No lieis al pobre pipilio...
Tu deja el proceso tal que así.
PROCESS gameover()
BEGIN
LET_ME_ALONE();
x=160; y=120; file=id1; Graph=7;
loop
if (graph<15) graph=graph+1; end
if (key(_space)) exit(); end
if (key(_enter)) break; end
frame;
end
menu();
end
Así se verá la animación y se quedará el game over estático hasta que pulses start o space.
Mejorando esto, propongo:
PROCESS gameover()
PRIVATE
tmp=0;
BEGIN
LET_ME_ALONE();
x=160; y=120; file=id1; Graph=7;
loop
if (graph<15 and tmp==2)
graph=graph+1;
tmp=0;
else
tmp++;
end
if (key(_space)) exit(); end
if (key(_enter)) break; end
frame;
end
menu();
end
Ha de tener en cuenta que el tmp==2 es la frecuencia con la que se ejecuta la animacion, si quieres que vaya mas lento pon tmp==3 o 4, tu mismo verás como queda mejor.
PROCESS gameover()
BEGIN
LET_ME_ALONE();
x=160; y=120; Graph=8;
loop
if (graph<15) graph=graph+1;
frame(1000);
if (key(_space)) exit(); end
if (key(_enter)) break; end
end
menu();
end
creo que asi funcionaria, cambia el numero que he puesto dentro de frame para hacerlo mas rapido o mas lento ;)
PD. frame(1000) relentizaria TODOS los procesos pero como el game over es el unico que hay en ese momento :)
En el caso de quisieras usar esto mismo para por ejemplo un muñeco se mueva mas rapido que otro no podrias usar frame,
tendrias que usar un contador y hacer algo como.
if ((graph<15)and(contador==5))
begin
graph=graph+1;
contador = 0
else
contador = contador +1
end
no creo que la sintaxis este bien porque no recuerdo bien la sintaxis de fenix para los if-else, pero mas o menos seria asi, lo que esta diciendo es "cambia el grafico de la animacion cada 5 vueltas al bucle", con lo que el efecto al ojo seria que va mas lento, pero no "ralentizaria" al resto de procesos, como pasa con el frame(1000) pero en tu caso como el gameover es el unico proceso te valdria el frame(1000) ;)
PD. Veo que me os habeis adelantado :) bueno al menos con lo del frame(1000) aporto una alternativa mas simple, mi otra alternativa es la misma que la vuestra :)
Aiken
Mejorando esto, propongo:
PROCESS gameover()
PRIVATE
tmp=0;
BEGIN
LET_ME_ALONE();
x=160; y=120; file=id1; Graph=7;
loop
if (graph<15 and tmp==2)
graph=graph+1;
tmp=0;
else
tmp++;
end
if (key(_space)) exit(); end
if (key(_enter)) break; end
frame;
end
menu();
end
Ha de tener en cuenta que el tmp==2 es la frecuencia con la que se ejecuta la animacion, si quieres que vaya mas lento pon tmp==3 o 4, tu mismo verás como queda mejor.
Está muy bien eso, no había leído lo de que quería que la animación fuese más lenta; aunque yo para no liarlo le habría mandado que lo hiciese de una manera mas "artesanal".
PROCESS gameover()
BEGIN
LET_ME_ALONE();
x=160; y=120; file=id1; Graph=7;
loop
if (graph<15) graph=graph+1; end
if (key(_space)) exit(); end
if (key(_enter)) break; end
frame;
frame;
frame; //a mas frames; mas lenta la animación.
end
menu();
end
Asi no lo liamos con condicionales dobles ni con elses; pero que conste que tu versión es la correcta y/o ortodoxa.
Buho ¿es posible que la variable TMP siga aumentando de valor indefinidamente en tu función?
BUHOnero
15/11/2007, 23:39
Está muy bien eso, no había leído lo de que quería que la animación fuese más lenta; aunque yo para no liarlo le habría mandado que lo hiciese de una manera mas "artesanal".
PROCESS gameover()
BEGIN
LET_ME_ALONE();
x=160; y=120; file=id1; Graph=7;
loop
if (graph<15) graph=graph+1; end
if (key(_space)) exit(); end
if (key(_enter)) break; end
frame;
frame;
frame; //a mas frames; mas lenta la animación.
end
menu();
end
Asi no lo liamos con condicionales dobles ni con elses; pero que conste que tu versión es la correcta y/o ortodoxa.
Buho ¿es posible que la variable TMP siga aumentando de valor indefinidamente en tu función?
si, augmenta hasta el infinito y más allá!!! jajaja es que lo he hecho a saco, lo correcto sería limitarlo, donde se hace el tmp++ se podría comprobar que graph sea menor de 15, y si es mayor que no augmente más el tmp :D pero bien visto jejeje
< - >
PROCESS gameover()
PRIVATE
tmp=0;
BEGIN
LET_ME_ALONE();
x=160; y=120; file=id1; Graph=7;
loop
if (graph<15)
if(tmp==2)
graph=graph+1;
tmp=0;
else
tmp=++;
end
end
if (key(_space)) exit(); end
if (key(_enter)) break; end
frame;
end
menu();
end
Mejorado por el comentario de chipan :D ahora el tmp no augmentará al final de la animación
Rivroner
16/11/2007, 00:08
Pues si me prometéis responder a mis dudas tan rápido y bien como a las de Pipilio os prometo ponerme a hacer un jueguecillo en Fenix :D O al menos una demo inicial :D
Da gusto con foros como este :)
Yo es que tengo mucha menos idea que Pipilio y os preguntaría cada media hora :D
Coelophysis sin saber programar en un principio, con un poco de asistencia mia y de buhonero se ha currado el firewhip; ¿por que no ibas a poder hacer algo similar tu?
Rivroner
16/11/2007, 00:23
Coelophysis sin saber programar en un principio, con un poco de asistencia mia y de buhonero se ha currado el firewhip; ¿por que no ibas a poder hacer algo similar tu?
Mira, pues me has convencido :D
Pero claro yo no soy una máquina del dibujo a mano alzada ni del pixel art :D
Me tocará hacer algo tipo Myst y buscar imágenes y música libre por la web :):D
Muchisimas Gracias por contestar ahora si que va bien. Algun dia sacare un juego, de momento es un cutre laberinto con una nave espacial.
Estoy pensando en añadirle mas laberintos y hacer en plan pantallas.
Y por lo de las imagenes rivroner eso que has dicho es lo que hago yo. Las saco de la web y luego las modifico
Muchisimas Gracias por contestar ahora si que va bien. Algun dia sacare un juego, de momento es un cutre laberinto con una nave espacial.
Estoy pensando en añadirle mas laberintos y hacer en plan pantallas.
Y por lo de las imagenes rivroner eso que has dicho es lo que hago yo. Las saco de la web y luego las modifico
Aunque te pueda parecer "cutre", cualquier novedad es bienvenida :) Además si a alguna gente le mola tu proyecto, siempre anima más a seguir con ello :P
Solo apuntar que frame(1000) hace que ese proceso (solo el proceso con esa instruccion) se quede "congelado" durante 10 frames.
Los procesos avanzan TODOS A LA VEZ, de forma paralela, pero no se visualizarán hasta que todos hayan hecho un frame al 100%. Esto se hace con la palabra FRAME, pero tambien se puede hacer con FRAME(porcentaje), que indica qué porcion de frame se ha ejecutado.
Por ejemplo: frame(50) hace que se ejecute un 50% del frame, por lo que el proceso seguirá ejecutandose hasta encontrar otr frame de 50% o superior.
Sin embargo, un frame(200) se ha ejecutado un 200%, es decir, equivale a escribir:
FRAME;
FRAME;
Pero haciendo eso no se ralentizan al resto de procesos, solo consigues que durante los frames que este "congelado" ese proceso no reciba órdenes (por ejemplo, lecturas de teclado, porque no lee la instruccion key(), etc...)
Es otra forma de acelerar/ralentizar procesos, pero es más elegante usar contadores.
PD: Rivroner, si necesitas ayuda, aqui estamos (siempre que nos dejen XD), y si no, está el foro de fenix, lleno de fenixeros, entre ellos, Pixel y un servidor, que te ayudaran encantados :)
Pues bueno aqui os dejo la chorradilla por si alguien quiere probarla.
Ya se que es muy simple, pero, es para aprender.
Tengo intencion de:
-Nuevo menu
-Sonidos
-Animaciones
-Mas laberintos(de momento solo tiene uno):(
Comentarme los errores y lo que no os guste.
Si alguien quiere el codigo para ver la chapuza y el lio que tengo armado que me lo diga.
Pues bueno aqui os dejo la chorradilla por si alguien quiere probarla.
Ya se que es muy simple, pero, es para aprender.
Descargando ....
aunque sea simple, como dices es para aprender, y aun mejor, seguro que el proximo proyecto que hagas lo haces partiendo de este, porque ya tienes montados todos los archivos y demas y es mucho mas comodo, asi que miralo como que el proximo ya llevas terreno ganado ...
Probando ....
A que has aprendido un mogollon .. por lo que veo has seguido los consejos del tutorial ese que anda por ahi, es genial a que si, cuando lo terminas tienes un juegos totalmente funcional, con personaje, colisiones, mapas y de todo.
PD. Ahora solo te falta hacerte otro jueguecillo de ejemplo para practicar con enemigos y colisiones ;)
PD. Sabias programar algun otro lenguaje antes? porque no se si te has dado cuenta pero ya eres programador Fenix! :)
Aiken
Gracias Aiken.
Lo unico que se es lo ves en el jueguecillo de fenix y html.
A ver si acabo este, lo mejoro un poco y a lo mejor le meto en plan algo tipo monstruo final y asi aprendo lo de las colisiones.
Lo unico que se es lo ves en el jueguecillo de fenix y html.
no creas que es poco para hacer el jueguecillo este hasta tocado muchas cosas interesantes, y te has creado una base para proximos proyectos.
ya me hubiese gustado a mi que en mis primeros tiempos mis proyectos fueran asi de jugables, jeje, la verdad es que fenix ayuda mucho.
PD. Fijate que yo diria que Fenix es mas complicado para gente que sabe programar en lenguajes mas tradicionales, que para la gente que aprence Fenix y no sabe otros lenguajes, porque una vez aprendido Fenix es mas facil hacer cosas chulas, pero cambia mucho respecto a los lenguajes tradicionales por lo que se te hace dificil si vienes de otros lenguajes.
Bueno, pues tio! ya estas lanzado, a partir de aqui a mejorar este o a hacer nuevas cosas con lo que has aprendido! has pasado la fase dura ;)
Aiken
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.