YETI3D PRO en Bennu (MOTOR 3D - RENDER BASADO EN SW)

Started by l1nk3rn3l, November 27, 2010, 06:59:16 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

FreeYourMind

Mas cosas, pero ya queda poco para terminar todo lo que quiero xD

1 - La función YETI_ENTITY_DATA(&pos, sprite[0], TYPE_SPRITE3D); que uso para girar el sprite (poniendo otro sprite) baseandome en tu ejemplo de animación, si la uso ocurren 2 cosas:

a)

La posición del sprite del proceso parece que cambia en pos.x y pos.y, porque todos estos enemigos se me quedan mas juntos en lugar de las coordenadas random originales que tienen al crearse (puedes comprobarlo en el ejemplo de las banderas, usando 2 sprites para las banderas).

b) Fallan las colisiones, o sea si uso YETI_ENTITY_DATA las colisiones con la camara ya no funcionan....


Ahora tengo 2 dudas:

2 - Como puedo hacer que la camara al colisionar de frente con una pared se pare antes de colisionar completamente con ella por ejemplo una diferencia de x=50 ? Es que despues al girar la camara estando pegado a la pared tb quiero que estes un pelin alejado de ella al girar.

3 - Como puedeo hacer que un enemigo colisione con la camara, pero sólo si su sprite esta por ejemplo a x=30 del centro de pantalla ?
O sea, con esto quiero evitar que un enemigo te mate sólo porque una puntita del mismo aparezca por la esquina de la pantalla...

4 - Como puedo hacer que un enemigo te mate al colisionar con la camara pero sólo si esta visible de frente ? Con esto quiero evitar que un emeigo te mate por las espaldas de la camara cuando nisiquiera se llega a ver en pantalla.

l1nk3rn3l

a)  La posición del sprite del proceso parece que cambia en pos.x y pos.y, porque todos estos enemigos se me quedan mas juntos en lugar de las coordenadas random originales que tienen al crearse (puedes comprobarlo en el ejemplo de las banderas, usando 2 sprites para las banderas).

en test10.prg


basta solo adicionar un frame para actualizar la posicion y listo



process crear_sprites()
private
  TYPE_ENTITY_3D pos; 
 
  Destx=1, Desty=1; 
  sp_width=  i2f(2);
  sp_height= i2f(2);
  sp_drawmode; 
 
begin 
     if (not YETI_ADDSPRITE(sprites[0] , &pos))//SPRITEID,ENTITYVAR
       return ;
     end;     
     
     pos.x= i2f(rand(1,63)) ;
     pos.y= i2f(rand(1,63)) ;
     pos.z=  i2f(1);     
     
   FRAME;  //UPDATE POS ...

   
     //YETI_ENTITY_GETVISUAL(&pos, &sp_width, &sp_height, &sp_drawmode);
   

  loop
   
   if (RAND(1,100) == 50) //RANDOM BEHAVIOR   
     Destx=     i2f(rand(1,63));
     Desty=     i2f(rand(1,63));
   end;   
   
 
   
   YETI_ENTITY_DATA(&POS,sprites[animacion], TYPE_SPRITE3D);//change sprite
        YETI_ENTITY_SETVISUAL(&pos, sp_width, sp_height, DRAW_MODE_COLORKEY_BLEND); //ghost effect     
   
    pos.z= i2f(1)  ;
   
   YETI_ENTITY_TURN_TOWARDS(&POS,destx,desty);   
   YETI_ENTITY_MOVE_FORWARD(&POS);   
   YETI_ENTITY_DEFAULT(&POS,0,0,60);
   
   frame;
  end
 
end;





b) Fallan las colisiones, o sea si uso YETI_ENTITY_DATA las colisiones con la camara ya no funcionan....

a nosotros nos funciona OK , pasa un ejemplo donde ocurra el bug por favor
proba con test08 hay colisiones y cambia de 2d a 3d en este ejemplo presionando las teclas 7,8,9





