📄 01_9_13_21.asp.html
字号:
<td class=a14> 安装完DirectX SDK,需要通知Visual C++ DirectX SDK的路径。具体做法是:在VC的编译环境中,依次把Tools-Options-Directories中的Show
Directories for一栏中的include files和library files中分别填入SDK的inc和lib目录,如图1所示。</td>
</tr></table><table width=100% ><tr>
<td class=a14> 再准备两幅bmp格式的位图,要求24位(16M色),其中background.bmp作背景,如图2;另一幅bird.bmp作为子画面,如图3。bird.bmp是由4幅小画面组成的,从左到右,从上到下,分别为动画的1至4帧。这样做的目的是避免过多位图文件带来的不必要的麻烦。还要注意一点的是子画面的背景要为黑色(RGB=(0,0,0)),因为在下面的程序中,色彩键码把黑色设为透明色。</td>
</tr></table><table width=100% ><tr>
<td class=a14> 好,一切准备就绪,让我们开始吧!</td>
</tr></table><table width=100% ><tr>
<td class=a14> 进入VC5的编程环境,File-New-Project,选择DirectDraw AppWizard,输入项目名Fly,按下Ok,以后每一步都按其缺省值即可,这样AppWizard就会自动创建一个项目Fly,属性如下:</td>
</tr></table><table width=100% ><tr><td class=a14>
APPLICATION STYLE</td></tr></table><table width=100% ><tr><td class=a14>
Full-Screen</td></tr></table><table width=100% ><tr><td class=a14>
SETTINGS</td></tr></table><table width=100% ><tr><td class=a14>
640x480</td></tr></table><table width=100% ><tr><td class=a14>
16-bit</td></tr></table><table width=100% ><tr><td class=a14>
CLASS NAMES</td></tr></table><table width=100% ><tr><td class=a14>
FlyApp</td></tr></table><table width=100% ><tr><td class=a14>
FlyWin</td></tr></table><table width=100% ><tr><td class=a14>
CONTENT</td></tr></table><table width=100% ><tr><td class=a14>
Bitmap</td></tr></table><table width=100% ><tr>
<td class=a14> 这时,按“Ctrl+F5”编译运行,你就会看到一个“三角形”在屏幕上撞来撞去。</td>
</tr></table><table width=100% ><tr>
<td class=a14> 在FlyWin.h中添加代码,如下所示:</td>
</tr></table><table width=100% ><tr><td class=a14>
#ifndef FLYWIN_H</td></tr></table><table width=100% ><tr><td class=a14>
#define FLYWIN_H</td></tr></table><table width=100% ><tr><td class=a14>
#include “DirectDrawWin.h”</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
class FlyWin : public DirectDrawWin</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
public:</td></tr></table><table width=100% ><tr><td class=a14>
FlyWin();</td></tr></table><table width=100% ><tr><td class=a14>
protected:</td></tr></table><table width=100% ><tr><td class=a14>
//{{AFX_MSG(FlyWin)</td></tr></table><table width=100% ><tr><td class=a14>
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);</td></tr></table><table width=100% ><tr><td class=a14>
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);</td></tr></table><table width=100% ><tr><td class=a14>
afx_msg void OnTimer(UINT nIDEvent);</td></tr></table><table width=100% ><tr><td class=a14>
afx_msg void OnDestroy();</td></tr></table><table width=100% ><tr><td class=a14>
//}}AFX_MSG</td></tr></table><table width=100% ><tr><td class=a14>
DECLARE_MESSAGE_MAP()</td></tr></table><table width=100% ><tr><td class=a14>
private:</td></tr></table><table width=100% ><tr><td class=a14>
int SelectDriver();</td></tr></table><table width=100% ><tr><td class=a14>
int SelectInitialDisplayMode();</td></tr></table><table width=100% ><tr><td class=a14>
BOOL CreateCustomSurfaces();</td></tr></table><table width=100% ><tr><td class=a14>
void DrawScene();</td></tr></table><table width=100% ><tr><td class=a14>
void RestoreSurfaces();</td></tr></table><table width=100% ><tr><td class=a14>
private: </td></tr></table><table width=100% ><tr><td class=a14>
void CopySurface(LPDIRECTDRAWSURFACE ts,</td></tr></table><table width=100% ><tr><td class=a14>
LPDIRECTDRAWSURFACE ss,</td></tr></table><table width=100% ><tr><td class=a14>
int x,int y);</td></tr></table><table width=100% ><tr><td class=a14>
void SplitSurface(LPDIRECTDRAWSURFACE ts,</td></tr></table><table width=100% ><tr><td class=a14>
LPDIRECTDRAWSURFACE ss,</td></tr></table><table width=100% ><tr><td class=a14>
CRect& srcc,</td></tr></table><table width=100% ><tr><td class=a14>
int x,int y);</td></tr></table><table width=100% ><tr><td class=a14>
private:</td></tr></table><table width=100% ><tr><td class=a14>
LPDIRECTDRAWSURFACE bksurf, //定义指向背景画面表面的指针</td></tr></table><table width=100% ><tr><td class=a14>
flysurf, //指向总子画面表面的指针</td></tr></table><table width=100% ><tr><td class=a14>
storesurf,//指向存储背景区域表面的指针</td></tr></table><table width=100% ><tr><td class=a14>
flysurf1, //指向第一帧子画面表面的指针</td></tr></table><table width=100% ><tr><td class=a14>
flysurf2, //指向第二帧子画面表面的指针</td></tr></table><table width=100% ><tr><td class=a14>
flysurf3, //指向第三帧子画面表面的指针</td></tr></table><table width=100% ><tr><td class=a14>
flysurf4, //指向第四帧子画面表面的指针</td></tr></table><table width=100% ><tr><td class=a14>
cursurf; //指向当前移动的子画面表面的指针</td></tr></table><table width=100% ><tr><td class=a14>
//背景画面指background.bmp;总子画面指bird.bmp</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
int x,y,nPreX,nPreY;//定义子画面移动的坐标</td></tr></table><table width=100% ><tr><td class=a14>
int nIncX,nIncY;// 定义子画面移动的像素数</td></tr></table><table width=100% ><tr><td class=a14>
int nCount; //定义计数器</td></tr></table><table width=100% ><tr><td class=a14>
DWORD fw,fh; //定义总子画面的宽和高</td></tr></table><table width=100% ><tr><td class=a14>
};</td></tr></table><table width=100% ><tr><td class=a14>
#endif</td></tr></table><table width=100% ><tr>
<td class=a14> 其中,CopySurface()函数起保存被子画面覆盖掉的背景区域的作用。参数ts是指向目标表面的指针,ss是指向源表面的指针,x、y是源表面上需要拷贝的矩形区域左上角的坐标。</td>
</tr></table><table width=100% ><tr>
<td class=a14> SplitSurface()函数用于分离一个大的总子画面表面为4帧小子画面表面。参数ts是指向目标表面的指针,ss是指向源表面的指针,srcc是源表面上需要选取的矩形区域,x、y要拷贝到目标表面上的左上角坐标。</td>
</tr></table><table width=100% ><tr>
<td class=a14> 其实当我们看了下面FlyWin.cpp中这两个函数的原型后,细心的朋友也许会发现,两个函数完全可以写成一个函数。而本文特意写成两个函数,为的是程序的清楚易读,不易引起混淆。</td>
</tr></table><table width=100% ><tr><td class=a14>
下一步在FlyWin.cpp中添加代码,如下所示:</td></tr></table><table width=100% ><tr><td class=a14>
#include “Headers.h”</td></tr></table><table width=100% ><tr><td class=a14>
#include “resource.h”</td></tr></table><table width=100% ><tr><td class=a14>
#include “DriverDialog.h”</td></tr></table><table width=100% ><tr><td class=a14>
#include “FlyWin.h”</td></tr></table><table width=100% ><tr><td class=a14>
#pragma comment (lib,“ddraw.lib”)</td></tr></table><table width=100% ><tr><td class=a14>
#pragma comment (lib,“dxguid.lib”)</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
const DWORD desiredwidth=640;</td></tr></table><table width=100% ><tr><td class=a14>
const DWORD desiredheight=480;</td></tr></table><table width=100% ><tr><td class=a14>
const DWORD desireddepth=16;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
const int nMoveSpeed=100; //设置动画速度为100毫秒/帧</td></tr></table><table width=100% ><tr><td class=a14>
const int nMoveIncX=8; //设置子画面沿X轴移动8个像素</td></tr></table><table width=100% ><tr><td class=a14>
const int nMoveIncY=8; //设置子画面沿y轴移动8个像素</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
BEGIN_MESSAGE_MAP(FlyWin, DirectDrawWin)</td></tr></table><table width=100% ><tr><td class=a14>
//{{AFX_MSG_MAP(FlyWin)</td></tr></table><table width=100% ><tr><td class=a14>
ON_WM_KEYDOWN()</td></tr></table><table width=100% ><tr><td class=a14>
ON_WM_CREATE()</td></tr></table><table width=100% ><tr><td class=a14>
ON_WM_TIMER()</td></tr></table><table width=100% ><tr><td class=a14>
ON_WM_DESTROY()</td></tr></table><table width=100% ><tr><td class=a14>
//}}AFX_MSG_MAP</td></tr></table><table width=100% ><tr><td class=a14>
END_MESSAGE_MAP()</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
FlyWin::FlyWin()</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
x=nPreX=300; //子画面初始位置为(300,150)</td></tr></table><table width=100% ><tr><td class=a14>
y=nPreY=150;</td></tr></table><table width=100% ><tr><td class=a14>
nIncX=nMoveIncX;</td></tr></table><table width=100% ><tr><td class=a14>
nIncY=nMoveIncY;</td></tr></table><table width=100% ><tr><td class=a14>
nCount=1;</td></tr></table><table width=100% ><tr><td class=a14>
//设置计数器 </td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr></table><table width=100% ><tr><td class=a14>
BOOL FlyWin::CreateCustomSurfaces()</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
// create your surfaces here...</td></tr></table><table width=100% ><tr><td class=a14>
//创建背景表面,并由指针bksurf指向这个表面</td></tr></table><table width=100% ><tr><td class=a14>
bksurf=CreateSurface(“background.bmp”);</td></tr></table><table width=100% ><tr><td class=a14>
//创建一个总子画面(由4帧子画面组成)的表面</td></tr></table><table width=100% ><tr><td class=a14>
//由指针flysurf指向这个表面.</td></tr></table><table width=100% ><tr><td class=a14>
flysurf=CreateSurface(“bird.bmp”);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
//得到总子画面表面的宽(fw),高(fh)</td></tr></table><table width=100% ><tr><td class=a14>
GetSurfaceDimensions(flysurf,fw,fh);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
//创建4帧宽为fw/2,高为fh/2的子画面的表面,分别由</td></tr></table><table width=100% ><tr><td class=a14>
//指针flysurf1,flysurf2,flysurf3,flysurf4指向它们。</td></tr></table><table width=100% ><tr><td class=a14>
//现在这4个子表面还是空的。</td></tr></table><table width=100% ><tr><td class=a14>
flysurf1=CreateSurface(fw/2,fh/2);</td></tr></table><table width=100% ><tr><td class=a14>
flysurf2=CreateSurface(fw/2,fh/2);</td></tr></table><table width=100% ><tr><td class=a14>
flysurf3=CreateSurface(fw/2,fh/2);</td></tr></table><table width=100% ><tr><td class=a14>
flysurf4=CreateSurface(fw/2,fh/2);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
//清除4帧子画面表面的内容,使表面内所有像素为0,</td></tr></table><table width=100% ><tr><td class=a14>
//即表面是透明的。</td></tr></table><table width=100% ><tr><td class=a14>
ClearSurface(flysurf1,0);</td></tr></table><table width=100% ><tr><td class=a14>
ClearSurface(flysurf2,0);</td></tr></table><table width=100% ><tr><td class=a14>
ClearSurface(flysurf3,0);</td></tr></table><table width=100% ><tr><td class=a14>
ClearSurface(flysurf4,0);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
//定义色彩键码,指明黑色(RGB=(0,0,0))为透明色</td></tr></table><table width=100% ><tr><td class=a14>
//即在blt操作期间不拷贝黑色像素。</td></tr></table><table width=100% ><tr><td class=a14>
DDCOLORKEY ddck;</td></tr></table><table width=100% ><tr><td class=a14>
ddck.dwColorSpaceLowValue=0;</td></tr></table><table width=100% ><tr><td class=a14>
ddck.dwColorSpaceHighValue=0;</td></tr></table><table width=100% ><tr><td class=a14>
//将色彩键码赋给背景表面,总子画面表面和4个子画面表面</td></tr></table><table width=100% ><tr><td class=a14>
bksurf→SetColorKey(DDCKEY_SRCBLT,&ddck);</td></tr></table><table width=100% ><tr><td class=a14>
flysurf→SetColorKey(DDCKEY_SRCBLT,&ddck);</td></tr></table><table width=100% ><tr><td class=a14>
flysurf1→SetColorKey(DDCKEY_SRCBLT,&ddck);</td></tr></table><table width=100% ><tr><td class=a14>
flysurf2→SetColorKey(DDCKEY_SRCBLT,&ddck);</td></tr></table><table width=100% ><tr><td class=a14>
flysurf3→SetColorKey(DDCKEY_SRCBLT,&ddck);</td></tr></table><table width=100% ><tr><td class=a14>
flysurf4→SetColorKey(DDCKEY_SRCBLT,&ddck);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
//定义总子画面表面上的4个矩形区域,即为4个子画面表面区域</td></tr></table><table width=100% ><tr><td class=a14>
CRect r1(0,0,fw/2-1,fh/2-1);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
CRect r2(fw/2,0,fw-1,fh/2-1);</td></tr></table><table width=100% ><tr><td class=a14>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -