Buenas gente, os comunico que acabo de liarme la manta a la cabeza y he decidido integrar un 3d en los procesos estilo div..
Esta idea me lleva rompiendo la cabeza desde hace muchos años.. pensando como integrar un sistema 3d en un sistema de procesos 2d y creo que tengo una buena solución.. Lo estoy planteando así:
- Los procesos de inicio son 2D, para que puedan representar un grafico o modelo 3D simplemente se usa esta función desde el proceso: set3D(); y ya esta.. el grafico ahora pertenece al plano 3d y no al 2d.. sus X Y Z serán las usadas para representarlo en el plano 3d del juego.
Para volver al modo de renderizado 2d tan solo hay que hacer: set2D(); y volveremos a tener un proceso normal y corriente.
ahora mismo estoy pensando el mejor nombre para asignar un modelo cargado al proceso y que sea este el que se represente.. como tengo las variable locales predefinidas graph y visible.. creo que bastará con que si visible == true el graph se represente en 3d o en 2d.. osea.. si se ha llamado desde un proceso concreto a set3D(); y hago visible = false; no se pintará su graph.. pero si hago setModel(xxx); entonces se pintará el modelo 3d..
La idea es que co-existan los dos sistemas conjuntamente, tanto el 3d como el 2d..
Así que lo que añado a los procesos es:
metodos:
set3D();
set2D();
setModel();
freeModel();
variables:
bool model_visible;
float anglex;
float angley;
float angle lo antengo ya que será igual que anglez..
Creo que tiene consistencia.. haber las pruebas que tal.. voy a intentar hacer algun mierda churro juego para ver si se hace natural escribir codigo con estos nombres.. que os parece este sistema?
Un ejemplo de codigo es este:
#include "gameLibZero.cpp"
int ST = 0;
Font fnt;
images img;
//------------------------------------------------------------
void setup(){
setMode(1024, 600);
setFps(60);
fnt = LoadFont("data/fonts/00.png.fnt");
loadImages("data/images", &img);
}
//------------------------------------------------------------
class objeto_2d:public process{
public:
int st = 0;
int anima = 0;
vector<int>animation = { 0,0,0,1,1,1,2,2,2,3,3,3,4,4,4 };
void frame(){
switch(st){
case 0:
{
graph = img[0];
visible = true;
x = 512;
y = 200;
size = 200;
st = 10;
}
break;
case 10:
{
anima = (anima+1)%animation.size();
graph = img[animation[anima]];
}
break;
}
}
};
//------------------------------------------------------------
class objeto_3d:public process{
public:
int st = 0;
int anima = 0;
vector<int>animation = { 0,0,0,1,1,1,2,2,2,3,3,3,4,4,4 };
void frame(){
switch(st){
case 0:
{
graph = img[0];
visible = true;
x = 0;
y = 0;
z = 0;
size = 200;
set3d();
st = 10;
}
break;
case 10:
{
anima = (anima+1)%animation.size();
drawGraphic3D(graph, x, y, z, size, alpha);
if(key(KEY_LEFT)){
x -= 0.1;
}
if(key(KEY_RIGHT)){
x += 0.1;
}
if(key(KEY_UP)){
z -= 0.1;
}
if(key(KEY_DOWN)){
z += 0.1;
}
if(key(KEY_Q)){
y += 0.1;
}
if(key(KEY_A)){
y -= 0.1;
}
}
break;
}
}
};
//------------------------------------------------------------
void draw(){
screenDrawText(GetFontDefault(), 22, "gameLibZero 1.5", CENTER, 512, 50, WHITE, 255);
screenDrawText(fnt, 64, "3D world + 2d sprites tech demo", CENTER, 512, 150, WHITE, 255);
switch(ST){
case 0:
{
new objeto_2d();
new objeto_3d();
ST = 10;
}
break;
case 10:
{
}
break;
}
}
//------------------------------------------------------------
Dejo este codigo compilado para trastearlo jeje.. que pasada esto es mas facil de lo que parecia..
La función drawGraphic3d(); es improvisada.. es un screenDrawGraphic() pero para 3d.. en la versión publica de la libreria no sera necesaria.. ya existirá el metodo interno render3D() de los procesos que renderizará automaticamente lo que tenga que renderizarse..
You do not have the required permissions to view the files attached to this post.