2 - Como puedo hacer que la camara al colisionar de frente con una pared se pare antes de colisionar completamente con ella por ejemplo una diferencia de x=50 ? Es que despues al girar la camara estando pegado a la pared tb quiero que estes un pelin alejado de ella al girar.
hmm toca revisar a ver como se hace sin tocar el motor interno.. te buscaremos una solicion


3 - Como puedeo hacer que un enemigo colisione con la camara, pero sólo si su sprite esta por ejemplo a x=30 del centro de pantalla ?
O sea, con esto quiero evitar que un enemigo te mate sólo porque una puntita del mismo aparezca por la esquina de la pantalla...
4 - Como puedo hacer que un enemigo te mate al colisionar con la camara pero sólo si esta visible de frente ? Con esto quiero evitar que un emeigo te mate por las espaldas de la camara cuando nisiquiera se llega a ver en pantalla.

nueva version con funcion    YETI_ENTITY_IS_VISIBLE  (en version BETA) que dice si una entidad es visible a ala camara
puedes usarla dentro del IF --  END  que detecta la colision  ya que es muy lenta ( me refiero a no usarla dentro de un loop) ...
test02.prg


dinos como te fue..





FreeYourMind

#242
a)  La posición del sprite del proceso parece que cambia en pos.x y pos.y, porque todos estos enemigos se me quedan mas juntos en lugar de las coordenadas random originales que tienen al crearse (puedes comprobarlo en el ejemplo de las banderas, usando 2 sprites para las banderas).

en test10.prg

basta solo adicionar un frame para actualizar la posicion y listo

--> OK, solucionado.

b) Fallan las colisiones, o sea si uso YETI_ENTITY_DATA las colisiones con la camara ya no funcionan....

a nosotros nos funciona OK , pasa un ejemplo donde ocurra el bug por favor
proba con test08 hay colisiones y cambia de 2d a 3d en este ejemplo presionando las teclas 7,8,9

--> OK, solucionado, al solucionar la duda a) las colisiones han vuelto a funcionar.
De hecho si cambio muy rapidamente el sprite de un enemigo dentro de un LOOP, las colisiones con la camara deján de funcionar, me imagino que es por refresco de las variables internas del objeto y este no llega a detectar la colisión a tiempo.



2 - Como puedo hacer que la camara al colisionar de frente con una pared se pare antes de colisionar completamente con ella por ejemplo una diferencia de x=50 ? Es que despues al girar la camara estando pegado a la pared tb quiero que estes un pelin alejado de ella al girar.
hmm toca revisar a ver como se hace sin tocar el motor interno.. te buscaremos una solicion

--> OK, pero esto seria útil, sobretodo tener acceso a una función que obtenga las coordenadas de un ID de un objeto que le pases y tambien las coordenadas actuales de la camara, con esto ya se podria controlar.

3 - Como puedeo hacer que un enemigo colisione con la camara, pero sólo si su sprite esta por ejemplo a x=30 del centro de pantalla ?
O sea, con esto quiero evitar que un enemigo te mate sólo porque una puntita del mismo aparezca por la esquina de la pantalla...


--> lo mismo que en la anterior observación.


4 - Como puedo hacer que un enemigo te mate al colisionar con la camara pero sólo si esta visible de frente ? Con esto quiero evitar que un emeigo te mate por las espaldas de la camara cuando nisiquiera se llega a ver en pantalla.

nueva version con funcion    YETI_ENTITY_IS_VISIBLE  (en version BETA) que dice si una entidad es visible a ala camara
puedes usarla dentro del IF --  END  que detecta la colision  ya que es muy lenta ( me refiero a no usarla dentro de un loop) ...
test02.prg

--> Sólo con esto no sirve, me imagino que le pasas el ID del enemigo, pero yo no se que ID es, porque creo bastantes enemigos, pienso que por ejemplo al usar IF (mycam.CollisionWithEntity), la variable CollisionWithEntity en lugar de devolver TRUE deberia devolver el ID del enemigo/entidad con la que has colisionado. De esta forma con este ID, ya podrias saber que enemigo era para pasarselo a la función YETI_ENTITY_IS_VISIBLE.

dinos como te fue..

