Reemplazando DirectDraw; sprites "2D" con DirectX 8.
- Capitulo II de la serie "Diario de un sufrido programador de DirectX" -


Autor  

 Lord Trancos

Ámbito  

 Iniciación a DirectX 8

Lenguaje de Programación  

 Delphi 4

Fecha  

 2001/01/16;2001/05/28

Índice

    I - El futuro de DirectDraw / Planteamiento del problema.
    II - Dibujar sprites "2D" con D3DX.
    III - Código fuente de ejemplo.
    IV - Más código fuente de ejemplo.


I - El futuro de Direct Draw / Planteamiento del problema.

Tal y como se vio en el primer capitulo de esta serie, DirectDraw ha sido eliminado (o mas bien, esta siendo eliminado) de las DirectX. Aunque aún puede ser usado el interfaz de versiones anteriores.

Ahora bien, si decidimos usar las nuevas capacidades 3D de DirectX tendremos que usar el último interfaz Direct3D. Y si usamos este interfaz no podremos utilizar al mismo tiempo DirectDraw...
Entonces.... que pasa si por ejemplo queremos en nuestro juego 3D dibujar imagenes 2D con la vida del jugador, la munición de las armas,.... etc ? Pues que nos guste o no deberemos de usar poligonos con texturas!

El primer problema para dibujar sprites "2D" usando poligonos es que tambien tendremos que usar texuras y eso tiene sus consecuencias; ya que las texturas por lo general deben de ser cuadradas y sus dimensiones potencias de 2; es decir las texturas deben de ser imagenes de 8x8, 16x16, 32x32, 64x64, 128x128 o 256x256 pixels (no es recomendable usar tamaños superiores ya que algunas tarjetas 3D no los soportan).

Entonces que pasa si queremos dibujar una imagen de 640x480 ? pues que tendremos que partirla a cuadraditos de las dimensiones ya comentadas... *puajjjj*...

Bueno, en realidad existen algún otro metodo alternativo, como por ejemplo, usar la funcion Direct3DDevice8.CopyRects; pero este metodo no permite ni cliping, ni colorkey, ni nada... (por cierto, si alguien tiene algún ejemplo de como usar esta función le agradeceria que me lo enviará; yo solo he conseguido violaciones de acceso....)



II - Dibujar sprites "2D" con D3DX.

Como pelearse con poligonos para dibujar imagenes 2D puede resultar bastante incomodo, usaremos el interfaz ID3DXSprite de la libreria D3DX. Este interfaz dispone de una función llamada Draw;

function Draw(const pSrcTexture : IDirect3DTexture8; pSrcRect : PRect; pScaling, pRotationCenter : PD3DXVector2; const Rotation : Single; pTranslation : PD3DXVector2; const Color : TD3DColor): HResult; stdcall;
 
pSrcTexture - la textura donde esta la imagen que queremos dibujar.

pSrcRect - rectangulo de la textura donde esta la imagen que queremos dibujar (NIL para dibujar la textura completa).

pScaling - el factor de ampliazión/miniaturización (NIL, para usar el tamaño normal). Asi, si X e Y valen 2.0, la imagen se dibujara el doble de grande. Por el contrario si X e Y valen 0.5 se dibujará la mitad de grande. X e Y no tienen porque valer lo mismo.

pRotationCenter - el centro de rotación de la imagen (NIL para X=0, Y=0).

Rotation - el indice de rotación. (0 = sin rotación)

pTranslation - coordenadas donde se dibujará la imagen.

Color - filtro ARGB. Debe de valer $FFFFFFFF para que la imagen se dibuje normal. Los 8 primeros bits indican la transparencia (Alpha), los 8 siguientes el color rojo (Red), los 8 siguientes verde (Green) y los ocho ultimos el azul (Blue).
Para crear una textura a partir de una imagen (BMP, JPEG, PNG,....) la libreria D3DX también nos sera muy útil con funciones como por ejemplo; D3DXCreateTextureFromFileExA.

Al igual que ocurre con los objetos 3D, para dibujar estos sprites "2D" tendremos que hacerlo entre las funciones Direct3DDevice8.BeginScene y Direct3DDevice8.EndScene;



III - Código fuente de ejemplo.

DX8SPR.ZIP (45Kb)

Este sencillo ejemplo muestra como inicializar DirectX Graphics, como crear un interfaz ID3DXSprite, como cargar texturas usando D3DXCreateTextureFromFileExA y como dibujar sprites "2D" con diferentes efectos; transparencias, translucidez, filtro de color, rotación,...

Para compilar el ejemplo necesitaras las cabeceras de DirectX 8 para Delphi de Delphi-Jedi y el Delphi 4 o superior.

Para ejecutar el ejemplo necesitaras la libreria D3DX8AB.DLL que encontraras junto a las cabeceras de DirectX 8.



IV - Más código fuente de ejemplo.

Tal y como se explica en este articulo, el uso de texturas límita el tamaño de la imagen (depende del dispositivo 3D). Podeis encontrar un ejemplo de como afrontar este problema (dividiendo la imagen en fragmentos) en el programa Avalon Picture Viewer (incluye el código fuente).