DirectX9.0教程之ID3DXSprite篇[转载]

前言:本教程面向对DriectX 9.0有一定了解的读者,主要讲解DirectX 9.0的各个部分的功能及用法。希望对广大的游戏初学者有一定帮助,也好让本人对中国游戏事业的发展做出一些微不足道的贡献。作者:Fabric(由于本人是广东人,写文章难免参杂粤语写法,请见谅)

  简介:ID3DXSpriteDriectX 9.0里面的一个简单模块,在DriectX 9.0帮助文档里面对其功能的描术为:向用户提供一套简单的在屏幕上实现精灵渲染的接口。何为精灵渲染,说白了就是渲染2D画面,ID3DXSprite帮助用户透过简单的操作就能运用DriectX 9.0制作2D游戏(渲染2D图形),ID3DXSprite的功能还包括:帮助用户在3D游戏里面实现公告牌技术。下面,将对如何使用ID3DXSprite作详细分折。

  得到一个ID3DXSprite对像:玩过DriectX的人都知道,干什么前都得先取得一个实例对像,其实只要简单调用D3DX为我们提供的一个函数就可完成:

HRESULT D3DXCreateSprite( 
LPDIRECT3DDEVICE9 pDevice, 
LPD3DXSPRITE * ppSprite 
) 
这个函数如何调用,不用我解释了吧,碰过DriectX的人都应该知道他里面的意思。 
 
渲染准备:DirectX 9.0规定,运用ID3DXSprite渲染2D图形前,应先调用ID3DXSprite::Begin做准备工作,在渲染工作完成之后,调用ID3DXSprite::End做善后工作。格式如下: 

g_pSprite->Begin(NULL);

//渲染代码部分。。。。

g_pSprite->End();

其中,ID3DXSprite::Begin接收一个参数,该参数将决定精灵以什么方式进行渲染,该参数可以为以下值之一:

·   D3DXSPRITE_ALPHABLEND

·   D3DXSPRITE_BILLBOARD

·   D3DXSPRITE_DONOTMODIFY_RENDERSTATE

·   D3DXSPRITE_DONOTSAVESTATE

·   D3DXSPRITE_OBJECTSPACE

·   D3DXSPRITE_SORT_DEPTH_BACKTOFRONT

·   D3DXSPRITE_SORT_DEPTH_FRONTTOBACK

·   D3DXSPRITE_SORT_TEXTURE

上面的标志可以合并使用,标志意思可以从其名字中略知一二,而具体用法,后面将在运用到的时候加以介绍

 

渲染:运用ID3DXSprite渲染2D图形其实好简单,只需调用ID3DXSprite::Draw接口,该接口原型如下:

HRESULT Draw(

LPDIRECT3DTEXTURE9 pTexture,

CONST RECT * pSrcRect,

CONST D3DXVECTOR3 * pCenter,

CONST D3DXVECTOR3 * pPosition,

D3DCOLOR Color

);

其中 参数一为精灵所用到的纹理。

参数二为要渲染的纹理矩形区域,意思上就像DirectDraw中所说的原位图矩形(指明要将纹理的哪一部分渲染到屏幕上)

参数三要求传入纹理的中心点坐标,如果传入NULL则表明使用默认值,默认值为将纹理的左上角设为中心点。中心点的设定将关系到日后对精灵进行位移,旋转的效果

参数四为精灵在屏幕上的渲染位置,如要在屏幕的(100,100)像素位置渲染精灵,则应传入&D3DXVECTOR3(100.0f, 100.0f, 0.0f),其实参数三加参数四可以简单的理解为DirectDraw中所说的目的地矩形

参数五要求传入一个32位颜色值,在渲染时,纹理上的每一个像素的颜色值将与其进行相乘,得到最后的渲染颜色,如传入0x00000000,相乘后颜色值将为0,所以精灵将以全黑色渲染,这个参数还有一个用处,就是控制精灵的透明值:当用户在调用ID3DXSprite::Begin时传入D3DXSPRITE_ALPHABLEND标志,则表明打开精灵透明渲染功能,此时参数五的高8位用于指明渲染的透明度,例如:要完全不透明的渲染图像,应传入0xffffffff,要完全透明的渲染图像,应传入0x00ffffff

 

精灵位移,缩放,旋转等处理:可以通过调用ID3DXSprite::SetTransform实现,此接口要求传入一个变换矩阵,注意:这里的变换矩阵指的是变换2D平面上的坐标,而非我们平时常用的3D变换矩阵,2D平面变换矩阵应该调用函数D3DXMatrixTransformation2D得到,该函数的使用方法请参照DirectX9.0帮助文件。

 

下面附上部分代码,大概实现效果为:在屏幕的(100,100)坐标处渲染一个2D精灵,该精灵被缩小为原来的十分之一,并附带0.5孤度的旋转,透明度为60%左右

 

//初始化精灵对像

D3DXCreateSprite(g_pDevice, &g_pSprite);

 

g_pDevice->BeginScene();

 

     g_pDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL,

         D3DCOLOR_XRGB(0,0,0),1.0f,0L);

 

g_pSprite->Begin(D3DXSPRITE_ALPHABLEND);

 

     //得到2D坐标转换矩阵

     D3DXMatrixTransformation2D(&mat, NULL, 0.0f, &D3DXVECTOR2(0.1f, 0.1f),

         &D3DXVECTOR2(50.0f, 50.0f), 0.5f, &D3DXVECTOR2(100.0f, 100.0f));

     g_pSprite->SetTransform(&mat);

 

     //渲染精灵

     g_pSprite->Draw(g_ptexSprite, NULL, NULL, NULL, 0x99ffffff);

 

g_pSprite->End();

 

g_pDevice->EndScene();

 

g_pDevice->Present(NULL, NULL, NULL, NULL);

posted @ 2011-11-07 22:02  ☆A希亿  阅读(887)  评论(0编辑  收藏  举报