Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Menu

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menu

Mensajes - klarth

#1
Hola, que tal. Quería comentar un problema que tengo con looverLib a la hora de crear mis propias ventanas. El tema es que para hacer esto, también hay que inicializar directx para luego pasar a looverLib los punteros device y direct3d que inicializo. La api tiene funciones para cargar el direct y el device, pero al pasarle al render.init dichos parámetros el programa peta.

La inicialización en sí la hago con esta funcion (los punteros al device, direct y la ventana hwnd (que se muestra correctamente) están declarados como global de momento):

void Inicializa_D3D(void)
{
HRESULT hr;
D3DPRESENT_PARAMETERS d3dpp;
D3DDISPLAYMODE modo_de_video;
// creamos nuestro objeto 3D, siempre enviando como argumento la variable D3D_SDK_VERSION,
// esto para que D3D compruebe que los .h que se estan usando son los correctos.
//Always pass D3D_SDK_VERSION to the function.
obj_D3D = Direct3DCreate9( D3D_SDK_VERSION );
if(!obj_D3D ){
Error_Fatal("Error intentando crear Direct 3D");
}
// Captura nuestro modo de video actual. Esto solamente es necesario si estamos corriendo
// en modo de ventana normal. pero ...
hr=obj_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&modo_de_video);
if(FAILED(hr)){
Error_Fatal("Error capturando el modo de video");
}
// Limpia nuestra estructura de parametros. Aunque vamos a llenar todos sus campos, pero es
// una buena practica inicializar variables.
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.BackBufferWidth = g_ancho;
d3dpp.BackBufferHeight = g_alto;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = true;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;


// Despues de llenar nuestra estructura de parametros, estamos listos para crear nuestro
// dispositivo.
// La mayoria de opciones sobre como crear nuestro dispositivo se configuran con esta
// estructura de parametros.
hr=obj_D3D->CreateDevice(D3DADAPTER_DEFAULT, // El adaptador de pantalla por defecto,
// En un sistema con mas de un monitor debemos
// escoger en cual.
// Usa la aceleracion de hardware antes que la renderizacion por software
D3DDEVTYPE_HAL,
// Nuestro puntero a la ventana principal
hwnd,
// procesa lso vertices por software. Esto es un poco mas lento
// que con hardware, pero funciona en TODAS las tarjetas de video.
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
// Nuestra ya conocida estructura de parametros
&d3dpp,
// Setea el puntero hacia nuestro nuevo dispositivo 3D
&obj_dispositivo_D3D);
if(FAILED(hr)){
Error_Fatal("Error creando el dispositivo");
}
}

Tras esto, que no da ningún tipo de error y que funciona en otra aplicación, le paso los punteros al render.init... y ahí se acaba la aplicación. Mi teoría es que algún parámetro de los que se pasa en createDevice no es correcto para que funcione con la api, pero no se...

Ya se que la pregunta es tremendamente rebuscada, pero la hago por si alguien ha trabajado con looverLib. Muchas gracias.
#2
Hola, que tal. Tengo un problema al intentar pasar al looverLib los punteros device y direct3d que inicializo. Tengo que inicializarlos por mi cuenta porque utilizo una ventana que he creado (hwnd) que le paso al puntero direct3d, por lo que no podía utilizar GetDevice y GetDirect3d de looverLib ya que la aplicación me daba un error y finalizaba al utilizar los punteros devueltos por esas funciones en render.init(). Pensé que lo mismo el error se debía al crear una ventana, no crearla con looverLib y no poder pasarla con ninguna función a través del api.

La inicialización en sí la hago con esta funcion (los punteros al device, direct y la ventana hwnd (que se muestra correctamente) están declarados como global de momento):

