找回密码
 注册
搜索
查看: 6427|回复: 0

通过ID3DXSprite来实现DirectX 9.0C绘制2D动画

[复制链接]
发表于 2008-2-17 20:43:00 | 显示全部楼层 |阅读模式
建立D3D和其他相关的设备应该没有问题吧.& l. Z' D0 n; o; N9 e
  然后再定义一个ID3DXSprite*变量:8 \! j2 B0 V$ b9 n) c4 ?
    ID3DXSprite* pSprite = NULL;
' @) _6 B0 V  M! [- V  然后在创建D3D设备(假如是pd3dDevice)之后, 用D3DXCreateSprite创建Sprite:2 s1 ?9 y2 R. E; ]* z1 m7 M
    D3DXCreateSprite( pd3dDevice, &pSprite );
( k$ I  u5 o  k: c: {  记得在设备丢失/释放时使用: SAFE_RELEASE( pSprite );6 ^' q1 C- ]0 _! o) e
  在渲染场景的时候, 使用:
* y# r  u3 C. C. X% f3 m    pSprite->Begin(x);
+ x% k% y8 Q4 ?( ^: J6 S8 }3 o    ... // 具体绘制代码3 I2 Z' x0 R$ f: @' s& P3 h3 p
    pSprite->End();
8 Y! u+ g: i" O1 @& i7 w  其中的x可以是下面各值的组合, 如 D3DXSPRITE_ALPHABLEND | D3DXSPRITE_OBJECTSPACE9 N- a5 O* p0 W. r. Z; l
    D3DXSPRITE_DONOTSAVESTATE 调用Begin()或End()不保存/恢复设备状态. (如pd3dDevice->SetRenderState中设置的部分状态)
% H2 ?3 R* v/ q8 ]( |    D3DXSPRITE_DONOTMODIFY_RENDERSTATE 不是很清楚, 呵呵, 表面上看好像是不改变渲染状态...
1 \& R  f) [! c* c; [9 a' e/ E    D3DXSPRITE_OBJECTSPACE 不改变世界矩阵(WORLD)/投影矩阵(TRANSFORM)以及视点矩阵(VIEW), 使用设置在D3DDevice上的矩阵, 如果不指定这个标志, 3个矩阵自动改变为屏幕空间座标; k5 l' p+ W  x% C/ |+ n; ~
    D3DXSPRITE_BILLBOARD BillBoard, 很清楚吧, 所有的Sprite都全部自动旋转来对着观看着
  J5 n3 C  ~, ^3 p    D3DXSPRITE_ALPHABLEND 让Sprite支持AlphaBlend, 很重要, 几乎每次调用Begin都要指定此标志, 另外, D3DRS_ALPHATESTENABLE 状态必须设置为 TRUE, D3DBLEND_SRCALPHA / D3DBLEND_INVSRCALPHA 分别为源混和状态和目标很合状态5 c, J  ]! b, W/ D; N" H' l# ?
    D3DXSPRITE_SORT_TEXTURE Sprite会按照渲染先后排序, 当渲染在同一个深度的Sprite推荐使用.  p; E$ ]/ m- L: ~. v
    D3DXSPRITE_SORT_DEPTH_FRONTTOBACK 按照从前到后的渲染顺序对Sprite排序, 当在不同深度渲染有透明信息的Sprite时推荐使用.
* y" I* d; z9 s6 ?    D3DXSPRITE_SORT_DEPTH_BACKTOFRONT 按照从后到前的渲染顺序对Sprite排序, 当在不同深度渲染透明Sprite时推荐使用
# r& }. r4 V8 i% u1 |" E  一般就是D3DXSPRITE_ALPHABLEND, 或者根据需要再加上D3DXSPRITE_OBJECTSPACE, 其他的我都不怎么用.....$ A: f# p" b, y$ M9 e+ j
  中间的绘制代码使用 pSprite->Draw, 函数原型为:
6 L* S, ], _6 P  D& Q9 |  HRESULT Draw(9 O# A/ k, n( e
    LPDIRECT3DTEXTURE9 pTexture,0 B& r6 ^8 S: A% B5 Z
    CONST RECT *pSrcRect,
0 O, i+ h% v8 C) |; {  k* J6 H    CONST D3DXVECTOR3 *pCenter,
8 z4 T2 ~# u. z    CONST D3DXVECTOR3 *pPosition,
. ^4 q# M; s5 @3 H5 e7 P8 U    D3DCOLOR Color );
3 u. {, U3 \6 `' c  pTexture 是需要绘制的贴图
1 c, ]+ t  G9 F: Q! w  pSrcRect 是需要绘制的贴图上的一个矩形区域, 绘制整过贴图可以指定为NULL.
3 {* K+ O+ g9 }0 m' M6 [6 Z( g  pCenter 是绘制的中心座标(旋转时会以此点为中心), 指定NULL表示中心座标为(0,0,0)8 b. D- p: T- q1 e2 x
  pPosition 是绘制的位置座标, 也可以指定NULL表示(0,0,0)' P6 U1 L+ G2 T
  Color 是绘制的颜色, 一般情况下指定为 0xffffffff. 最高位到底位的各8字节为Alpha, 红, 绿, 蓝, 如果指定0x80ffffff就是半透明贴图. 如果0xffff0000就只保留贴图里的红色分量, 具体功能自己体会. 当然贴图本身可以包含Alpha信息.
% n- Z6 S( P) Y/ W" }  需要旋转等功能可以使用 pSprite->SetTransform(), 函数原型为:) `9 j' v% k4 ^2 b, Y
  HRESULT SetTransform( CONST D3DXMATRIX *pTransform );
* c) o+ h0 \6 T0 J  相信这个不用解释都很清楚了吧.
/ ]6 u* h4 c; L7 B1 G  最后再提醒一点: pSprite->Begin和pSprite->End 必须成对的出现在 IDirect3DDevice9::BeginScene 和 IDirect3DDevice9::EndScene 之间.; P1 l3 b# c, B5 U* [" a1 F
7 `3 M! F, @. t( P1 H
原文出处:http://www.dingge.com/forum/dv_rss.asp?s=xml&boardid=46&id=5581&page=1
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2025-6-19 10:04 , Processed in 0.014070 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表