Cambiar de fase en Bennu 3D

Started by Windgate, November 02, 2009, 01:07:13 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Windgate

Hola amigos, mi proyecto en Bennu 3D que ya ha pasado por varios hilos ahora se enfrenta a un problema, y es que el cambio de fase me provoca un error de ejecución...

En fase.prg tenéis lo que se invoca para cada fase, por ejemplo:

IF ( num == 1 )
fade_music_in ( canciones [ num-1 ] , 0 , 100000 );

mapa ( );

tiempo ( );

sol ( );

personaje ( 100 , 20 , 100 );

escuadron ( -700 , 10 , -150 , _X_ESCUADRON , _Z_ESCUADRON );

fuego ( );
ELSEIF ( num == 2 )
personaje ( 4000 , 500 , 7000 );

terreno ( 1 );

tiempo ( );

sol ( );

escuadron ( -700 , 10 , -150 , _X_ESCUADRON , _Z_ESCUADRON );
END


Y en control.prg un código que se encarga de cambiar de fase cuando se pulsa la tecla N, así:

IF ( key ( _N) )
let_me_alone ( );
M8E_CLEARSCENE ( );
WHILE ( key ( _N ) )
FRAME;
END
IF ( num_fase < 10 )
num_fase++;
fase ( num_fase );
ELSE
num_fase = 1;
fase ( num_fase );
END
END


El caso es que he hecho pruebas de todo tipo, incluso dejando únicamente el personaje principal y la cámara en la primera fase, pero al cambiar se me cuelga siempre, si alguien tiene cualquier sugerencia será bienvenida, aquí les dejo el juego completo:

DESCARGA: http://trinit.es/DescargaDirecta/Bennu3D/Kombat3D%200.1.6b.zip
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

#1
M8E_CLEARSCENE ( ); elimina todo el 3d, a ti te toca eliminar todos los procesos que interactuan con modelos para evitar este error, por ejemplo con let_me_alone  o algo así :) (lo importante es que sólo quede un proceso y que no interactue con nada 3d, unas imágenes después llama de nuevo a los procesos del personaje y la cámara... debe funcionarte, así le hice en el mágico)
saludos

EDIT:
eh modificado el código y no logré evitar el error que te da... no se qué está sucediendo amigo, lo siento. en cuanto pones frame te saca...
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Windgate

Maldita sea, hay DECLARE, PUBLIC y procesos que acceden entre ellos, quizás tenga que ver con el orden de asesinato de let_me_alone() o con el ONEXIT... Gracias de todos modos, sigo investigando, cualquier sugerencia sobre lo que hayas hecho tú en tus juegos sirve, no hace falta que lo taches.

Gracias again, eres mi hombre Prg.
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

este código me funciona, intenta con tus librerías, quizá sean las librerías que tienes las que fallan :)
Quote

include "m8ee.h"
import "mod_Say";

global 
  modelo[2];
  camara,texturamario,collisionId,
  i;
  float distancia;
   _Pos3D  pos,pos2;
   _Line3D Linea;
     
   
begin

  full_screen=false; 
  set_mode (640,480,16);                     
  set_fps (0,0); //max.   

  M8E_INIT(0); //init engine

if (M8E_SCREENEXIST() <> 1)//error?
   WRITE (0,1,10,0, "Error: M8ee Init-failed." )  ;
   while (!key(_esc)) frame; end;
   exit();
end;
casa:
say("recargamos escena");
//load scene with 2 models
//--------------------------------------------
  texturamario=M8E_LOADTEXTURE("media\Luigi.pcx");

   modelo[1]=M8E_LOADANIMODEL(  "media\mario.md2" ); //load model
   M8E_LOADTEXMODEL(modelo[1], texturamario );//load texture
   M8E_MODELSETMATERIAL(modelo[1], EMF_LIGHTING,0);//not light in material
   M8E_ANIMODEL(modelo[1], 265,450);// animation  (model,start,end)
   pos.x= 0; pos.y= 0; pos.z= 0;
   M8E_POSMODEL(modelo[1], &pos); //position  (model, x,y,z)



   modelo[2]=M8E_LOADANIMODEL(  "media\mario.md2" ); //load model
   M8E_LOADTEXMODEL(modelo[2], texturamario );//load texture
   M8E_MODELSETMATERIAL(modelo[2], EMF_LIGHTING,0);//not light in material
   M8E_ANIMODEL(modelo[2], 265,450);// animation  (model,start,end)
   pos.x= 20; pos.y= 0; pos.z= 0;
   M8E_POSMODEL(modelo[1], &pos); //position  (model, x,y,z)
 
   camara=M8E_ADDCAM(0,50,-60,   0,5,0);  //add camera  (posx,y,z,   targetx,y,z)
