Duda al cambiar de pantalla

Started by UnMandrango, May 27, 2010, 06:56:02 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

UnMandrango

Bueno, solo llevo dos dias, pero estoy intentando hacer que el ejemplo de matamarcianos sea un juego mas o menos completo. De momento he tiene la nave jugador que dispara y enemigos, los disparos matan los enemigos que cada uno da 10 puntos, y si el enemigo choca con la nave quita 25 de vida, en la pantalla tengo la puntuacion y la vida del jugador... mas o menos ya es jugable, la cosa esta en que he intetado hacer como unas pantallas, me explico, he hecho un menu principal con su titulito y las opciones jugar o salir, esto funciona, luego jugando si pulsas esc se congelan todos los procesos (enemigos, disparos y nave) y pregunto ¿Realmente desea salir?(S/N), esto tambien fucniona, puedes salir, o reanudar la partida donde la dejaste... El problema esta, en que cuando se termina la vida, sale otra pantalla igual que la de antes, con "Game Over! Seguir jugando?(S/N)" si le das a N sales de juego sin problema, pero si le das a S el juego se congela y no empieza otra partida.

Me he vuelto loco, he probado de todo, cuando mueres, la idea es matar todos los procesos, he probado con let_me_alone y con signal(ALL_PROCESS,s_kill) y signals por tipo tambien, no fuese que matar algun proceso fuese la causa, bueno la cosa es que he reotcado todo mil veces y no hay manera de conseguir empezar otra partida, se congela siempre solo en esa opcion...

Os pongo el codigo que gestiona las pantallas y tal, a ver si veis algo vosotros, pero yo creo que deberia estar bien...

process main()
private
int font_titulo,font_boton,font_marcas;
end
begin
set_mode(640,480,32);
set_fps(60,1);
graficos=load_fpg("matamarcianos.fpg");
font_titulo=load_fnt("titulo.fnt");
font_boton=load_fnt("boton.fnt");
font_marcas=load_fnt("marcas.fnt");
loop
switch (pantalla)
case 0:
write(font_titulo,320,50,4,"Matamarcianos");
write(font_boton,220,180,4,"Jugar");
write(font_boton,420,180,4,"Salir");
menunave();
loop
if(salir==1) break; end
if(pantalla==1) nave(); break; end
frame;
end
end

case 1:
delete_text(0);
put_screen(graficos,1);
write(font_marcas,5,5,0,"Puntacion: ");
write_var(font_marcas,5+text_width(font_marcas,"Puntuacion: "),5,0,score);
write(font_marcas,5,450,0,"Vida: ");
write_var(font_marcas,5+text_width(font_marcas,"Vida: "),450,0,life);
loop
if (key(_esc))
pantalla=2;
signal(ALL_PROCESS,s_freeze);
break;
end
if (life==0)
pantalla=3;
signal(ALL_PROCESS,s_kill);
break;
end
if(rand(1,3)==1) enemigo(rand(0,640), rand(-5,5),rand(1,3)); end
frame;
end
end

case 2:
clear_screen();
loop
delete_text(0);
write(font_marcas,320,240,4,"Realmente deseas salir?(S/N)");
if(key(_s)) salir=1; break; end
if(key(_n))
pantalla=1;
signal(ALL_PROCESS,s_wakeup);
break;
end
frame;
end
end

case 3:
clear_screen();
loop
delete_text(0);
write(font_marcas,320,225,4,"Game Over!");
write(font_marcas,320,255,4,"Volver a jugar?(S/N)");
if(key(_n)) salir=1; break; end
if(key(_s))
pantalla=1;
nave();
break;
end
frame;
end
end
end
if (salir==1)
unload_fpg(graficos);
let_me_alone();
break;
end
end
end


Creo que con eso bastara, sino decirmelo y subo el codigo entero.

Espero haberme explicado bien, gracias!  ;D

FreeYourMind

Tu sube el código entero que se ve mejor y se puede probar directamente  ;D

UnMandrango

Joder que velocidad xD estabas acechandome?

Lo subo entero, pero sin imagenes ni fuentes no podreis probarlo..

Ahi va...

import "mod_video";
import "mod_map";
import "mod_screen";
import "mod_key";
import "mod_proc";
import "mod_grproc";
import "mod_rand";
import "mod_text";

const
Retardo=10;
end

global
int pantalla=0;
int salir=0;
int graficos;
int score=0;
int life=100;
end

process main()
private
int font_titulo,font_boton,font_marcas;
end
begin
set_mode(640,480,32);
set_fps(60,1);
graficos=load_fpg("matamarcianos.fpg");
font_titulo=load_fnt("titulo.fnt");
font_boton=load_fnt("boton.fnt");
font_marcas=load_fnt("marcas.fnt");
loop
switch (pantalla)
case 0:
write(font_titulo,320,50,4,"Matamarcianos");
write(font_boton,220,180,4,"Jugar");
write(font_boton,420,180,4,"Salir");
menunave();
loop
if(salir==1) break; end
if(pantalla==1) nave(); break; end
frame;
end
end

