Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema Con Sprite

Iniciado por SkyNetBCN, 25 de Febrero de 2005, 05:27:05 PM

« anterior - próximo »

SkyNetBCN

 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

Sacrifai


BeRSeRKeR

 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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

SkyNetBCN

 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)


BeRSeRKeR

 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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

SkyNetBCN

 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  

BeRSeRKeR

 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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

SkyNetBCN

  (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...!!!

BeRSeRKeR

 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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

SkyNetBCN

 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!!!

BeRSeRKeR

 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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!






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.