A Sprite is the term used to describe a 2D graphics with a number of related functions. In the past hardware acceleration existed on consoles and old computers as sprites were the foundation for all 2D games. E.g. a sprite could be the player character, enemies, power ups etc.
A sprite is simply a 2D texture that can be positioned and rotated on the screen.
D3DX provides a set of sprite functions that we can use to easily render 2D sprites to our screen. The sprite interfaces are just a mechanism for drawing a sprite, we still need to load a texture to represent what the sprite looks like and use that in our draw call - see below.
Note: to use the D3DX functions you must include the header d3dx9.h and link with d3dx9d.lib (in debug build) or d3dx9.lib (in release mode).
As usual we start by declaring a pointer and then we call a function that will create an instance of our sprite and set our pointer to point to that instance.
HRESULT D3DXCreateSprite(LPDIRECT3DDEVICE9 pDevice, LPD3DXSPRITE *ppSprite);
// created OK
As always remember to check the return result to make sure no error has occurred.
To render our sprite we must draw it in our render loop between the scene begin and end calls. To display the sprite we call the following three sprite interfaces:
Firstly we have to tell the sprite that we are about to start drawing. We can also set some flags at this stage. The interface is:
HRESULT Begin(DWORD flags)
flags - we can specify flags that determine how subsequent sprites will be rendered. A common flag here is to say that our sprites are going to be rendered with alpha blending available D3DXSPRITE_ALPHABLEND. There are other flags available, please check the DirectX help for a full list.
We can now go ahead and draw our sprite. The call is:
HRESULT Draw(LPDIRECT3DTEXTURE9 pSrcTexture, CONST RECT *pSrcRect, D3DXVECTOR3 *center, CONST D3DVECTOR3 *pTranslation, D3DCOLOR Color );
So a simple example might be:
This will draw an alpha blended sprite at screen position 10,20. Remember to release the sprite before your application closes.
Note: if you are drawing many sprites it is best to still use just one sprite interface and do all your drawing between the begin and end calls. This allows Direct3D to speed up the rendering of multiple sprites
To scale or rotate our sprites we need to use a matrix. The sprite provides a call SetTransform that allows us to specify the matrix to use. There are a number of D3DX functions we can use to build a matrix, in the example below I use D3DXMatrixTransformation2D which takes a scale, rotation and position and fills a matrix to do the required 2D transformation. In this example I scale the sprite by 2 in each dimension and make it continuously rotate:
// Texture being used is 64 by 64:
// Screen position of the sprite
// Rotate based on the time passed
// Build our matrix to rotate, scale and position our sprite
// out, scaling centre, scaling rotation, scaling, rotation centre, rotation, translation
// Tell the sprite about the matrix
// Draw the sprite
// Thats it
To animate our sprites we load a texture which has our object defined in different states. We can then use the source RECT parameter when drawing our sprite to change which frame of animation will be displayed. For more details see the 2D game techniques section on animating sprites: 2D Animation