使用DirectX让进行Alpha混合的子图形移动(精灵动画)
最近我在二维动画的问题上总是不得其解。因为没有进行Alpha混合的二维动画,在外表上一定会很难看。所以我没有办法,只好四处求解。但是好像大家都没有给出我满意的答案。还好,我在一个源码库(http://www.hackchina.com/)中搜索到了一个示例程序,这个示例程序做得真的好,很逼真。所以我一定要把它拿来进行剖析。在了解到了我必须抛弃以前的surface结构后,我毅然决然地使用了例子中的sprite结构体。这样好了,我左试右试,最后终于成功了。为此我自己又做了一个tga图,和自己用Easy Paint Tool SAI修改的一个tga图。这样的话,我的演示程序就非常得好看了。
下面就是我的MainFrame.cpp文件:
- /*---------------------------------------------------------------------------
- 蒋轶民制作 E-mail:jiangcaiyang123@163.com
- 文件名:MainFrame.cpp
- 作用:子图像和Alpha融合的主框架
- ----------------------------------------------------------------------------*/
- /*--------------------------------------------------------------------------*/
- // 头文件
- #include<windows.h>
- #include<d3d9.h>
- #include<d3dx9.h>
- #include<stdio.h>
- // 库文件
- #pragma comment( lib, "d3d9.lib")
- #pragma comment( lib, "d3dx9.lib")
- // 定义的宏
- #define JCLASSNAME "优化的程序"
- #define JCAPTION "程序演示"
- #define WINDOW_WIDTH 320
- #define WINDOW_HEIGHT 320
- #define FULLSCREEN FALSE// 全屏非全屏的标识符
- #define SAFE_RELEASE( p ) if ( p ) p->Release(); p = NULL;
- // 调整编译器设置
- #pragma warning( disable: 4100 )
- #if FULLSCREEN // 全屏非全屏的设置
- #define WINDOW_STYLE WS_EX_TOPMOST | WS_POPUP | WS_VISIBLE
- #else
- #define WINDOW_STYLE WS_CAPTION | WS_SYSMENU
- #endif
- /*----------------------------------------------------------------------------*/
- // 全局变量
- LPDIRECT3D9 g_JD3D = NULL;// D3D结构体
- LPDIRECT3DDEVICE9 g_JDevice = NULL;// D3D装置结构体
- LPD3DXFONT g_FPSFont = NULL;// 指向FPS字体的指针
- RECT g_FPSFontPos = { WINDOW_WIDTH - 100, WINDOW_HEIGHT - 15,
- WINDOW_WIDTH, WINDOW_HEIGHT};// FPS所在的矩形框
- INT g_FrameCount = 0;// 帧的计数器
- INT g_lastTime = 0;// 记录上一秒的时间
- INT g_currentTime = 0;// 记录当前的时间
- CHAR g_FPSstr[25] = { 0 };// 记录当前帧率的字符串
- IDirect3DSurface9* g_surface = NULL;// 平面的指针
- /*----------------------------------------------------------------------------*/
- // 子图像和Alpha融合的头文件
- #include "AlphaBlend.h"
- /*----------------------------------------------------------------------------*/
- // 函数的声明
- BOOL InitializeD3D(