Muchas gracias por todo el soporte, sólo quedan estes puntos para terminar el juego y de passo portar la DLL a WIZ/CAANOO y Pandora.

Sóbre lo de la resolución dinamica, no he seguido con los cambios, si quieres te paso el src que estaba adaptando a ver si das con el error, de momento y si solucionamos lo que falta, haria ya los ports de la última versión con resolución fija como hasta ahora.

l1nk3rn3l

#243
BUSCA EN TEST08 esta linea

YETI_ENTITY_MSG(pos.DetectedCollisionWithEntity,  TYPE_MSJ_IMPACT);


puedes enviarle un mensaje a la entidad colisionada como esto

YETI_ENTITY_MSG(pos.DetectedCollisionWithEntity,  pos);

y le enviaria el identificador con quien colisiono...

verifica coomo la camara gestiona los paquetes recibidos..(q es la q en ejemplo recibe los mensajes puede ser cualquiera)

if (mycam.msg == TYPE_MSJ_IMPACT)//mensajes entre entidades para probar contactos
      say("mensaje de impacto recibido por la camara");// (quitar salud, recibir bonus,etc) - msg between entities as health -bonus
      mycam.msg =0;
    end;


en nuestro caso seria esto ya que envia un ID cualquiera que no sabemos
if (mycam.msg)

en el ejemplo test08 esta todo para empezar ..!!!!

FreeYourMind

Vale ya funciona, pero ahora necesito otro ajuste.

Como el enemigo empuja la camara al colisionar con la camara, si este colisiona por detrás, o sea si no es visible, la camara tambien se mueve al verificarse la colisión, con lo cual sigues muriendo sin que se vea el enemigo porque la camara se mueve en el acto.

Hay alguna flag para que las entidades al colisionar con la camara no muevan la camara ?

Gracias.

FreeYourMind

hay novedades linkernel ?

Necesito que los enemigos no muevan la camara al colisionar y obtener las coordenadas x,y,z del enemigo al colisionar con la camara, para que sólo nos mate si el enemigo esta al centro de la pantalla y no en los bordes.


solo tengo esto pendiente para terminar el juego, y es una pena que no lo saque por esto, ya que no me acaba de convencer como lo tengo ahora...

l1nk3rn3l

#246
Quote from: FreeYourMind on October 23, 2012, 08:37:46 PM
hay novedades linkernel ?

Necesito que los enemigos no muevan la camara al colisionar y obtener las coordenadas x,y,z del enemigo al colisionar con la camara, para que sólo nos mate si el enemigo esta al centro de la pantalla y no en los bordes.


solo tengo esto pendiente para terminar el juego, y es una pena que no lo saque por esto, ya que no me acaba de convencer como lo tengo ahora...


ESTAMOS OCUPADOS DE TRABAJO .... en la bennuplaynet y el port de NATIVE CLIENT recuerda que usamos el tiempo libre
para dedicarlo a proyectos opensource.. asi que nos queda dificil avanzar al paso que deseariamos...


Necesito que los enemigos no muevan la camara al colisionar
    mycam.nocollision = true;   //no activa fisica de colisiones


obtener las coordenadas x,y,z del enemigo al colisionar
como explicamos antes , puedes mandarle el identificador a la entidad colisionada
YETI_ENTITY_MSG(pos.DetectedCollisionWithEntity,  pos);


y ya tienes desde el otro lado pos.x pos.y  etc etc

FreeYourMind

gracias, ya veo por donde van los tiros, aunque lo que yo queria es que la camara mycam que es publica tuviera acceso a las propriedades del enemigo que colisiona las cuales son privadas y no al reves, pero creo que con esto tambien puedo apañarmelas. gracias, creo que ya no voy a necesitar nada más, suerte con vuestros proyectos

l1nk3rn3l

#248
para nosotros es un honor que se usen las librerias/herramientas  y que los proyectos en ellas culminen en buen puerto
cuando tengas algun juego seria excelente verlo..    ;D



yo queria es que la camara mycam que es publica tuviera acceso a las propriedades del enemigo que colisiona las cuales son privadas y no al reves

