Ver la versión completa : Ayudita fenix
A ver estoy aprendiendo a programar en fenix, y para eso, estoy haciendo un juego chorra de laberinto en el que no puedes tocar las paredes.
Cuando tocas te devuele al principio, y si tocas 3 GAME OVER.
Mi problema empieza aqui:
Cuando llego al GAME OVER le quiero dar al start y que vuelva al menu y al select para salir.
El select va perfecto sale y todo, pero, al start se la sopla y no hace nada.
Tambien tengo un problema con el game over, y es que, cuando pierdes se cierra el proceso laberinto pero no el proceso personaje.
PROGRAM juego_laberinto;
GLOBAL
INT id1;
int vidas;
int select_fnt;
int titulo_fnt;
END
BEGIN
set_mode(320,240,16,MODE_WINDOW);
id1=load_fpg("imagenes.fpg");
vidas=3;
select_fnt=LOAD_FNT("select.fnt");
titulo_fnt=LOAD_FNT("titulo.fnt");
menu();
laberinto();
personaje();
vida();
END
process menu()
begin
x=160; y=120; file=id1; graph=7;
Loop
if (key(_enter)) break;end
if (key(_space)) exit();end
frame;
end
end
PROCESS personaje()
BEGIN
x=160; y=120; 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
x=160; y=120; file=id1; Graph=3;
LOOP
if (key(_space)) exit(); end
if (key(_enter)) break; end
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
Pon un let_me_alone() al principio del proceso game over.
Hola,
No acaba el proceso personaje() porque al final del proceso lo vuelves a crear :) Supongo que al principio de gameover() tendrías que hacer un kill_all(type personaje) Comprueba el comando que hace décadas que no programo en DIV/Fénix :)
Y no vuelve a empezar el juego después del gameover() porque no has hecho nada para que empiece... Es decir, gameover() llama a menu(), pero no a laberinto(), personaje() y vida() como haces al principio del juego.
EDITO: El let_me_alone() que dice chipan es aún mejor y te ahorras el collision() dentro de laberinto(). Pero también hay algo parecido al kill(), ¿verdad?
Tengo el let_me_alone() justo debajo del begin del proceso game over
Ya esta ahora el problema es lo del start.
Ahora le da igual que tecla toque me cierra el programa
BUHOnero
04/07/2007, 10:22
Te has hecho la picha un lío, está mal planteado el código... no llamas a las funciones en el roden correcto, y el menu() no sirve de casi nada, porque los procesos se estan ejecutando, a ver... ponlo así:
process menu()
begin
x=160; y=120; file=id1; graph=7;
let_me_alone();
Loop
if (key(_enter)) break;end
if (key(_space)) exit();end
frame;
end
laberinto();
personaje();
vida();
end
Y arriba,. donde llamas a todas la funciones, llama solo a menu(), o sea, cambia:
menu();
laberinto();
personaje();
vida();
y deja solo menu()
y el let_me_alone(); ponlo tambien en menu, como ves que lo he puesto :D o en su defecto en el mismo lugar dentro de gameover(), o sea, antes del loop.
Saludos!!
PD: vente a VillaWei y aprenderás un poco más jajaja
Vaya problemon ahora me funciona bien se cierra los procesos y se queda solo gameover, pero, cuando le doy al enter para que haga el break y vuelva al menu el programa casca.
PROGRAM juego_laberinto;
GLOBAL
INT id1;
int vidas;
int select_fnt;
int titulo_fnt;
END
BEGIN
set_mode(320,240,16,MODE_WINDOW);
id1=load_fpg("imagenes.fpg");
vidas=3;
select_fnt=LOAD_FNT("select.fnt");
titulo_fnt=LOAD_FNT("titulo.fnt");
menu();
END
process menu()
begin
x=160; y=120; file=id1; graph=7;
LET_ME_ALONE();
Loop
if (key(_enter)) break;end
if (key(_space)) exit();end
frame;
end
laberinto();
personaje();
vida();
end
PROCESS personaje()
BEGIN
x=160; y=120; 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=3;
LOOP
if (key(_space)) exit(); end
if (key(_enter)) menu(); end
Frame;
end
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
BUHOnero
04/07/2007, 10:39
Prueba a cambiar esto:
PROCESS gameover()
BEGIN
LET_ME_ALONE();
x=160; y=120; file=id1; Graph=3;
LOOP
if (key(_space)) exit(); end
if (key(_enter)) menu(); end
Frame;
end
end
por esto:
PROCESS gameover()
BEGIN
LET_ME_ALONE();
x=160; y=120; file=id1; Graph=3;
LOOP
if (key(_space)) exit(); end
if (key(_enter)) break; end
Frame;
end
menu();
end
Sino gameover se queda ahí... a ver si ahora funciona :D
Si hubieras puesto el let_me_alone() en menu() no tendrías este problema, ya que al ejecutar el proceso menu() forzarías que gameover() se cerrase.
Saludos
Nada todo funciona bien hasta que le doy al enter en gameover.
Se bloquea el programa
BUHOnero
04/07/2007, 10:50
Nada todo funciona bien hasta que le doy al enter en gameover.
Se bloquea el programa
Que hace ahora el programa¿?
casca completamente, se peta y tengo que forzarlo a cerrarse desde el administrador de procesos
BUHOnero
04/07/2007, 10:55
Mira de cambiar esto:
PROCESS gameover()
BEGIN
LET_ME_ALONE();
x=160; y=120; file=id1; Graph=3;
LOOP
if (key(_space)) exit(); end
if (key(_enter)) break; end
Frame;
end
menu();
end
por esto:
PROCESS gameover()
BEGIN
LET_ME_ALONE();
x=160; y=120; file=id1; Graph=3;
LOOP
if (key(_space)) exit(); end
if (key(_enter)) break; end
Frame;
end
while(key(_enter))
frame;
end
menu();
end
< - >
Dentro de menu() pon vidas=3; porque sino cuando el juego acaba no recuperas las vidas, y siempre estas muerto.
Pon:
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
end
Ya carga el menuUUUUUU
pero cuando le doy al enter sale game over y vuelve al menu XD
que fallo se me habia olvidado lo de las vidas.
FUNCIONAAAAAA ahora solo me falta hacer mapas y una meta XD
Ya lo hare algun dia.
Una preguntilla: ¿Para cada mapa tengo que hacer un proceso no?
A ver si me explico tengo que tener tantos procesos como niveles quiero. No?
Y una meta por nivel tambien?
BUHOnero
04/07/2007, 11:20
Entonces ya va no¿? poruqe has mezclado posts y no me queda claro jajaja
Para los niveles, se trata solo de cambiar el gráfico, no hace falta hacer procesos diferentes, o sea del proceso:
PROCESS laberinto()
BEGIN
x=160; y=120; file=id1; graph=2;
LOOP
if (COLLISION(type gameover))break; end
FRAME;
END
END
solo tienes que cambiar el valor de graph, para asignar valores según el nivel puedes crear un array e ir mirando que gráfico es de cada nivel :)
Saludos y de nada... :D
< - >
Y una explicación de porqué carga ahora el menu(), al poner:
PROCESS gameover()
BEGIN
LET_ME_ALONE();
x=160; y=120; file=id1; Graph=3;
LOOP
if (key(_space)) exit(); end
if (key(_enter)) break; end
Frame;
end
while(key(_enter))
frame;
end
menu();
end
haces que hasta que no se suelte el enter no cargue el menu(), ya que dentro de menu tambien tienes puesto que cuando pulse enter que cargue procesos y salga del menu, de tal manera que pulsabas enter en gameover y salía de gameover y acto seguido salía de menu, por eso tienes que poner un detector, mientras se pulse no salgas de gameover, y en cuanto se suelta el enter carga menu y sale de gameover, espero que se entienda... porque te encontraras con este problema más de una vez, tienes que controlar muy bien que teclas se pulsan, y que hacen cuando se pulsan en cada momento.
Muchisimas gracias buhonero eres un crack.
Me quedas algo lejos pero si no te invitaba a una birra, si algun dia coincidimos en alguna quedada te la pago.A chipan y a juanvvc tambien les pago una birra.
Buhonero sabe mucho de DIV... ¡ganaba con bishop en el fostiator y se pasaba el alien suprimer!...
Y ahora los que no sabeis de que hablo, mas os vale buscar en google porque es una historia muy laraga de contar...
BUHOnero
04/07/2007, 12:21
Buhonero sabe mucho de DIV... ¡ganaba con bishop en el fostiator y se pasaba el alien suprimer!...
Y ahora los que no sabeis de que hablo, mas os vale buscar en google porque es una historia muy laraga de contar...
:D que kbron... jajaja
Casi ni jugué a este juego de lucha, el que me gustó mucho era el de carrera de chapas, ese si que molaba :D
Pipilio, ¿podrias dejar los archivos para que pueda trastear un poco con ellos? ;)
BUHOnero
04/07/2007, 12:27
Pipilio, ¿podrias dejar los archivos para que pueda trastear un poco con ellos? ;)
A ti te tengo en mi lista de discípulos!!! ve mirándote código... jejeje que dentro de poco recibirás un empujoncito para que puedas apañarte tu solito :D
Por supuesto.
Cuales quieres???
Te cuelgo todo el proyecto fpgs y todo:
Buhonero ¿Por que no portar el world chapas championship para la GP? Yo no lo tengo aqui ¿lo tienes tu?
A ti te tengo en mi lista de discípulos!!! ve mirándote código... jejeje que dentro de poco recibirás un empujoncito para que puedas apañarte tu solito :D
De acuerdo, maestro :D y las ganas que tengo de aprender mas!!
Muchas gracias pipilio!
No hay de que.
Alguien me puede pasar un ejemplo de animacion??? Pls
Que quiero cambiar la cutre flecha que tengo por un personaje animado.
Tengo las imagenes en FPG(x si hace falta saberlo)
el personaje "tiene"(pretendo que tenga) animacio al andar y al cambiar de direccion.
Gracias
PIPILIO
Es facil; creas un vector/cadena/array/como lo quieras llamas de ints con los fotogramas de la animación por cada animacion que quieras hacer, una variable contador y otra variable para el valor máximo que pueda tomar el contador.
int andar[]=1,2,3,4,3,2;
int cagar[]=6,7,6,7,6,7,8,8,8,9;
int contador;
int maxcontador;
Entonces cuando el personaje se ponga en el estado que corresponda a andar inicializas las variables.
...
if (estado==0) //parado
...
if (key(_left)) estado=3; contador=0; maxcontador=5; end
end
...
if (estado==3) //andando
x-=5;
contador+=1;
if(contador>maxcontador) contador=0; end
graph=andando(contador);
if(not key(_left)) estado=0; contador=0; maxcontador=0; end
end
...
Si no lo entiendes busca un viejo tutorial sobre personajes semicomplejos con estados que hice hace tiempo y está en algun hilo de la web.
No me e enterado de nada.
Tu explicacion la entiendo, pero, el codigo es un misteriopara mi.
http://gp32spain.com/foros/showthread.php?t=15812&highlight=animacionTu hilo
Lo de estado tengo que crear un int no?
PIPILIO
BUHOnero
05/07/2007, 12:39
Es facil; creas un vector/cadena/array/como lo quieras llamas de ints con los fotogramas de la animación por cada animacion que quieras hacer, una variable contador y otra variable para el valor máximo que pueda tomar el contador.
int andar[]=1,2,3,4,3,2;
int cagar[]=6,7,6,7,6,7,8,8,8,9;
int contador;
int maxcontador;
Entonces cuando el personaje se ponga en el estado que corresponda a andar inicializas las variables.
...
if (estado==0) //parado
...
if (key(_left)) estado=3; contador=0; maxcontador=5; end
end
...
if (estado==3) //andando
x-=5;
contador+=1;
if(contador>maxcontador) contador=0; end
graph=andando(contador);
if(not key(_left)) estado=0; contador=0; maxcontador=0; end
end
...
Si no lo entiendes busca un viejo tutorial sobre personajes semicomplejos con estados que hice hace tiempo y está en algun hilo de la web.
Yo soy mas cutre, nunca he usado este sistema :D
Prefiero poner las imágenes seguidas en el fpg, y ir llamádolas tal cual, haciendo graph++
Saludos
Como se hace eso de graph++ buhonero???
Que estoy vago.
Lo intentare de las 2 maneras.
Como integro eso en este codigo??
PROCESS personaje()
BEGIN
x=160; y=120; 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
No me acuerdo x que meti eso angle XD
Es un coñazo que el personaje gire sobre todo para meterle las animaciones, seguramente lo quite.
BUHOnero
05/07/2007, 12:50
Process personaje()
Private
tmp_animacion=0;
// los gráficos tiene que ser correlativos en el fpg
inicio=10; // primer gráfico de la animación
fin=19; // último gráfico de la animacion
Begin
x=160;
y=120;
graph=inicio;
loop
tmp_animacion++;
if(tmp_animacion mod 3==0) // esta linia controlamos que la animacion vaya un poco más lenta o rápida variando el numero
graph++;
if(graph>fin)
graph=inicio;
end
tmp_animacion=0;
end
end
End
Yo soy mas cutre, nunca he usado este sistema :D
Prefiero poner las imágenes seguidas en el fpg, y ir llamádolas tal cual, haciendo graph++
Saludos El problema de eso es cuando tienes que usar el mismo fotograma 2 (o más) veces para una animación, solo te quedan 2 opciones: o lo repites en el fpg y gastas mas espacio en disco y memoria ram, o lo haces como digo yo (entre otros métodos).
edit: la etiqueta CODE esta pa algooo que sin tabular no hay quien lea el código.
Con el codigo qque has puesto Buhonero siempre habra la misma animacion no?
Le dara igual que tecla pulse.
quiero que al ir a un lado haga un movimiento y al al otro otro diferente.
Solo me queda la opcion de chipan para hacer eso?
Muchas Gracias
PIPILIO
BUHOnero
05/07/2007, 18:48
Con el codigo qque has puesto Buhonero siempre habra la misma animacion no?
Le dara igual que tecla pulse.
quiero que al ir a un lado haga un movimiento y al al otro otro diferente.
Solo me queda la opcion de chipan para hacer eso?
Muchas Gracias
PIPILIO
Normalmente se usa la misma animacion para las dos direcciones, pero girada, eso se controla con flags=0 o flags=1, o sea, para que mire hacia la derecha pones flags=1 y a la izquierda flags=0, no recuerdo exactamente, prueba las dos opciones.
Entonces en el codigo hay que hacer algo asi:
if(key(_left))
flags=0;
end
if(key(_right))
flags=1;
end
Es muy resumido, aquí tienes que poner los bucles que te he puesto antes dentro de cada if, más o menos tendría que funcionar, piensa que hay muchas maneras de hacer lo mismo.
Saludos
Vamos a ver tengo este codigo:
program prueba;
global
int vida;
end
begin
SET_MODE(320,240,16,MOdE_WINDOW);
vida=LOAD_FPG("imagenes.fpg");
personaje();
end
process personaje()
private
tmp_animacion=0;
inicio=10;
fin=12;
begin
x=240; y=120; file=vida; graph=inicio;
loop
tmp_animacion++;
if(tmp_animacion mod 3==0)
graph++;
if(graph>fin)
graph=inicio;
end
tmp_animacion=0;
end
end
end
Aqui donde va el frame y las instrucciones de las flechas y todo eso ??
Que nunca habia puesto un private.
Soy un paqueteeeee.
Alguien me puede decir una pagina de ejemplos de fenix????
asi no tendre que dar tanto la chapa XD
BUHOnero
06/07/2007, 10:58
Nunca lo he probado a opner así, pero intenta poner esto en el proceso del personaje:
process personaje()
private
tmp_animacion=0;
inicio=10;
fin=12;
begin
x=240; y=120; file=vida; graph=inicio;
loop
if(key(_left))
flags=0;
tmp_animacion++;
end
if(key(_right))
flags=1;
tmp_animacion++;
end
if(tmp_animacion mod 3==0)
graph++;
if(graph>fin)
graph=inicio;
end
tmp_animacion=0;
end
frame;
end
end
Asi ya funciona.
Pero por qur leches al compilar ya sale animado y corriendo.
Es la vida como patea.
Tengo otro problema quiero que cambie de grafico segun la direccion.
Si va para arriba que se le vea la espalda.
Si va para abajo la cara.
y para los lados.
Ahora tengo este codigo que me has pasado:
program prueba;
global
int vida;
end
begin
SET_MODE(320,240,16,MOdE_WINDOW);
vida=LOAD_FPG("imagenes.fpg");
personaje();
end
process personaje()
private
tmp_animacion=0;
inicio=10;
fin=1;
begin
x=240; y=120; file=vida; graph=inicio;
loop
if(key(_up))
tmp_animacion++;
end
if(key(_down))
tmp_animacion++;
end
if(key(_left))
flags=0;
tmp_animacion++;
end
if(key(_right))
flags=1;
tmp_animacion++;
end
if(tmp_animacion mod 3==0)
graph++;
if(graph>fin)
graph=inicio;
end
tmp_animacion=0;
end
frame;
end
end
Se puede meter x ejemplo un tmp_animaion1 con inicio1 y fin1 y hacer que al darle hacia arriba cambie a ese grafico???
Y donde pongo lo que quiero que haga al pulsar la tecla.
Asi se anima pero no se mueve.
BUHOnero
06/07/2007, 11:55
Asi ya funciona.
Pero por qur leches al compilar ya sale animado y corriendo.
Es la vida como patea.
Tengo otro problema quiero que cambie de grafico segun la direccion.
Si va para arriba que se le vea la espalda.
Si va para abajo la cara.
y para los lados.
Ahora tengo este codigo que me has pasado:
Se puede meter x ejemplo un tmp_animaion1 con inicio1 y fin1 y hacer que al darle hacia arriba cambie a ese grafico???
Y donde pongo lo que quiero que haga al pulsar la tecla.
Asi se anima pero no se mueve.
exacto, esa es la idea, en cada pulasción puedes cambiar al graph que quieras, pero has de controlar como haces los cambios, necesitas una variables para cada estado, y ahi comprobar que direccion pulsas, para pasar graph al inicio de esa animacion
en Private ponte variables:
arriba=1
derecha=2
abajo=3
izquierda=4
mirando_hacia=0;
inicio_arriba=1;
fin_arriba=9;
inicio_abajo=10;
fin_abajo=19;
... todas las direcciones
dentro del personaje haces esto:
if(key(_up))
if(mirando_hacia<>1)
mirando_hacia=1;
graph=inicio_arriba;
fin=fin_arriba;
end
tmp_animacion++
end
if(key(_down))
if(mirando_hacia<>3)
mirando_hacia=3;
graph=inicio_abajo;
fin=fin_abajo;
end
tmp_animacion++
end
y las otras direcciones
Y ten en cuenta que el final de animacion depende tambien de la direccion, por tanto fin depende de hacia donde mires.
Saludos
Quiero hacer una pruebecilla sin mas a ver si va, pero no me compila esto.
program prueba;
global
int vida;
end
begin
SET_MODE(320,240,16,MOdE_WINDOW);
vida=LOAD_FPG("imagenes.fpg");
personaje();
end
process personaje()
private
tmp_animacion=0;
inicio=10;
fin=21;
arriba=1;
derecha=2;
abajo=3;
izquierda=4;
mirando_hacia=0;
inicio_arriba=13;
fin_arriba=15;
inicio_derecha=19;
fin_derecha=21;
inicio_abajo=10;
fin_abajo=12;
inicio_izquierda=16;
fin_izquierda=18;
Begin
x=240; y=120; file=vida;
Loop
if(key(_up))
if(mirando_hacia<>1)
mirando_hacia=1;
graph=inicio_arriba;
fin=fin_arriba;
end
if(tmp_animacion mod 3==0)
graph++;
if(graph>fin)
graph=inicio;
end
tmp_animacion=0;
end
frame;
end
end
BUHOnero
06/07/2007, 13:40
program prueba;
global
int vida;
end <- quita este end :D
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.