原文: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. CONST RECT * pSrcRect,
  3. CONST D3DXVECTOR3 * pCenter,
  4. CONST D3DXVECTOR3 * pPosition,
  5. 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. LPDIRECT3DDEVICE9 pDevice,
  3. LPD3DXSPRITE * ppSprite
  4. );

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

  1. ……
  2. LPD3DXSPRITE pSprite;
  3. if (FAILED(D3DXCreateSprite(
  4. pD3DDevice,&pSprite)))
  5. {
  6. return;
  7. }
  8. ……

准备渲染状态

用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. if( SUCCEEDED( pD3DDevice->BeginScene() ) )
  3. {
  4. ……
  5. pSprite->Begin(
  6. D3DXSPRITE_ALPHABLEND);
  7. ……
  8. pSprite->End();
  9. …..
  10. pD3DDevice->EndScene();
  11. }
  12. ……

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

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

  1. ……
  2. D3DXMATRIX matScale,matRotation,matTrans,matWorld;
  3. D3DXMatrixScaling(&matScale, 0.5f, 0.5f, 1.0f);
  4. D3DXMatrixRotationZ(&matRotation,1.0);
  5. D3DXMatrixTranslation (&matTrans,x,y,0);
  6. D3DXMatrixMultiply(&matWorld,&matScale,
  7. &matRotation);
  8. D3DXMatrixMultiply(&matWorld,&matWorld,
  9. &matTrans);
  10. pSprite->SetTransform(&matWorld);
  11. ……

在屏幕指定位置渲染

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

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

……

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

  1. pSprite->Begin(D3DXSPRITE_ALPHABLEND);
  2. HRESULT hr =  pSprite->Draw(pTexture,
  3. NULL,
  4. NULL, &D3DXVECTOR3(x,y,z),
  5. 0xFFFFFFFF
  6. );
  7. pSprite->End();
  8. ……

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

【转载】ID3DXSPRITE接口简单使用的更多相关文章

  1. Springboot接口简单实现生成MySQL插入语句

    Springboot接口简单实现调用接口生成MySQL插入语句 在实际测试中,有这样一个需求场景,比如:在性能压力测试中,可能需要我们事先插入数据库中一些相关联的数据. 我们在实际测试中,遇到问题,需 ...

  2. 转载-- http接口、api接口、RPC接口、RMI、webservice、Restful等概念

     http接口.api接口.RPC接口.RMI.webservice.Restful等概念 收藏 Linux一叶 https://my.oschina.net/heavenly/blog/499661 ...

  3. 转载 从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法

    转载自:http://www.cnblogs.com/cj695/p/3863142.html sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级.本文就sort函数在 ...

  4. EGL接口 简单介绍

    from http://lyodev.appspot.com 第二章 EGL 接口 EGL 是 OpenGL ES 和底层 Native 平台视窗系统之间的接口.本章主要讲述 OpenGL ES 的 ...

  5. (转载)Jython 简单入门

    转载链接:http://willzh.iteye.com/blog/307222 1. 用Jython调用Java类库 第一步.创建Java类 写一个简单的Java类,用Point来示例: impor ...

  6. [转载]List接口的使用

    List集合代表一个有序集合,集合中每个元素都有其对应的顺序索引.List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素. 1.List接口和ListIterator接口 List作为Co ...

  7. 转载 mvc:message-converters简单介绍 https://www.cnblogs.com/liaojie970/p/7736098.html

    mvc:message-converters简单介绍 说说@ResponseBody注解,很明显这个注解就是将方法的返回值作为reponse的body部分.我们进一步分析下这个过程涉及到的内容,首先就 ...

  8. 使用Flask+MongoDB实现基于REST的接口简单操作

    目录 前言 1 准备工作 2 具体实现 前言 最近在捣鼓如何使用阿里云服务器搭建一个简单的基于Flask框架的后端接口,刚开始为了图方便,就直接买了一个Windows Server 2008系统服务器 ...

  9. http-get调用接口简单代码

    一.简单便捷的httpget调用接口,并且返回接口数据1.导入相应的jar包: 2.代码如下: HttpGet get=null; try {HttpClient httpClient = new D ...

随机推荐

  1. hdu-3397 Sequence operation 线段树多种标记

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3397 题目大意: 0 a b表示a-b区间置为0 1 a b表示a-b区间置为1 2 a b表示a- ...

  2. Linux磁盘管理.md

    df df 即“可用磁盘”disk free,用于显示文件系统的磁盘使用情况.默认情况下 df 命令将以每块 1K 的单位进行显示所有当前已挂载的文件系统,如果你想以人类易读的格式显示 df 命令的输 ...

  3. UVa 10735 - Euler Circuit(最大流 + 欧拉回路)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. css注入获取网页中的数据

    <style><?php echo htmlspecialchars($_GET['x']);?></style> <br><br>< ...

  5. lazysizes-好用的延迟加载JS插件

    此插件可直接引入lazysizes即可 <script src="lazysizes.min.js"></script> 延迟加载(lazy load)是( ...

  6. 7、Dubbo-配置(2)

    重试次数 通常配合timeout超时设置进行配置 <dubbo:reference "> </dubbo:reference> <dubbo:service i ...

  7. 29、springboot与检索(1)

    一.检索 我们的应用经常需要添加检索功能,开源的 ElasticSearch 是目前全文搜索引擎的首选. 他可以快速的存储.搜索和分析海量数据.Spring Boot通过整合Spring Data E ...

  8. ajax几种请求几种类型

    jquery向服务器发送一个ajax请求后,可以返回多种类型的数据格式,包括:html,xml,json,text等. 首先说一下jquery中ajax标准的格式. $.ajax({ url: &qu ...

  9. 多线程系列之 java多线程的个人理解(二)

    前言:上一篇多线程系列之 java多线程的个人理解(一) 讲到了线程.进程.多线程的基本概念,以及多线程在java中的基本实现方式,本篇主要接着上一篇继续讲述多线程在实际项目中的应用以及遇到的诸多问题 ...

  10. iOS为数字键盘增加完成按钮

    在输入价格的时候,要求弹出的键盘只能有数字和小数点.弹出的键盘没有完成键,想要退出键盘可以点击退出,但是为了更好的用户体验,在键盘上增加UIToolbar. 设置ToolBar: - (UIToolb ...