⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9915.txt

📁 关于编程技术技巧的文章
💻 TXT
📖 第 1 页 / 共 4 页
字号:
  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 + -