【转载】ID3DXSPRITE接口简单使用
前些日子一直研究DDraw,毕竟是DirectX7的东西了,所以转手用DirectD3D9,用了Surface进行绘图,可是怎么做透明色也都是不行loadfromfile透明部分就成了不透明黑色,我晕.....哎~网上有几位兄弟也是从DDraw转过来的,好像都有这个问题,实在没办法只能转用ID3dXSprite接口和纹理了,网上看到一篇文章还算讲得清晰,特此借用,勿怪^_^
源地址 http://blog.csdn.net/tinya0913/archive/2011/01/08/6124024.aspx
ID3dXSprite接口
- HRESULT Draw( LPDIRECT3DTEXTURE9 pTexture,
- CONST RECT * pSrcRect,
- CONST D3DXVECTOR3 * pCenter,
- CONST D3DXVECTOR3 * pPosition,
- 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对象的指针。其函数原型如下:
- HRESULT D3DXCreateSprite(
- LPDIRECT3DDEVICE9 pDevice,
- LPD3DXSPRITE * ppSprite
- );
下面的代码段展示如何创建一个D3DXSprite对象, 并得到指向这个对象的指针。在这段代码里假设pD3DDevice是已经创建好的D3D设备指针。
- ……
- LPD3DXSPRITE pSprite;
- if (FAILED(D3DXCreateSprite(
- pD3DDevice,&pSprite)))
- {
- return;
- }
- ……
准备渲染状态
用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函数,而是应该放在它们之间,如下;
- ……
- if( SUCCEEDED( pD3DDevice->BeginScene() ) )
- {
- ……
- pSprite->Begin(
- D3DXSPRITE_ALPHABLEND);
- ……
- pSprite->End();
- …..
- pD3DDevice->EndScene();
- }
- ……
设置精灵的世界坐标系变换
世界变换包括了缩放、旋转、平移等操作。对于这些操作,可以使用D3DXMatrixScaling函数、D3DXMatrixTranslation函数、D3DXMatrixRotationZ计算出相应的变换矩阵,再用D3DXMatrixMultiply函数按一定的变换顺序将它们累积起来。然后使用D3DXSprite对象的SetTransform函数设置精灵的世界变换。如下面的代码段,将精灵在x、y方向等比例缩放为原来的0.5倍,然后绕着Z轴旋转1弧度,再平移到(x,y,0)处:
- ……
- D3DXMATRIX matScale,matRotation,matTrans,matWorld;
- D3DXMatrixScaling(&matScale, 0.5f, 0.5f, 1.0f);
- D3DXMatrixRotationZ(&matRotation,1.0);
- D3DXMatrixTranslation (&matTrans,x,y,0);
- D3DXMatrixMultiply(&matWorld,&matScale,
- &matRotation);
- D3DXMatrixMultiply(&matWorld,&matWorld,
- &matTrans);
- pSprite->SetTransform(&matWorld);
- ……
在屏幕指定位置渲染
使用D3DXSprite对象渲染时,其坐标系是以屏幕左上角为坐标原点,沿原点向左是X坐标增大的方向,沿原点向下是y坐标增大的方向。D3DXSprite的绘图操作必须放在D3DXSprite对象的Begin()/End()函数对之间完成。在调用其Begin函数时可以同时指定精灵渲染时的行为(比如打开Alpha混合开关),而具体的操作则交给Draw函数来完成。其函数原型如下:
下面的代码段在x,y,z位置渲染精灵:
……
//打开渲染开关,同时打开Alpha混合开关
- pSprite->Begin(D3DXSPRITE_ALPHABLEND);
- HRESULT hr = pSprite->Draw(pTexture,
- NULL,
- NULL, &D3DXVECTOR3(x,y,z),
- 0xFFFFFFFF
- );
- pSprite->End();
- ……
注意:ID3DXSprite接口是微软为了帮助程序员轻松实现2D游戏而准备的,所以,在使用ID3DXSprite接口时,不需要由程序员建立投影坐标系、观察坐标系,也不需要创建顶点缓冲及定义顶点数据结构和灵活顶点格式。
【转载】ID3DXSPRITE接口简单使用的更多相关文章
- Springboot接口简单实现生成MySQL插入语句
Springboot接口简单实现调用接口生成MySQL插入语句 在实际测试中,有这样一个需求场景,比如:在性能压力测试中,可能需要我们事先插入数据库中一些相关联的数据. 我们在实际测试中,遇到问题,需 ...
- 转载-- http接口、api接口、RPC接口、RMI、webservice、Restful等概念
http接口.api接口.RPC接口.RMI.webservice.Restful等概念 收藏 Linux一叶 https://my.oschina.net/heavenly/blog/499661 ...
- 转载 从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法
转载自:http://www.cnblogs.com/cj695/p/3863142.html sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级.本文就sort函数在 ...
- EGL接口 简单介绍
from http://lyodev.appspot.com 第二章 EGL 接口 EGL 是 OpenGL ES 和底层 Native 平台视窗系统之间的接口.本章主要讲述 OpenGL ES 的 ...
- (转载)Jython 简单入门
转载链接:http://willzh.iteye.com/blog/307222 1. 用Jython调用Java类库 第一步.创建Java类 写一个简单的Java类,用Point来示例: impor ...
- [转载]List接口的使用
List集合代表一个有序集合,集合中每个元素都有其对应的顺序索引.List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素. 1.List接口和ListIterator接口 List作为Co ...
- 转载 mvc:message-converters简单介绍 https://www.cnblogs.com/liaojie970/p/7736098.html
mvc:message-converters简单介绍 说说@ResponseBody注解,很明显这个注解就是将方法的返回值作为reponse的body部分.我们进一步分析下这个过程涉及到的内容,首先就 ...
- 使用Flask+MongoDB实现基于REST的接口简单操作
目录 前言 1 准备工作 2 具体实现 前言 最近在捣鼓如何使用阿里云服务器搭建一个简单的基于Flask框架的后端接口,刚开始为了图方便,就直接买了一个Windows Server 2008系统服务器 ...
- http-get调用接口简单代码
一.简单便捷的httpget调用接口,并且返回接口数据1.导入相应的jar包: 2.代码如下: HttpGet get=null; try {HttpClient httpClient = new D ...
随机推荐
- sychronized关键字(多线程)
sychronized关键字: 1. 作用:利用该关键字来创建内置锁,实现线程同步: 2. 分类:(1)sychronized同步方法:(2)sychronized同步代码块: 3. sychroni ...
- 【[NOI2009]管道取珠】
--\(shallwe\):这道题是\(noipDay2T2\)难度 好一个\(Day2T2\)难度啊,我觉得我可以退役了 平方和好像没有什么办法可以快速统计,于是考虑转化一下 我们可以将题意转化成这 ...
- Odoo启动配置文件
转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9278687.html 1:--xmlrpc-port=<端口> 命令选项充许我们将服务器实例的侦听 ...
- [19/04/24-星期三] GOF23_创建型模式(建造者模式、原型模式)
一.建造者模式 本质:分离了对象子组件的单独构造(由Builder负责)和装配的分离(由Director负责),从而可以构建出复杂的对象,这个模式适用于:某个对象的构建过程十分复杂 好处:由于构建和装 ...
- mvc项目中Controller执行完毕重定向到html的一个页面中
String ip = request.getLocalAddr(); //取得服务器IP int port = request.getLocalPort(); //取得服务器端口 String ur ...
- pprint的惊喜
因为我个人经常喜欢打印dir来看模块的方法,每次都是for循环换行,这个真好用 import pprint pprint.pprint (dir(pprint)) 执行下面的代码,会发现,没有自动换行 ...
- PHP面试系列 之Linux(三)---- Vi/Vim编辑器
vi 是 unix 家族下最功能强大的文字编辑器,而 vim 則是 vi 的加强版, 编辑模式 指令 說明 * i 在游標位置進入編輯模式 I 在游標行的第一個非空白字元進入編輯模式 * a ...
- 后台npm
后台进程运行 nohupwhich nohup.bash_profile中并source加载 如果没有就安装吧yum provides */nohup nohup npm start &原程序 ...
- Xcode 5.1安装插件:规范凝视生成器VVDocumenter
类似java的多行凝视! 安装过程: 1.前往GitHub下载project文件:VVDocumenter-Xcode 2.用Xcode打开project,Command + B Build成功后,能 ...
- pt-archiver数据归档
可以使用percona-toolkit包中的pt-archiver工具来进行历史数据归档 pt-archiver使用的场景: 1.清理线上过期数据. 2.清理过期数据,并把数据归档到本地归档表中,或者 ...