DirectX学习笔记--D3DXSPRITE实现淡入淡出效果

近来在尝试制作2D游戏,但游戏中很多特效让人很头疼,比如说淡入淡出效果..所幸被我研究出来了...

在D3DXSPRITE中有一个Draw函数,

1 HRESULT Draw(
2 [in] LPDIRECT3DTEXTURE9 pTexture,
3 [in] const RECT *pSrcRect,
4 [in] const D3DXVECTOR3 *pCenter,
5 [in] const D3DXVECTOR3 *pPosition,
6 [in] D3DCOLOR Color
7 );

这是它的函数原型,我们可以通过改变D3DCOLOR让图片具有透明度.

首先我们来实现一个渲染图片的函数:

 1 void Silver_Interface::Sprite_Render(LPDIRECT3DTEXTURE9 texture , int x , int y , int frameNum , int frameWidth , int frameHeight , int columns , DWORD alpha){
2
3 if(0 < columns && frameNum >= 1){
4 D3DXVECTOR3 position((float)x , (float)y , 0);
5 RECT rect;
6 rect.left = ((frameNum-1) % columns) * frameWidth;
7 rect.top = ((frameNum-1) / columns)* frameHeight;
8 rect.right = rect.left + frameWidth;
9 rect.bottom = rect.top + frameHeight;
10
11 m_pSprite->Draw(texture ,&rect , NULL , &position , alpha);
12 }
13 }

Silver_Interface是一个继承了Silver抽象类的一个子类,通过Draw函数,我们把指定的texture绘制到屏幕上.

 

 1 class SILVER_FADEIN_OR_OUT{
2 public:
3 SILVER_FADEIN_OR_OUT(void){IsBegin = true;IsPlaying = true;}
4 int R;
5 int G;
6 int B;
7 int A;
8 int StartTime;
9 int AnimateDelay;
10 bool IsPlaying;
11 bool IsBegin;
12 };


接着来写一个Animation类,

 1 #ifndef __ANIMATION__H__
2 #define __ANIMATION__H__
3 class Animation
4 {
5 private:
6 Silver* m_pSilver;
7 bool FadeFlag;
8 void setFadeIn(SILVER_FADEIN_OR_OUT &fade , int AnimateDelay = 60);
9 void setFadeOut(SILVER_FADEIN_OR_OUT &fade , int AnimateDelay = 60);
10 public:
11 Animation(void);
12 ~Animation(void);
13 bool FadeIn(LPDIRECT3DTEXTURE9 texture , int x , int y , int width , int height , int frame ,int columns , SILVER_FADEIN_OR_OUT &fade , int AnimateDelay = 60);
14 bool FadeOut(LPDIRECT3DTEXTURE9 texture , int x , int y , int width , int height , int frame ,int columns , SILVER_FADEIN_OR_OUT &fade , int AnimateDelay = 60);
15 bool FadeInAndOut(LPDIRECT3DTEXTURE9 texture , int x , int y , int width , int height , int frame ,int columns , SILVER_FADEIN_OR_OUT &fade , int AnimateDelay = 60);
16
17 };
18 #endif

 

 1 Animation::Animation(void) :FadeFlag(false)
2 {
3 m_pSilver = CreateGame();
4 }
5
6
7 Animation::~Animation(void)
8 {
9 }
10
11 bool Animation::FadeIn(LPDIRECT3DTEXTURE9 texture , int x , int y , int width , int height , int frame ,int columns , SILVER_FADEIN_OR_OUT &fade , int AnimateDelay){
12 if(fade.IsBegin){
13 setFadeIn(fade , AnimateDelay);
14 fade.IsBegin = false;
15 }
16
17 m_pSilver ->Sprite_Render(texture , x , y , frame , width , height , columns , D3DCOLOR_RGBA(fade.R , fade.G , fade.B , fade.A));
18
19 if((int)GetTickCount() >fade.StartTime +fade.AnimateDelay){
20 fade.StartTime = GetTickCount();
21 fade.A+= 5;
22 if(fade.A>=255){fade.IsPlaying = false;fade.IsBegin = true;return true;}
23 }
24 return false;
25 }
26 bool Animation::FadeOut(LPDIRECT3DTEXTURE9 texture , int x , int y , int width , int height , int frame ,int columns , SILVER_FADEIN_OR_OUT &fade , int AnimateDelay){
27 if(fade.IsBegin){
28 setFadeOut(fade , AnimateDelay);
29 fade.IsBegin = false;
30 }
31 m_pSilver ->Sprite_Render(texture , x , y , frame , width , height , columns , D3DCOLOR_RGBA(fade.R , fade.G , fade.B , fade.A));
32 std::cout << fade.A <<std::endl;
33 if((int)GetTickCount() >fade.StartTime +fade.AnimateDelay){
34 fade.StartTime = GetTickCount();
35 fade.A-= 5;
36 if(fade.A<=0) {fade.IsPlaying = false;fade.IsBegin = true;return true;}
37 }
38 return false;
39 }
40
41 bool Animation::FadeInAndOut(LPDIRECT3DTEXTURE9 texture , int x , int y , int width , int height , int frame ,int columns , SILVER_FADEIN_OR_OUT &fade , int AnimateDelay){
42 if(fade.IsBegin){
43 setFadeIn(fade , AnimateDelay);
44 fade.IsBegin = false;
45 }
46 m_pSilver ->Sprite_Render(texture , x , y , frame , width , height , columns , D3DCOLOR_RGBA(fade.R , fade.G , fade.B , fade.A));
47 std::cout << fade.A <<std::endl;
48 if((int)GetTickCount() >fade.StartTime +fade.AnimateDelay){
49 fade.StartTime = GetTickCount();
50 if(!FadeFlag){
51 fade.A+= 5;
52 if(fade.A>=255) {
53 FadeFlag = true;
54 return false;
55 }
56 }
57 else{
58 fade.A-=5;
59 if(fade.A<=0) {
60 fade.IsPlaying = false;
61 return true;
62 }
63 }
64 }
65 return false;
66 }
67
68 void Animation::setFadeIn(SILVER_FADEIN_OR_OUT &fade , int AnimateDelay){
69 fade.AnimateDelay = AnimateDelay;
70 fade.R = 255;
71 fade.G = 255;
72 fade.B = 255;
73 fade.A = 0;
74 fade.IsPlaying=true;
75 fade.IsBegin = true;
76 }
77 void Animation::setFadeOut(SILVER_FADEIN_OR_OUT &fade , int AnimateDelay){
78 fade.AnimateDelay = AnimateDelay;
79 fade.R = 255;
80 fade.G = 255;
81 fade.B = 255;
82 fade.A = 255;
83 fade.IsPlaying=true;
84 fade.IsBegin = true;
85 }

我们可以这种去使用淡入淡出效果:

1 1 Animation* m_pAnimation;
2 2 m_pAnimation = new Animation();
3 3 SILVER_FADEIN_OR_OUT fade;
4 4 void AddScore4(int x , int y , int &score){
5 5 if(fade.IsPlaying){
6 6 m_pAnimation->FadeIn(m_pTexture , x , y , 67 , 27 , 1 , m_iColumn , fade);
7 7 }
8 }



转载于:https://www.cnblogs.com/simon4761/archive/2012/03/19/2406123.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值