de pronto no estas familizarizado con los punteros  ..(pointer) con estos puedes acceder a datos privados
mira aqui un ejemplo que despejara tus dudas...




/*
   example:
   - entity collision - with data msg
   

*/


include "yeti3d.h"

#define TYPEENEMY 1
#define TYPECAMERA 2


#define ENEMY_Z 100

   
global   
filemodel;
TYPE_ENTITY_3D  mycam;
bala,bala2;

end;



private
  res,i;
   TYPE_CELL_3D celda; 
  TYPE_ENTITY_3D pointer posenemy;
 
begin               
// full_screen=TRUE;

  SET_FPS(25,0); //MAX ENGINE FPS

  set_mode (YETI_SCREEN_WIDTH,YETI_SCREEN_HEIGHT,16);         
 
  graph= new_map(YETI_SCREEN_WIDTH,YETI_SCREEN_HEIGHT,16);
  SET_CENTER(file,graph,0,0);//center bitmap
  x=0; y=0; z=45;
 
  //(texture,palette)     
   WRITE(0,10,20,0,"FENIX FPS: ");
   WRITE_INT(0,100,20,0,&FPS);
   
   filemodel= yeti_loadfile("media/modelo.bin"); //3d model 
   bala= YETI_LOADSPRITE("media/sprite.o3d"); 
   bala2= YETI_LOADSPRITE("media/sprite2.o3d");     
   
   YETI_SETRENDERGRAPH(file,graph); //fpgfile,graph
   
   YETI_LOADTEXTURE("media/textures.raw", "media/textures.pal");
   yeti_init( &mycam, "media/e1m4.y3d" );//ENTITYCAMERA,FILEMAP       
       
   
      crear_modelo();
   
    YETI_ENTITY_COLLISION(mycam, true, TYPECAMERA, TYPEENEMY );
     
    mycam.radius = 128;
    mycam.nocollision=TRUE;  // move entities in collision
   
   
    mycam.z=i2f(1);
   
   
  while ( !key(_esc)  )     
 
   if (mycam.msg )//mensajes entre entidades para probar contactos
      posenemy= mycam.msg ;
      say("mensaje de impacto POS enemy X : " +F2I(posenemy.x)+"   Y : "+ F2I(posenemy.y)  );
       
      mycam.msg =0;
    end;   
     
     if (key(_j))
        mycam.p -= i2f(2); 
     end;
     if (key(_k))
        mycam.p += i2f(2); 
     end;
     if (key(_right))       
        mycam.tt += i2f(3);     
     end;     
     if (key(_left))       
        mycam.tt -= i2f(3);   
     end; 
     if (key(_UP))     
       mycam.xx += YETI_fixsin(mycam.t) >> 4;     
       mycam.yy += YETI_fixcos(mycam.t) >> 4;       
     end;     
     if (key(_down))
       mycam.xx -= YETI_fixsin(mycam.t) >> 4;
       mycam.yy -= YETI_fixcos(mycam.t) >> 4;
     end;
     
     
     frame;                       
  end;               

  let_me_alone() ;
 
  //free resources
  yeti_FREE();
end





process crear_modelo()
private
  TYPE_ENTITY_3D pos;
i , tick; 
   
begin

     if (not yeti_addmodel(filemodel , &pos))//FILEID,ENTITYVAR
       return ;
     end;
       
     YETI_MODELANIM(&pos, 40,4,   80, LOOP_FOREVER);//entity,FRAMEINIT,#FRAMES,SPEED,LOOP
         
     pos.x= i2f(rand(2,63)) ;
     pos.y= i2f(rand(2,63))  ;
     pos.z= i2f(1)  ;
     pos.radius=550;
     pos.nocollision=false;;

  YETI_ENTITY_COLLISION(pos, true, TYPEENEMY, TYPECAMERA  );
     
  loop 

   if (pos.DetectedCollisionWithEntity)

      if (pos.DetectedCollisionWithEntityId == TYPECAMERA ) 
         say("enemy tiene colision con camara");         
         //envia un mensaje a camara en este caso - send msg to cammera in this sample
         YETI_ENTITY_MSG(pos.DetectedCollisionWithEntity,  pos);  //SEND TEST MSG TO ENTITY COLLIDED
      end;
     
     pos.DetectedCollisionWithEntity =false;
   end;
     
    YETI_ENTITY_TURN_TOWARDS(&POS,mycam.x,mycam.y);
    YETI_ENTITY_MOVE_FORWARD(&POS);   
    YETI_ENTITY_DEFAULT(&POS,0,0,60); 

   frame;
  end
 
