Problema con Bennugd

Started by oriun, October 01, 2010, 03:14:06 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

oriun

Estoy pensando en hacer como en el tutorial de Osk, hacer que las acciones se ejecuten una de cada 80 veces que se ejecuta disparo, es decir, cuando disparo se ejecuta 80 veces, el resto se ejecuta uno, pero no se puede porque se crashea. Era cuestión de intentarlo...

oriun

Si alguien sabe como hacer que un proceso se ejecute el doble o el tríple de veces que los otros, es decir, todos-uno-uno-todos-uno-uno-todos...
que me lo diga para implantarlo.
Gracias, que se me han ocurrido muchas cosas para hacer en bennu.

Drumpi

FRAME(50) hace que se ejecute el doble de veces que el resto, pero sólo saca por pantalla 1 de cada dos "frames".
FRAME(33) hace que se ejecute el triple (más o menos, falla 1 frame de cada 100), pero sólo saca por pantalla 1 de cada 3 frames.
FRAME(200) hace que se ejecute la mitad de las veces (una vez cada dos frames), mostrando lo mismo dos frames seguidos.
FRAME(300) hace que se ejecute una vez cada 3 frames.

¿Se entiende el concepto? :D
Si alguien se acuerda de dónde leches escribí el ejemplo de la ventanilla y los 100 folios, que ponga el enlace, que tengo sueño :P
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

oriun


FreeYourMind


oriun

#35
Señores, hoy es un gran día para Bennu y para mí.
Gracias a vuestra colaboración he conseguido lo que me proponía con éxito.
Cuando lo acabe lo subiré y portaré a Wiz.
;D
Aunque es cierto que a veces no mata el proceso que colisiona, mata a esos y al resto, ahora subo el código.
import "mod_video";
import "mod_proc";
import "mod_map";
import "mod_key";
import "mod_rand";
import "mod_grproc";
import "mod_text";
import "mod_debug";
import "mod_scroll";
import "mod_proc";                
//INCLUDE "jkeys.lib";
GLOBAL
   int score=8001;
   int font;
   int contador=0;
   int timer=0;
   
BEGIN
   //jkeys_set_default_keys();
   //jkeys_controller();
   set_mode(640,480,32,MODE_WINDOW);    //Resolución de pantalla a 320x240 píxel, 24 bits de color y en modo ventana
   load_fpg("images/sprite.fpg");    //Carga el fichero para gráficos sprite.fpg de la carpeta images
   font=load_fnt ("font/title.fnt");
   title();
   
END                    //Fin del proceso principal del videojuego

PROCESS title()
PRIVATE
   int texto;
   int tempo;
BEGIN
   x=320;
   y=240;
   LOOP
       tempo=tempo+1;
       IF (tempo == 100)
           protagonista();
           start_scroll (0, 0, 24, 0, 0, 0);
           break;
       END
       texto = write (font, x, y, 4, "BOMB ATTACK");
       frame;
       delete_text ( texto );
   END
END

PROCESS protagonista()
BEGIN
   graph=1;
   x=320;        //Ancho
   y=400;        //Alto
   LOOP    //Repeticion
       IF (key(_left))
           x=x-2-score/1000;
           flags=0;
           graph=graph+1;
           IF (graph == 3)
               graph=1;
           END
       ELSIF (key(_right))
           x=x+2+score/1000;
           flags=1;
           graph=graph+1;
           IF (graph == 3)
               graph=1;
           END
       END
       
       IF (x => 640)
           x=1;
       END
       IF (x <= 0)
           x=639;
       END
       IF (key(_space))
           disparo();
       END
       IF (rand(1,100)+score/1000 > 99)
           enemy();
           contador=contador+1;            
       END
       IF (key(_esc))
           exit(0);
       END
       write_var (font, 80, 25, 2, score);
       write_var (font, 80, 45, 2, contador);
       frame;
   END
END

PROCESS disparo()
BEGIN
   graph=9;
   x=father.x;
   y=father.y;
   flags=father.flags;
   LOOP
   if (collision (type enemy))
       score=score+100;
       explosion ();
       signal (get_id (type enemy), s_kill);
       break;
   END
       IF (flags == 0)
           x=x-3;
           y=y-3;
       ELSIF (flags == 1)
           x=x+3;
           y=y-3;
       END
       IF (y == 0)
           break;
       END
       frame(1);
   END
END

PROCESS enemy ()
BEGIN
   graph=7;
   x=rand(0,640);
   y=0;
   LOOP
       y=y+1+score/1000;        
       IF (contador == 20)
           break;
       END
       IF ( y => 400)
           explosion();
           break;
       END
           frame;
   END
eND

PROCESS explosion ()
BEGIN
   graph=10;
   x=father.x;
   y=father.y;
   LOOP
       graph=graph+1;
       IF (graph == 23)
           contador=contador-1;
           break;
       END
       frame;
   end
END

Drumpi

