Cambiar de fase

Started by L3K-RH, July 03, 2010, 11:55:40 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

L3K-RH

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?  ???
"Todo se pude lograr, solo hace falta el querer y la oportunidad"

Drumpi

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...
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)

L3K-RH

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
"Todo se pude lograr, solo hace falta el querer y la oportunidad"

L3K-RH

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
"Todo se pude lograr, solo hace falta el querer y la oportunidad"

L3K-RH

el M8E_CLEARESCENE no funciona ¿no?
Porque se podria poner al final de cada fase, junto a un let_me_alone
"Todo se pude lograr, solo hace falta el querer y la oportunidad"

Drumpi

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.
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)

DjSonyk

#6
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.

Drumpi

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.
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)

L3K-RH

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.
"Todo se pude lograr, solo hace falta el querer y la oportunidad"

L3K-RH

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
"Todo se pude lograr, solo hace falta el querer y la oportunidad"

L3K-RH

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
"Todo se pude lograr, solo hace falta el querer y la oportunidad"

Windgate

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.
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

l1nk3rn3l

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;

Windgate

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.
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

Prg

#14
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
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)