end;




l1nk3rn3l

#250
NUEVA VERSION CON NOVEDADES INTERESANTES

Cambios
----------------
V2.3
- nueva funcion  yeti_distance  para obtener la distancia entre 2 entidades (ver yeti3d.h)
- Nueva funcion YETI_DRAW, YETI_RENDER para renderizar manual como splitscreen
- sprites animados automaticamente  nueva funcion YETI_SPRITEANIM


v2.2
- nueva funcion YETI_ENTITY_IS_VISIBLE



v2.1
- ahora se puede crear modelos y sprites como  nulos(invisibles)
- ejemplo colision pared

v2.0
- fixed sprite collision with camera


v1.9.9
- new collision fixes
- update collision example
- new function YETI_GETCELLFROMID


v1.9.8.
- new global vars YETI_SCREEN_WIDTH,YETI_SCREEN_HEIGHT
- update examples
- now is only change resolution in "y3d_viewport.h" and ready


v1.9.7
- fixed colors in "yeti_loadtexturefpg" function, thanks to PRG
- fixed sprite3d colors in "yeti_loadspritefpg"


v1.9.6
- new bullet global  vars
- new functions YETI_ENTITY_DATA, YETI_ENTITY_MSG,
- fix collision errors
- docs updated
   


v1.9.5
- new function YETI_BULLETSHOOT
- sprites color fixed

v1.9.4
- new functions YETI_LOADMAP, YETI_SAVEMAP
- new features in entity


v1.9.3
- new parameters in yeti_loadtexturefpg
- new function YETI_ADDSPRITE - with bugs
- new function YETI_FIXANGLE, YETI_FIXARCTAN,YETI_FIXSQRT,
   YETI_ENTITY_SETVISUAL, YETI_ENTITY_GETVISUAL,
   YETI_SETVISUAL,



v1.9.2
- set sky with bugs
- fixed any bugs in new funtions
- wall control 100%



v1.9.1
- dll now size in 100k
- sky now is empty


v1.9
- new functions
- new render fx
- new cells function to control walls



v1.8
- new model function - low mem and fast load
- new funtion to load files in mem
- camera set to entity
- fix internal errors with s16 type


v1.7
- fix model pos


V1.6
- less code size
- set viewport 


v1.5
- bennu vars sync..
- load textures and palette in mem
- model internal update
- free mem


v1.4
- test with model movement...


v1.3
- load models and maps from disk
- removed internal code

v1.2
- improved +10fps now


v1.1
- fix camera collision walls bug
- order internal code


v1.0
-initial release




PROXIMA VERSION (fechA ?  ?  ?  ?  ? )
cosas que faltan

- Seleccionar objetos con el mouse - estilo juego aventura (convertir coordenada 2d - 3d y viceversa)
- sprites 2.5D estilo doom / mario kart con giros de 45 grados
- version opengl
- version multi thread




SI ALGUIEN QUIERE COMPILARLO A ANDROID /  IOS BENNUGD  SERIA GENIAL.
.. ES 100% PORTABLE(SDL)

FreeYourMind

gracias, espero que la yeti_distance me resuleva el problema, ya que con x,y,z no estoy consiguiendo determinar la distancia de los enemigos al centro de la camara....


SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

He cometido la tonteria de publicar los modulos antes de probarlos...

Todos funcionan bien, pero en Wiz (y sólo Wiz) me salen mal los colores!

Linkernel tienes algun ifdef que pueda afectar los colores en esta plataforma ? Es raro, porque en anteriores ports los colores eran similares en todos los ports.