Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: SkyNetBCN en 25 de Febrero de 2005, 05:27:05 PM

Título: Problema Con Sprite
Publicado por: SkyNetBCN en 25 de Febrero de 2005, 05:27:05 PM
 Hola familia...

Tengo un problema... Creo un Sprite y una textura...:


LPD3DXSPRITE Sprite;
LPDIRECT3DTEXTURE9 TexturaCaraBoton;

   if (!SUCCEEDED(D3DXCreateSprite(m_pd3dDevice,&Sprite)))
      .............

   TCHAR szPath[MAX_PATH];
   GetCurrentDirectory( MAX_PATH, szPath );
   sprintf(szPath,"%s\\Textures\\Inferno.jpg",szPath);


   HRESULT result;
   result = D3DXCreateTextureFromFile(
      m_pd3dDevice,
      szPath,
      &TexturaCaraBoton
   );

y intento dibujarla así...:

   Sprite->Begin(NULL);
   Sprite->Draw(TexturaCaraBoton,NULL,NULL,&pos,0xFFFFFFFF);
   Sprite->End();

pero cuando llega al ->End(); el programa se para y salta un error... he mirado ejemplos por internet pero nadie hace nada más a parte de esto... k hago mal?  (nooo)

GRACIAS

Ando intentando iniciarme en esto de la programación 3D y engancha como la peor droga... jeje
Título: Problema Con Sprite
Publicado por: Sacrifai en 25 de Febrero de 2005, 07:01:21 PM
 Debugea y mira a ver.
Título: Problema Con Sprite
Publicado por: BeRSeRKeR en 25 de Febrero de 2005, 07:03:10 PM
 El código parece correcto. Lo más probable es que no se haya creado la textura. Si estás ejecutando el proyecto con F5, el directorio actual no es el que cabría esperar, es decir, el del ejecutable. Por eso es muy posible que no te esté encontrando la textura en el directorio que estás especificando. Una solución sería especificar tú mismo el directorio actual para que apunte al directorio del ejecutable (GetModuleFileName y de ahí extraes el directorio) al inicio de la aplicación. La otra solución es que en las opciones del proyecto especifiques el directorio de trabajo (Working Directory) de forma que apunte a donde se encuentra tu ejecutable. La mejor opción creo que es la primera ya que por ejemplo, si ejecutas tu programa desde otra ubicación que no sea su propio directorio, tendrás problemas. Por ejemplo, si ejecutas la aplicación desde el "Inicio rápido" de Windows.

Por supuesto también te recomiendo que mientras estés depurando tu aplicación actives el modo debug de Direct3D porque te va a soltar mucha información interesante que te ayudará a capturar errores y también a optimizar tu aplicación. Entre otras cosas, si tu textura no se hubiera creado, al intentar ser utilizada por el sprite, te aparecería en la consola algo así como "puntero a textura no válido".

Saludos.
Título: Problema Con Sprite
Publicado por: SkyNetBCN en 25 de Febrero de 2005, 11:13:15 PM
 la única información que me da es esto... :
Primera excepción en 0x00000000 en CreateDevice.exe: 0xC0000005: Infracción de acceso al leer la ubicación 0x00000000.

Pero estoy seguro que la textura la carga bien.... la ruta es la correcta... el Sprite se crea bien... de hecho, estas dos variables las cargo y luego compruebo que son correctas y si no es así paro el programa... símplemente me falla al hacer el ->End();

Me estoy dejando algo de código??? me lo he mirado 100 veces y no veo nada raro... Espero que me podais ayudar...  (nooo)

Título: Problema Con Sprite
Publicado por: BeRSeRKeR en 25 de Febrero de 2005, 11:43:41 PM
 Si no lo has hecho ya, activa el modo debug de Direct3D y mira a ver si te especifica la causa del error.

El bloque:

Sprite->Begin(NULL);
Sprite->Draw(TexturaCaraBoton,NULL,NULL,&pos,0xFFFFFFFF);
Sprite->End();


supongo que lo tienes entre las llamadas a BeginScene y EndScene, ¿no?.

Saludos.
Título: Problema Con Sprite
Publicado por: SkyNetBCN en 26 de Febrero de 2005, 05:09:15 PM
 pués no me da más información de la que he puesto aquí arriba... alguien sabe si me dejo algo de codigo por escribir????
GRACIAS de antemano!!!   :P  
Título: Problema Con Sprite
Publicado por: BeRSeRKeR en 26 de Febrero de 2005, 07:17:06 PM
 Pues vamos a ver...

1. Declaras el sprite:

ID3DXSprite *g_pSprite;

2. Declaras la textura:

LPDIRECT3DTEXTURE9 g_pTexture;

Al iniciar la aplicación....

3. Creas el sprite:

D3DXCreateSprite(g_pd3dDevice, &g_pSprite);

4. Creas la textura:

D3DXCreateTextureFromFile(g_pd3dDevice, "una_textura_cualquiera.jpg", &g_pTexture);

En el método render...

5. Renderizamos el sprite:

g_pSprite->Begin(0);
g_pSprite->Draw(g_pTexture, NULL, NULL, NULL, 0xffffffff);
g_pSprite->End();


Al finalizar la aplicación...

6. Liberamos los recursos del sprite:

if( g_pSprite != NULL ) g_pSprite->Release();

7. Liberamos los recursos de la textura:

if( g_pTexture != NULL ) g_pTexture->Release();

Creo que no se me pasa nada.

Saludos.
Título: Problema Con Sprite
Publicado por: SkyNetBCN en 27 de Febrero de 2005, 05:12:05 PM
  (nooo)   (nooo)   (nooo)  . Pués algo pasa... lo tengo todo como vosotros decis... pero no hay manera... siempre me falla el método End();...

Nadie tiene un ejemplo de algún programilla que saque un bitmap en pantalla???  :P  simplemente por comparar los códigos...!!!
Título: Problema Con Sprite
Publicado por: BeRSeRKeR en 27 de Febrero de 2005, 11:46:44 PM
 Pues sí tengo un ejemplo pero vamos que es el código que te he puesto en el mensaje anterior. De todas formas te lo puedes bajar de aquí. Es el mismo que el de las líneas pero con el sprite incluído.

Saludos.
Título: Problema Con Sprite
Publicado por: SkyNetBCN en 28 de Febrero de 2005, 09:29:20 PM
 Era un problema de rutas! por casualidad he visto que en modo release si funcionaba, mientras que en debug no... trasteando con la configuración del proyecto he conseguido que cargue los archivos del sitio correcto... Lo que me gustaria que alguien me explicase es pk no daba fallo al cargar la textrura, la cargaba bien, de la ruta correcta, pero al utilizarla fallaba... hasta que puse la confuiguración del proyecto bin... alguien me lo puede explciar???
GRACIAS COMPAÑYEROS!!!
Título: Problema Con Sprite
Publicado por: BeRSeRKeR en 01 de Marzo de 2005, 12:34:23 AM
 Si es que ya te dije que lo más probable era que la textura no se creaba. :D

Lo que me extraña es que si realmente tienes el modo debug de Direct3D activado (en el panel de control), que no te avisara del error.

Saludos.