zoukankan      html  css  js  c++  java
  • 【转载】ID3DXSPRITE接口简单使用

    原文:ID3DXSPRITE接口简单使用

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

    源地址 http://blog.csdn.net/tinya0913/archive/2011/01/08/6124024.aspx

    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接口时,不需要由程序员建立投影坐标系、观察坐标系,也不需要创建顶点缓冲及定义顶点数据结构和灵活顶点格式。

  • 相关阅读:
    AspDotNetStorefront客户化开始
    "超时时间已到。在操作完成之前超时时间已过或服务器未响应。"另一个原因
    转:只打开一个窗口和关闭窗口而不出现提示
    .net 数据格式设置
    SQLServer导出数据表中数据的存储过程
    游标、临时表、嵌套游标使用一列
    转:将图片转换成16进制的代码写入文本
    根据文件后缀返回Http的ContentType类型的函数
    正确配置p6spy后没有日志输出的一个可能的原因
    C99 声明 + 表达式 + 词法 部分Grammar
  • 原文地址:https://www.cnblogs.com/zhehan54/p/5559636.html
Copyright © 2011-2022 走看看