博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转载】ID3DXSPRITE接口简单使用
阅读量:5962 次
发布时间:2019-06-19

本文共 2874 字,大约阅读时间需要 9 分钟。

原文:

 

前些日子一直研究DDraw,毕竟是DirectX7的东西了,所以转手用DirectD3D9,用了Surface进行绘图,可是怎么做透明色也都是不行loadfromfile透明部分就成了不透明黑色,我晕.....哎~网上有几位兄弟也是从DDraw转过来的,好像都有这个问题,实在没办法只能转用ID3dXSprite接口和纹理了,网上看到一篇文章还算讲得清晰,特此借用,勿怪^_^

源地址 

ID3dXSprite接口

  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对象的指针。其函数原型如下:

  1. HRESULT D3DXCreateSprite(   
  2.   
  3.   LPDIRECT3DDEVICE9 pDevice,   
  4.   
  5.   LPD3DXSPRITE * ppSprite    
  6.   
  7. );  

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

 

  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函数,而是应该放在它们之间,如下;

  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函数设置精灵的世界变换。如下面的代码段,将精灵在x、y方向等比例缩放为原来的0.5倍,然后绕着Z轴旋转1弧度,再平移到(x,y,0)处:

 

  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混合开关

  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://yzjax.baihongyu.com/

你可能感兴趣的文章
Source Code Review
查看>>
分享一下我安装启动Jmeter出错时的解决办法
查看>>
java 调用process
查看>>
用a标签实现submit提交按钮的效果
查看>>
第十周
查看>>
毕向东_Java基础视频教程第20天_IO流(1~4)
查看>>
ES5之defineProperty
查看>>
几图理解BeautifulSoup
查看>>
HashMap内部是如何实现的(转)
查看>>
交互设计[3]--点石成金
查看>>
java实现双向循环链表
查看>>
引用WebService出现错误
查看>>
hdu1542 Atlantis 线段树--扫描线求面积并
查看>>
如何使用缓存提高程序性能
查看>>
几种垃圾回收算法
查看>>
【SRX】折腾了半天终于我的那对SRX210 升级到了 12.1R1.9
查看>>
Python开发【项目】:RPC异步执行命令(RabbitMQ双向通信)
查看>>
Oracle基本函数即字段拆分
查看>>
Shell脚本
查看>>
WEB服务器,TOMCAT和servlet之间的关系
查看>>