case 1:
delete_text(0);
put_screen(graficos,1);
write(font_marcas,5,5,0,"Puntacion: ");
write_var(font_marcas,5+text_width(font_marcas,"Puntuacion: "),5,0,score);
write(font_marcas,5,450,0,"Vida: ");
write_var(font_marcas,5+text_width(font_marcas,"Vida: "),450,0,life);
loop
if (key(_esc))
pantalla=2;
signal(ALL_PROCESS,s_freeze);
break;
end
if (life==0)
pantalla=3;
signal(ALL_PROCESS,s_kill);
break;
end
if(rand(1,3)==1) enemigo(rand(0,640), rand(-5,5),rand(1,3)); end
frame;
end
end

case 2:
clear_screen();
loop
delete_text(0);
write(font_marcas,320,240,4,"Realmente deseas salir?(S/N)");
if(key(_s)) salir=1; break; end
if(key(_n))
pantalla=1;
signal(ALL_PROCESS,s_wakeup);
break;
end
frame;
end
end

case 3:
clear_screen();
loop
delete_text(0);
write(font_marcas,320,225,4,"Game Over!");
write(font_marcas,320,255,4,"Volver a jugar?(S/N)");
if(key(_n)) salir=1; break; end
if(key(_s))
pantalla=1;
nave();
break;
end
frame;
end
end
end
if (salir==1)
unload_fpg(graficos);
let_me_alone();
break;
end
end
end

process menunave ()
private
int menubala=1;
end
begin
graph=2;
x=220;
y=425;
loop
if (key(_left) && x==420) x=220; end
if (key(_right) && x==220) x=420; end
if (key(_space) && menubala==1) menubala=0; menudisparo(); end
frame;
end
end

process menudisparo ()
begin
graph=3;
y=425;
x=father.x;
loop
y=y-5;
if(y<190 && x==420) salir=1; signal(type menunave,s_kill); break; end
if(y<190 && x==220) pantalla=1; signal(type menunave,s_kill); break; end
frame;
end
end

process nave ()
private
int cont=0;
ID_enemigo;
end
begin
graph=2;
x=320;
//La nave está a 10 píxeles del extremo inferior de la ventana
y=435;
loop
cont--;
if(cont<0) cont=0; end
if (key(_left)) x=x-4; end
if (key(_right)) x=x+4; end
if (key(_space) AND cont==0)
cont=retardo;
disparo();
end
if (ID_enemigo=collision(type enemigo))
signal(ID_enemigo,s_kill);
life-=25;
end
if (x>600) x=600; end //Para que la nave no se salga por la derecha
if (x<40) x=40; end //Para que la nave no se salga por la izquierda
frame;
end
end

process disparo ()
begin
graph=3;
y=435;
x=father.x;
z=1;
repeat
y=y-15;
frame;
until (y < -15)
end

process enemigo (x,inc_x,inc_y)
private
ID_disparo_acertado;
end
begin
graph=4;
size=rand(65,115);
y=-40;
z=2;
repeat
x+=inc_x;
y+=inc_y;
if (ID_Disparo_acertado=collision(type disparo))
signal(ID_disparo_acertado,s_kill);
score+=10;
break;
end
frame;
until (y > 520)
end

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

UnMandrango

Bueno, pues nada, os subo en un .rar todo el juego y adelantamos. xD

http://www.filehosting.org/file/details/147890/matamarcianos.rar

A ver si alguien sabe porque pasa... mientras ire probando de meter sonidos  :)

Futu-block

sube el copiraigth tambien...

je je je

SplinterGU

para reiniciar, no solo tenes que setear pantalla a 1, sino tambien life a 100.


...
if(key(_s))
    life=100;
pantalla=1;
nave();
break;
end
...


disculpa la demora, pero me eche a dormir un rato.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

UnMandrango

Jajajaj, dios que cosa mas tonta... :-[

Estaba tan ofuscado con los procesos y tonterias que ni pense lo de la vida. Tambien me faltaba poner el score a 0 al volver a empezar. Gracias por tu tiempo SplinterGU!

Bueno mi tercer dia con Bennu, y esto pinta muy bien. Le he añadido sonido a los disparos y al game over, tambien he ordeando los enemigos creando 3 tiras de enemigos y se van moviendo poco a poco hacia abajo en vez de todo aleatorio como estaba antes, ademas ahora los enemigos te disparan tambien, tienes 4 toques, ya sea un disparo enemigo, una colision con un enemigo o que un enemigo salga por la parte de abajo de la pantalla, todo eso quita 25 de vida, de 100 que tienes. Tambien si los eliminas a todos, se sube de nivel, volviendo a crear los enemigos, pero a cada nivel tienen mas velocidad de movimiento y frecuencia de disparo. Si llegas al nivel 10 superas el juego, pero tranquilos, nadie llegara tan lejos xD

Esto ya se puede considerar un juego, no se si le hare algun retoque mas y cuando este terminado os lo subire.

Saludos! ;)

SplinterGU

si, yo solo me fije lo necesario para que arrancara...

por favor, de nada, gracias a vos por usar bennu... realmente necesitamos que lo usen y lo difundan... gracias.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Tendrás muchos problemas como ese, siento no haberme puesto a mirar tu código pero he estado ocupado...

Ante ese problema deberías haber puesto varios write_var en pantalla indicando la vida del protagonista, su identificador de proceso y su posición, por ejemplo, que son los valores que indican si la nave se ve o no.

No tengas miedo de dejar la pantalla llena de write_var porque te detectan muchos problemas: fpgs no cargados correctamente, salidas de rango en los gráficos de una animación, valores que se quedan a 0 y no deberían, etc.

Suerte!
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es