//--------------------------------------------     
 
  //create a collision From Bounding Box
  collisionId = M8E_ADDCOLBBOX(modelo[1]);
  collisionId = M8E_ADDCOLBBOX(modelo[2]);


  //(model, dim1,dim2,  Height,   a,r,g,b)
  M8E_AIADDFOV(modelo[1],  30,30,  0.5,  0,255,255,255);

  Show_Fps(450,50,  255,255,255,255);

  while ( (!key(_esc))  )


  if (key(_n)) m8e_clearscene();  while (key(_n)) frame; end jmp casa; end

     pos.y+=0.03;
     m8e_modelrotation(modelo[1],&pos);


     M8E_RENDER(0,  55,155,55);    //(alpha, r,g,b)       
     frame;
  end;                     
 
let_me_alone();
   
  //free resources
M8E_FREE(); 

//--------------------


end
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Windgate

Lo que propones es correcto también... Creo que mi problema está con las cámaras de seguimiento automático del personaje, ya que cuando el personaje muere las cámaras siguen un objetivo que no existe.

He buscado en la documentación y no hay funciones para eliminar cámaras, sólo las hay para eliminar modelos y no me sirven... Voy a probar sin usar cámaras de seguimiento automático y te cuento, gracias Prg.
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

laghengar

Perdona, pero si hay funciones para cambiar el objetivo de la cámara no?
!!!Blender Blender Blender yuhuuuuuuu¡¡¡ novato o_O

Prg

#6
hoy yo me topé con ese problema en mi juego, lo solucioné así:

let_me_alone(); frame; frame; m8e_clearscene();

luego puse while (1) frame; M8E_RENDER(0,0,0,255); end para revisar que no hubiera problemas por otras funciones, y descubrí que las gui no se borraron... pero ese es otro cuento... :)
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Windgate

¿Lo solucionaste con FRAME; FRAME;?

Interesante, probaré.

Laghengar: Hay funciones para cambiar objetivo de la cámara, pero no en las de seguimiento automático, que son algunas de las que uso. También tengo una duda, para las listas de colisiones desconozco si se eliminan de ellas los modelos removidos... Y bueno, también tengo otras dudas sobre la utilidad de algunos parámetros de emisores de partículas, pero voy probando a ciegas.
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

#8
.... ya me comenzaron los problemas de remover la escena... creo que removeré poco a poco la escena mediante model remove XD

edit, creo que no es buena idea, ya que los bsp cargan sus propios models... quizá tenga que  llamar otro programa ya que clearscene me está generando muchos problemas...
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

laghengar

Ok, gracias, suerte a los dos, que os cunda ;)
!!!Blender Blender Blender yuhuuuuuuu¡¡¡ novato o_O

Windgate

¿A qué te refieres con llamar a otro programa? Vi que tu visor tenía varios .dcb, pero no entendí si utilizabas todos durante la misma ejecución o iban por separado.

Yo no uso .bsp porque consumen muuucho para las colisiones, uso terrain, pero el problema persiste igualmente. Todos los procesos tienen un ONEXIT que se encarga de hacer el remove, pero el error de ejecución se produce siempre.
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

verás, yo uso bsps  y terrenos, si sólo usara terrenos, almaceno el código de cada map y luego mediante alguna función los elimino, pero como uso bsp ellos llaman algunos modelos (toda la decoración) por eso no tengo acceso a sus códigos y no los puedo eliminar manualmente (eso creo), por lo mismo haré que el bgdc y el bgdi se encarguen de llamarme cada nivel con exec (cada vez que cambie de nivel crearé un nuevo videojuego), es "ranchero" pero es lo único que me ahorrará cambiar toda la estructura de mijuego, y que me permitirá terminarlo a tiempo para fines del mes. entonces tendré un programa que será el menu inicial, a partir de aquí se llamarán los niveles que serán nuevos programas, los cuales me crearán nuevas ventanas por cada nivel (teniendo sólo uno a la vez claro) así cada vez que cierre un nivel, seguro que se libera la memoria :)

provaré a ver si funciona :)... por otro lado, si logré hacer las plataformas, y funcionan tanto en bsp con sus colisiones como en terrenos con las suyas :) saludos
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Windgate

¿Entonces invocas los .dcb compilados con exec ( )? No había tenido en cuenta hacerlo así, pero es buena idea...

Estoy deseando ver lo de las plataformas, sube capturas o algo :P
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