void Inicializa_D3D(void)
{
HRESULT hr;
D3DPRESENT_PARAMETERS d3dpp;
D3DDISPLAYMODE modo_de_video;
// creamos nuestro objeto 3D, siempre enviando como argumento la variable D3D_SDK_VERSION,
// esto para que D3D compruebe que los .h que se estan usando son los correctos.
//Always pass D3D_SDK_VERSION to the function.
obj_D3D = Direct3DCreate9( D3D_SDK_VERSION );
if(!obj_D3D ){
Error_Fatal("Error intentando crear Direct 3D");
}
// Captura nuestro modo de video actual. Esto solamente es necesario si estamos corriendo
// en modo de ventana normal. pero ...
hr=obj_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&modo_de_video);
if(FAILED(hr)){
Error_Fatal("Error capturando el modo de video");
}
// Limpia nuestra estructura de parametros. Aunque vamos a llenar todos sus campos, pero es
// una buena practica inicializar variables.
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.BackBufferWidth = g_ancho;
d3dpp.BackBufferHeight = g_alto;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = true;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;


// Despues de llenar nuestra estructura de parametros, estamos listos para crear nuestro
// dispositivo.
// La mayoria de opciones sobre como crear nuestro dispositivo se configuran con esta
// estructura de parametros.
hr=obj_D3D->CreateDevice(D3DADAPTER_DEFAULT, // El adaptador de pantalla por defecto,
// En un sistema con mas de un monitor debemos
// escoger en cual.
// Usa la aceleracion de hardware antes que la renderizacion por software
D3DDEVTYPE_HAL,
// Nuestro puntero a la ventana principal
hwnd,
// procesa lso vertices por software. Esto es un poco mas lento
// que con hardware, pero funciona en TODAS las tarjetas de video.
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
// Nuestra ya conocida estructura de parametros
&d3dpp,
// Setea el puntero hacia nuestro nuevo dispositivo 3D
&obj_dispositivo_D3D);
if(FAILED(hr)){
Error_Fatal("Error creando el dispositivo");
}
}

Tras esto, que no da ningún tipo de error, le paso los punteros al render.init... y ahí se acaba la aplicación. Y atascao me quedé, jeje. Mi teoría es que algún parámetro de los que se pasa en createDevice no es correcto para que funcione con el api, pero no se... quizás si hubiera alguna forma de cambiar el atributo que apunta a la ventana del objeto lpdirect3d9 obtenido con GetDirect3d9 con algún método público...
#3
Gracias por tu respuesta, usará looverLib entonces. me pondré a mirar y si tengo alguna dudilla te consultaré, pero poca cosa tranquilo, no me gusta ser pesado, jeje.

Un saludo.
#4
Hola, que tal. Es la primera vez que escribo en este foro y lo hago porque me gustaría saber si alguien me podía dar algún tipo de referencia, aunque luego me tenga que buscar yo la vida (acostumbrado estoy, je).

La cuestión es que voy a hace un proyecto de fin de carrera que consiste en hacer un simulador de tráfico cogiendo (empalmando) imágenes de carreteras de google earth y añadiendo el tráfico por dichas carreteras. La heurística necesaria para el movimiento de los vehículos así como su programación la tengo clara (voy a utilizar c++), pero nunca he utilizado apis 2d para manejar gráficos y por ello me surgen bastantes dudas.

Empecé mirando sdl, pero parece ser que looverLib es bastante más eficiente con la aceleración 2d de las tarjetas gráficas, que se me hace necesaria (creo) ya que querría mover unos 400 vehículos a la vez siendo capaz además de poder ir moviendo el mapa para poder seguir el tráfico (como el google earth pero sin ampliaciones y moviéndose el tráfico, para que nos entendamos).

Mi pretunta básicamente es si looverLib creeis que puede cubrir las necesidades gráficas que requiero o es mejor alguna otra librería (lo mismo con sdl se puede hacer igual sin perder rendimiento, no se...) y donde puedo encontrar algún manual de apoyo o algo por el estilo (me da igual que esté en inglés). Tengo ejemplos de http://www.pixelartgames.com/ y los entiendo perfectamente, pero sé que acabaré necesitando más información. De sdl encontré toda la que quisiera, pero de looverLib no tanta...

A ver si alguien se anima a darme su opinión y gracias por adelantado.
Un saludete.





Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.