Porque es posible que haya un conflicto usando COLLISION y luego GET_ID: collision devuelve el ID del proceso con el que choca (no, no devuelve TRUE o FALSE, sino cero si NO colisiona, o el ID de uno de los procesos que colisiona), por lo que al pedir GET_ID, este tratará de devolver otra ID de un enemigo, y si no hay más pues devuelve cero y se hace el kill con resultados imprevisibles.
Mi consejo es que hagas esto:
[code language="bennu"]    temp_id=collision (type enemy);
    if (temp_id)
        score=score+100;
        explosion ();
        signal (temp_id, s_kill);
        break;
    END[/code]
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

DCelso

Quote from: Drumpi on October 13, 2010, 12:05:37 AM
Porque es posible que haya un conflicto usando COLLISION y luego GET_ID: collision devuelve el ID del proceso con el que choca (no, no devuelve TRUE o FALSE, sino cero si NO colisiona, o el ID de uno de los procesos que colisiona), por lo que al pedir GET_ID, este tratará de devolver otra ID de un enemigo, y si no hay más pues devuelve cero y se hace el kill con resultados imprevisibles.
Mi consejo es que hagas esto:
[code language="bennu"]    temp_id=collision (type enemy);
    if (temp_id)
        score=score+100;
        explosion ();
        signal (temp_id, s_kill);
        break;
    END[/code]

Umn.... , y lo que me suena a mi esto...

Quote from: DCelso on October 09, 2010, 06:05:53 PM
No puedo probar el ejemplo porque a mi me sale una pantalla en negro sin nada y no se cierra hasta que toco esc.
prueba con esto

colision = collision ( type disparo );
IF (colision && exist(colision))
            score=score+100;
            signal( colision , s_kill);
            explosion();
            break;
        END


Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

oriun

DCelso, tienes razon, sois todos la leche y os pondré a todos en los creditos, es lo menos que puedo hacer. :P
Cuando lo implemente me estudiaré el tema de las durezas y pondré bloques por debajo que se rompan cuando les caiga una bomba.

oriun

Aquí estoy yo otra vez!!!
Bueno, pues ahora estamos con los bloques, que cuando cae un misil se rompen, pero el prota no debería poder pasar por encima de los bloques que están rotos.
Miré el tema de las durezas y vi que era casi imposible hacerlo así, también le puse un gráfico en alfa de color verde, pero tendría que poner que colisiona con los 64 bloques que tengo que poner y se quedaría atascado...
El caso es que os pongo el ejemplo, sin las librerias ni interpretes, con el código, con 35 bloques de prueba, para que le echeis un vistazo:
http://forigu.net16.net/ba.7z

DCelso

Se me ocurre varias opciones:
1.- guardar los ids de todos los bloques, y comprobar que la x del personaje corresponda con alguna de algún bloque para poder continuar.
    si x ==id_bloque1.x or  x ==id_bloque2.x or etc... podemos andar sino no.
2.- crear un array de tamaño igual al ancho del escenario entre el ancho del sprite y poner unos o ceros indicando en donde hay bloques rotos y no puede seguir el prota. Po ejemplo si el escenario es de 320 y el sprite ocupa 10 de ancho pues un array de dimensión 32. luego para calcular la posicion del prota en el array sería pos_en_array=x/10, por ejemplo si el prota está en x = 310, pos_en_array es 31, mirarias si hay un cero en array[31] para saber si puede continuar.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

oriun

#41
Personalmente ahora lo que me preocupa es que se quede atascado en una casilla donde no hay bloque al romperse.
Había pensado en ponerlo con el sistema de Durezas, pero al parecer, eso sería mucha complicación del código.

oriun

Bueno, bueno...
Hoy traigo noticias frescas...
Esto está casi ya acabado, me falta la música y los highscores y un par de detallitos, pero ya se puede considerar la versión inicial.
http://forigu.net16.net/ba.zip

oriun

Bueno, bueno. Esto es embarazoso... jaj!! Mozilla Firefox.
Vamos al lio:
Ahora os voy a poner el código 'malvado' y os cuento los errores que me imprime la terminal:
http://textsnip.com/my/bgcode
No me cabe en el post...
Los problemas que me da es del proceso marcador: ERROR: Runtime error in MARCADOR(65542) - Process 0 not active
y esta es la información del debug:

                                              [   7] 000000FF 00000165          ------              program.prg:357 -> x=idprota.x;

                                              [   9] 00000093 00000034          LOCAL               52     

089F62FC
                                              [  11] 00000099 00000458          GET_GLOBAL          1112   

089F62FC 00000000
                                              [  13] 0000009A 00000034          GET_REMOTE          52     

ERROR: Runtime error in MARCADOR(65542) - Process 0 not active


Y otra cosa que os queria preguntar es: ¿Cómo puedo guardar en un archivo de texto los Highscores?
Y, ¿Cómo hacer un menú?, porque tal y como lo estoy intentando hacer solo me da problemas.
SplinterGU, atacale a las dudas.
Gracias.

SplinterGU

te respondere la del proceso...

ese error lo da cuando quieres acceder a variables de un proceso que no existe, podrias usar exists antes de acceder a esa variable, con hacerlo una vez luego del frame es suficiete.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2