Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: L3K-RH on July 03, 2010, 11:55:40 AM

Title: Cambiar de fase
Post by: L3K-RH on July 03, 2010, 11:55:40 AM
Ola, necesito cambiar de "mundo" en el juego, es decir, eliminar todo en pantalla (el mapa, el modelo_prota, los enemigos, texto de GUI...) y ademas matar a todos los processos y funciones. Como lo puedo hacer?  ???
Title: Re: Cambiar de fase
Post by: Drumpi on July 03, 2010, 12:14:05 PM
Pues descargando los mapas, matando los procesos correspondientes, borrando los textos, etc, etc...

El cómo no lo se, eso depende de cómo hayas hecho tu código.
En mi caso, tengo un proceso que lanza un nivel, para ello rellena los campos necesarios para el juego (generalmente, la energía del prota y las vidas) y luego llama a otro proceso, encargado de ejecutar un nivel (sólo uno), luego se duerme. Este proceso de nivel sólo requiere el número de nivel y se encarga de cargar sus gráficos, crear los procesos necesarios, etc, y cuando una variable global le indica el final del nivel, mata a todos sus hijos, descarga gráficos y demás, y cuando no queda nada que dependa de él, despierta al padre para que ejecute otro porceso igual con otro número de nivel.
Tiene la pega de que está cargando los mismos recursos una y otra vez, pero así no hay dependencias entre procesos y se hace más sencillo. También puedes cargar los recursos desde el padre y pasárselo como parámetros, pero en ocasiones es tal el número de FPGs y sonidos que acabas por hacerlo de la otra forma.

Este último juego me está enseñando a organizarme mucho más que los anteriores. Quizás debería sacar un manualillo con técnicas de este tipo, de organización, recomendaciones a la hora de hacer juegos...
Title: Re: Cambiar de fase
Post by: L3K-RH on July 03, 2010, 02:19:10 PM
Gracias, es lo que pensaba hacer (con signal (s_kill), delete_gui, m8e_modelremove, etc), pero pense q habia una manera mas facil.

Algo como que al proceso fase1 (el que invoca todo) como no entiende de posicion, rotacion, o esas cosa se le podria hacer M8E_MODELADDCHILD a los procesos q invoca. Asi solo mato a fase1() y mueren todos a los q invoca.

