📄 9915.txt
字号:
FlyWin::FlyWin()
{
x=nPreX=300; //子画面初始位置为(300,150)
y=nPreY=150;
nIncX=nMoveIncX;
nIncY=nMoveIncY;
nCount=1;
//设置计数器
}
BOOL FlyWin::CreateCustomSurfaces()
{
// create your surfaces here...
//创建背景表面,并由指针bksurf指向这个表面
bksurf=CreateSurface(“background.bmp”);
//创建一个总子画面(由4帧子画面组成)的表面
//由指针flysurf指向这个表面.
flysurf=CreateSurface(“bird.bmp”);
//得到总子画面表面的宽(fw),高(fh)
GetSurfaceDimensions(flysurf,fw,fh);
//创建4帧宽为fw/2,高为fh/2的子画面的表面,分别由
//指针flysurf1,flysurf2,flysurf3,flysurf4指向它们。
//现在这4个子表面还是空的。
flysurf1=CreateSurface(fw/2,fh/2);
flysurf2=CreateSurface(fw/2,fh/2);
flysurf3=CreateSurface(fw/2,fh/2);
flysurf4=CreateSurface(fw/2,fh/2);
//清除4帧子画面表面的内容,使表面内所有像素为0,
//即表面是透明的。
ClearSurface(flysurf1,0);
ClearSurface(flysurf2,0);
ClearSurface(flysurf3,0);
ClearSurface(flysurf4,0);
//定义色彩键码,指明黑色(RGB=(0,0,0))为透明色
//即在blt操作期间不拷贝黑色像素。
DDCOLORKEY ddck;
ddck.dwColorSpaceLowValue=0;
ddck.dwColorSpaceHighValue=0;
//将色彩键码赋给背景表面,总子画面表面和4个子画面表面
bksurf→SetColorKey(DDCKEY_SRCBLT,&ddck);
flysurf→SetColorKey(DDCKEY_SRCBLT,&ddck);
flysurf1→SetColorKey(DDCKEY_SRCBLT,&ddck);
flysurf2→SetColorKey(DDCKEY_SRCBLT,&ddck);
flysurf3→SetColorKey(DDCKEY_SRCBLT,&ddck);
flysurf4→SetColorKey(DDCKEY_SRCBLT,&ddck);
//定义总子画面表面上的4个矩形区域,即为4个子画面表面区域
CRect r1(0,0,fw/2-1,fh/2-1);
CRect r2(fw/2,0,fw-1,fh/2-1);
CRect r3(0,fh/2,fw/2-1,fh-1);
CRect r4(fw/2,fh/2,fw-1,fh-1);
//把总子画面表面上的4个矩形区域分别拷贝到4个子画面表面
//即实现分离总子画面表面
SplitSurface(flysurf1,flysurf,r1,0,0);
SplitSurface(flysurf2,flysurf,r2,0,0);
SplitSurface(flysurf3,flysurf,r3,0,0);
SplitSurface(flysurf4,flysurf,r4,0,0);
//创建一个存储表面,由指针storesurf指向它
//用以存储子画面移动时所覆盖的背景区域
storesurf=CreateSurface(fw/2,fh/2);
CopySurface(storesurf,bksurf,x,y);
//初始化当前子画面表面
cursurf=flysurf1;
return TRUE;
}
void FlyWin::DrawScene()
{
//绘制背景表面和第一帧子画面表面
//把背景表面拷贝到后备缓冲区
BltSurface(backsurf,bksurf,0,0,TRUE);
//把当前的子画面表面拷到后备缓冲区
BltSurface(backsurf,cursurf,x,y,TRUE);
//页面翻转,使后备缓冲区的内容可见
primsurf→Flip(0,DDFLIP_WAIT);
//再次把背景表面拷贝到后备缓冲区
BltSurface(backsurf,bksurf,0,0,TRUE);
}
void FlyWin::RestoreSurfaces()
{
// reclain lost surfaces with the DirectDrawSurface Restore() function
// depending on the surface's function, it may be necessary to restore
// surface content as well
if(bksurf→IsLost()) //如果bksurf
丢失
{
bksurf→Restore(); //恢复内存
LoadSurface(bksurf,“background.bmp”); //恢复表面内容
}
if(flysurf→IsLost())//如果flysurf丢失
{
flysurf→Restore(); //恢复内存
LoadSurface(flysurf,“bird.bmp”); //恢复表面内容
}
}
int FlyWin::SelectDriver()
{
int numdrivers=GetNumDrivers();
if (numdrivers==1)
return 0;
CArray drivers;
for (int i=0;i {
LPSTR desc, name;
GetDriverInfo( i, 0, &desc, &name );
drivers.Add(desc);
}
DriverDialog dialog;
dialog.SetContents( &drivers );
if (dialog.DoModal()!=IDOK)
return -1;
return dialog.GetSelection();
}
int FlyWin::SelectInitialDisplayMode()
{
DWORD curdepth=GetDisplayDepth();
int i, nummodes=GetNumDisplayModes();
DWORD w,h,d;
if (curdepth!=desireddepth)
ddraw2→SetDisplayMode( 640, 480, curdepth, 0, 0 );
for (i=0;i {
GetDisplayModeDimensions( i, w, h, d );
if (w==desiredwidth && h==desiredheight && d==desireddepth)
return i;
}
for (i=0;i {
GetDisplayModeDimensions( i, w, h, d );
if (d==desireddepth)
return i;
}
return 0;
}
void FlyWin::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar==VK_ESCAPE) //按ESC退出
PostMessage( WM_CLOSE );
DirectDrawWin::OnKeyDown(nChar, nRepCnt, nFlags);
}
int FlyWin::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (DirectDrawWin::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
SetTimer(1,nMoveSpeed,NULL); //设置定时器
return 0;
}
void FlyWin::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
int nWhich=nCount%4+1;
nCount++;
//判断当前表面为4个子表面中的哪一个
switch(nWhich)
{
case 1:
cursurf=flysurf1;
break;
case 2:
cursurf=flysurf2;
break;
case 3:
cursurf=flysurf3;
break;
case 4:
cursurf=flysurf4;
break;
default:
break;
}
//处理移动的子画面
x+=nIncX;
y+=nIncY;
//如子画面移动到屏幕下方或上方,应碰撞返回
if(y>=(int)(480-fh/2)||y<=0)
{
nIncY=-nIncY;
y+=nIncY;
}
//如子画面移动到屏幕右方或左方,应碰撞返回
if(x>=(int)(640-fw/2)||x<=0)
{
nIncX=-nIncX;
x+=nIncX;
}
//把当前表面拷贝到后备缓冲区
BltSurface(backsurf,cursurf,x,y,TRUE);
//执行页面翻转,使后备缓冲区的内容可见
primsurf→Flip( 0, DDFLIP_WAIT );
//把备份的背景区域拷贝到后备缓冲区,以便恢复曾被
//覆盖的背景
BltSurface(backsurf,storesurf,nPreX,nPreY);
//存储下一帧的子画面移动时所覆盖的背景区域于storesurf
CopySurface(storesurf,bksurf,x,y);
nPrex=x;
nPrey=y;
DirectDrawWin::OnTimer(nIDEvent);
}
void FlyWin::OnDestroy()
{
DirectDrawWin::OnDestroy();
// TODO: Add your message handler code here
KillTimer(1); //取消定时器
}
void FlyWin::CopySurface(LPDIRECTDRAWSURFACE ts,
LPDIRECTDRAWSURFACE ss,
int x,int y)
{
if(!ts || !ss ) return;
DDSURFACEDESC tdesc,sdesc;
//初始化sdesc,tdesc为零
ZeroMemory(&sdesc,sizeof(sdesc));
ZeroMemory(&tdesc,sizeof(tdesc));
sdesc.dwSize=sizeof(sdesc);
tdesc.dwSize=sizeof(tdesc);
//得到源表面ss,目标表面ts的描述信息
HRESULT r=ss→GetSurfaceDesc(&sdesc);
if(r!=DD_OK) return;
r=ts→GetSurfaceDesc(&tdesc);
if(r!=DD_OK) return;
//定义源表面上的矩形区域,大小大等于目标表面的面积
CRect rc(x,y,x+tdesc.dwWidth,y+tdesc.dwHeight);
//超界处理
if(x+tdesc.dwWidth>(int)sdesc.dwWidth) return;
if(y+tdesc.dwHeight>(int)sdesc.dwHeight) return;
//拷贝源表面ss到目标表面ts
r=ts→BltFast(0,0,ss,&rc, DDBLTFAST_SRCCOLORKEY|DDBLTFAST_WAIT);
if(r!=DD_OK) return;
}
void FlyWin::SplitSurface(LPDIRECTDRAWSURFACE ts,
LPDIRECTDRAWSURFACE ss,
CRect& srcc,
int x,
int y)
{
if(!ts||!ss) return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -