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? ???
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...
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
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
el M8E_CLEARESCENE no funciona ¿no?
Porque se podria poner al final de cada fase, junto a un let_me_alone
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.
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.
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.
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.
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
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
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.
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;
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.
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
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.
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
- , 1);//Musica
//....
IF (key (_ñ))
cambiar_fase ();
END
ELSEIF (mundo_elegido == 2)
load_terrain ( "terrain/terrain1.png" , "terrain/t2.png" );//Terreno
car ( );//El protagonista
escenario2 ()
camaras ();
sky ();//Cielo
niebla (0 , 10 , 40 , 30 , 1600, 150 , 150 , 150); //...
coche_enemigo ( );//Enemigo
play_song (canciones - , 4);//Musica
//....
IF (key (_ñ))
cambiar_fase ();
END
ELSEIF (mundo_elegido == 3)
//....
IF (key (_ñ))
cambiar_fase ();
END
END
END
3º --> Cambiar de fase
PROCESS cambiar_fase ()
BEGIN
let_me_alone ();//Mata a todo lo que alla
M8E_CLEARSCENE ();//Elimina todo lo este en pantalla
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
¿Que os parece?
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
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...
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
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)
sube el ejemplo a rapidshare.com
megaupload.com
y me lo mandas por privado ...
este error es muy importante ...
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.
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
Dame la versión que tienes con el crash y la subo.