Te aviso q soy muy dado a decir cosas sin sentido asi q corrigeme si digo algo sin sentido.  :-[

Si no hare lo q me has dicho, creo q es lo mejor. Por cierto, si haces lo del manual, me envias una copia jajaja
Title: Re: Cambiar de fase
Post by: L3K-RH on July 03, 2010, 02:22:29 PM
Quote from: L3K-RH on July 03, 2010, 02:19:10 PM
Algo como que al proceso fase1 (el que invoca todo) como no entiende de posicion, rotacion, o esas cosa se le podria hacer M8E_MODELADDCHILD a los procesos q invoca. Asi solo mato a fase1() y mueren todos a los q invoca.

OJO, no me tomes por tonto, lo de m8e_modeladdchild ya se q es solo para modelos, pero es q no se me ocurria otra cosa para procesos, si hay dimelo
Title: Re: Cambiar de fase
Post by: L3K-RH on July 03, 2010, 02:36:25 PM
el M8E_CLEARESCENE no funciona ¿no?
Porque se podria poner al final de cada fase, junto a un let_me_alone
Title: Re: Cambiar de fase
Post by: Drumpi on July 03, 2010, 02:45:21 PM
Sorry, pero de bennu3D ni idea, eso a wind o a prg que son los que más le dan a las 3 dimensiones, o en su defecto a L1nk3rn3l, uno de los creadores.
Title: Re: Cambiar de fase
Post by: DjSonyk on July 03, 2010, 03:45:20 PM
Aun no he tenido tiempo de ver como funciona Bennu 3D,poco te puedo ayudar,mi consejo en vez de dormir el proceso padre como dice Drumpi es que este en un bucle que salga ,bien por fin de fase o bien por final del juego,descargue el nivel ,y luego que lanze de nuevo el bucle con un nuevo nivel en caso que sea fin de fase o que retorne al menu dependiendo...Algo asi..[code language="bennu"]
REPEAT
  // Aqui todo lo necesario para crear los procesos y cargar el nivel que toque
  REPEAT
       FRAME;
  UNTIL ( FIN_FASE || MUERTO )
  // Aqui todo lo necesario para matar los procesos y descargar el nivel
  FRAME;
  // De aqui saltaria al primer REPEAT si le quedaran vidas al jugador y cargaria el siguiente nivel,ect
  // Si no le quedaran vidas ,pues saldria de la partida ,ya descargado nivel y todo
UNTIL ( VIDA!=0 )
[/code]
Sinceramente Drumpi no le veo sentido tener un proceso "Durmiente" mientras esta la partida en marcha,aunque cada uno es cada uno.
Title: Re: Cambiar de fase
Post by: Drumpi on July 03, 2010, 04:51:59 PM
Porque es un proceso que se encarga de lanzar un único sub-nivel y de controlar todo lo relativo a la partida (inicialización de datos, llamar al proceso de intro del nivel, de fin de nivel, de game over...).

Por ejemplo, en un juego de coches, tengo un proceso que se encarga de jugar un circuito con unos personajes y unas posiciones iniciales. Pero aparte tengo un proceso, llamémoslo "time trial" que llama sólo a uno de estos circuitos con unas condiciones, pero podemos tener un proceso "gran prix" que llame a hasta 4 circuitos, variando el orden de salida, los puntos y que puede interrumpir la partida por la mitad en caso de quedarte sin vidas.

Vamos, que te permite hacer fácilmente varios modos de juego usando el mismo proceso de "jugar nivel".
Pero bueno, es una forma de verlo. Si la cosa es más sencilla, no hay que complicarse tanto.
Title: Re: Cambiar de fase
Post by: L3K-RH on July 03, 2010, 05:11:31 PM
DjSonyk, gracias, lo q yo tenia era algo parecido a lo tuyo, solo q de mal manera

[code language="bennu"]
PROCESS cambiar_fase ()
BEGIN
   let_me_alone (); //matar todos los procesos
   M8E_CLEARSCENE (); //eliminar todo lo q hay en pantalla
   
   config_video ( ); // hace todas las cosas inciales (configurar el video y carga los sonidos)
   cargar_sonidos ();
   
   presentation ( ); //pone de nuevo el menu inicial
   
   fases (); //notese q dependiendo de lo q eligas en menu inicial, fases() invocara una u otra cosa
   
    LOOP
        IF ( key ( _ESC ) )
   exit ( 0 );
      END
        FRAME;
    END
END[/code]

Lo q me pasaba es q m8e_clearscene me daba error.
Title: Re: Cambiar de fase
Post by: L3K-RH on July 03, 2010, 05:14:13 PM
Otra cosa q me decia windgate era q creara un distintos prg (prg del juego, el principal) como si fueran juegos diferentes y q para cambiar de fase salga del juego y vuelva a entrar con el prg correspondiente
Title: Re: Cambiar de fase
Post by: L3K-RH on July 03, 2010, 05:23:23 PM
Quote from: Drumpi on July 03, 2010, 02:45:21 PM
Sorry, pero de bennu3D ni idea, eso a wind o a prg que son los que más le dan a las 3 dimensiones, o en su defecto a L1nk3rn3l, uno de los creadores.

Suelo pedirle ayuda a menudo a Windgate y casi siempre me ayuda, pero hay veces q esta muy ocupado.
PS: Gracias por tu ayuda  :D
Title: Re: Cambiar de fase
Post by: Windgate on July 03, 2010, 06:00:38 PM
Tengo pendiente pasarle a l1nk3rn3l el ejemplo en el que al remover todos los elementos 3D de la escena se queda colgado.

El problema es complicado, por un lado hay que matar a casi todos los procesos activos, y por otro lado hay que remover todos los modelos, ya que en Bennu 3D un modelo no tiene por qué estar asociado a un proceso.

- Si se matan primero los procesos hay error al intentar limpiar la escena, y no tengo determinado por qué sucede, no debería ???

- Si se eliminan primero los modelos de la escena, los procesos activos hacen referencia a ellos y también hay error, así que lo correcto debería ser la primera solución.

En cuanto tenga un tiempo le paso el ejemplo a l1nk... A mí también me inquieta el asunto.
Title: Re: Cambiar de fase
Post by: l1nk3rn3l on July 06, 2010, 05:21:14 PM
M8E_CLEARSCENE ();, bastaria para hacer tal cosa,
pero me comento windgate que hay un error,


L3K-RH, si te da error pasame el ejemplo completo mas los modelos
para ver donde esta el error , mientras tanto usa, ,model_remove, al final del proceso
que usa el modelo..

prueba esto:

let_me_alone (); //matar todos los procesos
frame;
M8E_CLEARSCENE (); //eliminar todo lo q hay en pantalla
frame;
Title: Re: Cambiar de fase
Post by: Windgate on July 06, 2010, 05:57:02 PM
Quotelet_me_alone (); //matar todos los procesos
frame;
M8E_CLEARSCENE (); //eliminar todo lo q hay en pantalla
frame;

Se podría probar, aunque creo recordar que ya añadí el FRAME intermedio.

L3K, sube tu ejemplo con el problema, por ejemplo con la tecla F cambiar de fase, para mirarlo.

Mi idea era pasarle a link una versión "mínima" del problema, pero creo que no tendré tiempo esta semana.
Title: Re: Cambiar de fase
Post by: Prg on July 07, 2010, 04:01:25 AM
en el test 13 de los ejemplos de bennu3d viene como hacerlo, el problema es que yo tampoco lo logro hacer funcionar correctamente, y no se por qué? ya que en los ejemplos funciona bien.

también está estra otra forma: colocar un onexit, y matar todos los procesos con signal(..,s_kill)

me refiero a:

[code language="bennu"]
process ...
begin
....
onexit;
m8e_modelremove(modelo);
...
end
[/code]

esto lo harías en cada proceso con modelo asignado, y así cada que lo mates elimina su modelo. el problema son las texturas. sinceramente no se como descargarlas, y menos si el modelo las carga automáticamente como en le caso de los ms3d
Title: Re: Cambiar de fase
Post by: Prg on July 07, 2010, 06:53:44 PM
hay otra forma de cambiar de fase, pero es un truco.
consiste en tener dos dcb, uno sería el que lanza las zonas (como el menú)
y otro el que tiene las zonas y las representa.

ext[0]=zona;
el primero sólo haría exec(...,midcb.dcb,ext)

y el segundo de acuerdo al argv lanzaría una zona, al finalizar la zona retornaría al programa principal y finalizaría descargando todos los recursos, el problema es que tendrías dos programas activos, y pues una pantalla por cada uno, pero funciona. eso sí, si desde el principio puedes usar M8E_CLEARSCENE ();, mucho mejor.

saludos.
Title: Re: Cambiar de fase
Post by: L3K-RH on July 09, 2010, 02:01:38 PM
Vereis, lo que yo tengo actualmente para cambiar de fase (pero sin funcionar) es:

1º --> El prg principal

INCLUDE "prg/....prg";
INCLUDE "prg/....prg";

BEGIN
   config_video ( ); //Las configuraciones iniciales
   
   creditos_ini (); //Los creditos
   cargar_sonidos ();//Carga los sonidos
   
   presentation ( );//Y pone el primer menu para jugar o salir
   
   menu ();//Luego este es el menu en el que eliges el mundo en el que juegas
   
   fases ();//Dependiendo de el mundo que eligas, fases invocará una mundo u otro
   
    LOOP
        IF ( key ( _ESC ) )
      exit ( 0 );
   END
        FRAME;
    END
END

2º --> El prg de las fases

PROCESS fases ()
BEGIN
   IF (mundo_elegido == 1)

      load_terrain ( "terrain/terrain0.png" , "terrain/t1.png" );//Terreno
   
      car ( );//El protagonista

      escenario ()//Casas, gente ...
   
      camaras ();
   
      sky ();//Cielo

      niebla (0 , 0 , 0 , 0 , 16000, 150 , 150 , 150); //...
   
      coche_enemigo ( );//Enemigo

      play_song (canciones
Title: Re: Cambiar de fase
Post by: L3K-RH on July 09, 2010, 02:06:01 PM
Quote from: Windgate on July 06, 2010, 05:57:02 PM
L3K, sube tu ejemplo con el problema, por ejemplo con la tecla F cambiar de fase, para mirarlo.

Mi idea era pasarle a link una versión "mínima" del problema, pero creo que no tendré tiempo esta semana.

Claro, aunque esta muy desordenado, hay q depurar lineas de código q no sirven para nada.
Pero aun asi creo q se podra entender, cuando puedas actualiza mi direcctorio y pondre el link
Title: Re: Cambiar de fase
Post by: l1nk3rn3l on July 09, 2010, 04:31:59 PM
function cambiar_fase ()
BEGIN
   let_me_alone ();//Mata a todo lo que alla
frame;
  M8E_CLEARSCENE ();//Elimina todo lo este en pantalla
frame;
   
  // config_video ( ); //Las configuraciones iniciales
   
   menu ();//Y luego este es el menu de mundos, otra vez
   
   fases ();

   /*
    LOOP
        IF ( key ( _ESC ) )
         exit ( 0 );
      END
        FRAME;
    END*/
END


debes tener en cuenta que no debe haber ningun proceso usando algun modelo,
que ya ha sido descargado...



Title: Re: Cambiar de fase
Post by: Windgate on July 10, 2010, 11:43:13 PM
Quotedebes tener en cuenta que no debe haber ningun proceso usando algun modelo,
que ya ha sido descargado...

Con la filosofía de 3Dit eso no puede pasar, el proceso que muere elimina su modelo en el ONEXIT

Gracias, lo probaré y si funciona te daré un karmazo tremendo ;D
Title: Re: Cambiar de fase
Post by: L3K-RH on July 15, 2010, 10:15:09 AM
Quote from: l1nk3rn3l on July 09, 2010, 04:31:59 PM
function cambiar_fase ()
BEGIN
   let_me_alone ();//Mata a todo lo que alla
frame;
  M8E_CLEARSCENE ();//Elimina todo lo este en pantalla
frame;
   
  // config_video ( ); //Las configuraciones iniciales
   
   menu ();//Y luego este es el menu de mundos, otra vez
   
   fases ();

END
Me temo que ni con los frames en medio funciona (al menos a mi), bueno creo hasta que se solucione me quedaré con el onexit (creo que es lo mas practico)
Title: Re: Cambiar de fase
Post by: l1nk3rn3l on July 15, 2010, 04:21:16 PM
sube el ejemplo a rapidshare.com
megaupload.com
y me lo mandas por privado ...

este error es muy importante ...
Title: Re: Cambiar de fase
Post by: Windgate on July 16, 2010, 04:07:29 PM
Súbelo L3K, ¿En qué juego te ocurre eso?, ¿En el de los zombies o en el de la ciudad del espacio?

En el de los Zombies hay DE TODO, elementos de GUI, modelos animados, inanimados, terrenos, partículas... Ahí también hacía CRASH al intentar limpiar la escena, pero es más comprensible. Si tienes un ejemplo sencillo será mejor, quizás sea un elemento en particular el que causa ese problema.
Title: Re: Cambiar de fase
Post by: L3K-RH on July 16, 2010, 08:23:02 PM
Quote from: Windgate on July 16, 2010, 04:07:29 PM
Súbelo L3K, ¿En qué juego te ocurre eso?, ¿En el de los zombies o en el de la ciudad del espacio?

En el de los Zombies hay DE TODO, elementos de GUI, modelos animados, inanimados, terrenos, partículas... Ahí también hacía CRASH al intentar limpiar la escena, pero es más comprensible. Si tienes un ejemplo sencillo será mejor, quizás sea un elemento en particular el que causa ese problema.

En el mundo del futuro, por eso te decia q cuando pudieras actualizaras mi directorio para poner el link de descarga directa
Title: Re: Cambiar de fase
Post by: Windgate on July 19, 2010, 03:41:16 PM
Dame la versión que tienes con el crash y la subo.