ID3dXSprite接口

[cpp]   view plain copy
  1. HRESULT Draw( LPDIRECT3DTEXTURE9  pTexture,  
  2.   
  3.    CONST RECT * pSrcRect,     
  4.   
  5. CONST D3DXVECTOR3 * pCenter,  
  6.   
  7.    CONST D3DXVECTOR3 * pPosition,    
  8.   
  9. D3DCOLOR Color);  

在2D游戏中,由于去掉了深度这一个"D",所以无论视点离物体的远近程度如何,其呈现的物体大小是不会改变的。

那么使用D3D制作2D游戏,怎样才能实现这种与深度无关的效果呢?关键就在于投影变换时不要建立透视投影变换矩阵,而要使用函数D3DXMatrixOrthoLH或者D3DXMatrixOrthoOffCenterLH建立正交投影矩阵。关于这两个函数的用法将在后面的章节进行详细地讨论。

 

使用ID3DXSprite接口渲染2D精灵

ID3DXSprite接口提供了一系列函数帮助程序员使用D3D渲染2D精灵。使用ID3DXSprite接口的典型步骤是:

通过D3DXCreateSprite函数得到指向ID3DXSprite接口的指针

调用ID3DXSprite::Begin函数准备渲染状态

调用ID3DXSprite::SetTransform函数设置精灵的世界坐标系变换(包括缩放、旋转和平移)

调用ID3DXSprite::Draw函数将精灵显示在屏幕上

 

创建D3DXSprite对象

要使用ID3DXSpirte,首先需要使用D3DXCreateSprite函数创建D3DXSprite对象。D3DXCreateSprite函数将使用当前的3D设备,创建一个Sprite对象,并返回指向这个Sprite对象的指针。其函数原型如下:

[cpp]  view plain copy
  1. HRESULT D3DXCreateSprite(  
  2.   
  3.   LPDIRECT3DDEVICE9 pDevice,  
  4.   
  5.   LPD3DXSPRITE * ppSprite   
  6.   
  7. );  

下面的代码段展示如何创建一个D3DXSprite对象, 并得到指向这个对象的指针。在这段代码里假设pD3DDevice是已经创建好的D3D设备指针。

[cpp]  view plain copy
  1. ……  
  2.   
  3. LPD3DXSPRITE pSprite;  
  4.   
  5. if (FAILED(D3DXCreateSprite(  
  6.   
  7. pD3DDevice,&pSprite)))  
  8.   
  9. {  
  10.   
  11. return;  
  12.   
  13. }  
  14.   
  15. ……  
  

准备渲染状态

用ID3DXSprite接口,可以通过调用Beign函数来设置渲染状态。Begin函数的原型如下:

HRESULT Begin(

  DWORD Flags

);

在2D游戏中,最常用的参数是D3DXSPRITE_ALPHABLEND,它表示将要打开Alpha混合开关,实现精灵的透明渲染。在3D游戏中常用到D3DXSPRITE_ALPHABLEND |D3DXSPRITE_BILLBOARD这两个值的组合来实现粒子系统。在本章中,关注的是2D游戏制作,所以将只用到D3DXSPRITE_ALPHABLEND

通过调用Begin函数,D3D设备做好了渲染的准备,接下来就可以执行渲染的工作。不过,Begin函数应该和End函数成对出现,渲染的操作应该放在Being函数和End函数之间。End函数原型如下:

HRESULT End();

通过End函数调用,D3D设备会将渲染的内容提交给设备显示出来。值得注意的是,ID3DXSprite接口提供的Begin/End函数并不能取代BeginSecne/EndScene函数,而是应该放在它们之间,如下;

[cpp]  view plain copy
  1. ……  
  2.   
  3. if( SUCCEEDED( pD3DDevice->BeginScene() ) )  
  4.   
  5. {  
  6.   
  7. ……  
  8.   
  9. pSprite->Begin(  
  10.   
  11. D3DXSPRITE_ALPHABLEND);  
  12.   
  13. ……  
  14.   
  15. pSprite->End();  
  16.   
  17. …..  
  18.   
  19. pD3DDevice->EndScene();  
  20.   
  21. }  
  22.   
  23. ……  
  24.   
  25.    

设置精灵的世界坐标系变换

世界变换包括了缩放、旋转、平移等操作。对于这些操作,可以使用D3DXMatrixScaling函数、D3DXMatrixTranslation函数、D3DXMatrixRotationZ计算出相应的变换矩阵,再用D3DXMatrixMultiply函数按一定的变换顺序将它们累积起来。然后使用D3DXSprite对象的SetTransform函数设置精灵的世界变换。如下面的代码段,将精灵在xy方向等比例缩放为原来的0.5倍,然后绕着Z轴旋转1弧度,再平移到(x,y,0)处:

[cpp]  view plain copy
  1. ……  
  2.   
  3. D3DXMATRIX matScale,matRotation,matTrans,matWorld;  
  4.   
  5. D3DXMatrixScaling(&matScale, 0.5f, 0.5f, 1.0f);  
  6.   
  7. D3DXMatrixRotationZ(&matRotation,1.0);  
  8.   
  9. D3DXMatrixTranslation (&matTrans,x,y,0);  
  10.   
  11. D3DXMatrixMultiply(&matWorld,&matScale,  
  12.   
  13. &matRotation);  
  14.   
  15. D3DXMatrixMultiply(&matWorld,&matWorld,  
  16.   
  17. &matTrans);  
  18.   
  19. pSprite->SetTransform(&matWorld);  
  20.   
  21. ……  
  

在屏幕指定位置渲染

使用D3DXSprite对象渲染时,其坐标系是以屏幕左上角为坐标原点,沿原点向左是X坐标增大的方向,沿原点向下是y坐标增大的方向。D3DXSprite的绘图操作必须放在D3DXSprite对象的Begin()/End()函数对之间完成。在调用其Begin函数时可以同时指定精灵渲染时的行为(比如打开Alpha混合开关),而具体的操作则交给Draw函数来完成。其函数原型如下:

下面的代码段在x,y,z位置渲染精灵:

……

//打开渲染开关,同时打开Alpha混合开关

[cpp]  view plain copy
  1. pSprite->Begin(D3DXSPRITE_ALPHABLEND);   
  2.   
  3. HRESULT hr =  pSprite->Draw(pTexture,   
  4.   
  5. NULL,   
  6.   
  7. NULL, &D3DXVECTOR3(x,y,z),  
  8.   
  9. 0xFFFFFFFF   
  10.   
  11.     );  
  12.   
  13. pSprite->End();   
  14.   
  15. ……  

注意:ID3DXSprite接口是微软为了帮助程序员轻松实现2D游戏而准备的,所以,在使用ID3DXSprite接口时,不需要由程序员建立投影坐标系、观察坐标系,也不需要创建顶点缓冲及定义顶点数据结构和灵活顶点格式。





http://blog.csdn.net/tinya0913/article/details/6124024

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值