射击的乐趣:WIN32诠释打飞机游戏源码补充

打飞机游戏源码补充

从指定位置加载bmp并显示到对话框。

 

 1  void CbitmapDlg::DisplayBMP()
 2 {
 3     CFileDialog dlg( true, NULL, NULL, OFN_READONLY, NULL, NULL,  0, TRUE);
 4     dlg.DoModal();
 5     CString filename;
 6     filename = dlg.GetPathName();
 7 
 8     CBitmap *bmp =   new CBitmap;
 9     bmp->m_hObject = (HBITMAP)LoadImage(NULL, filename, IMAGE_BITMAP,  00, LR_LOADFROMFILE);
10      if(bmp->m_hObject)
11     {
12         BITMAP bmpinfo;
13      // bmp->Attach(BITMAP);
14      bmp->GetBitmap(&bmpinfo);
15 
16     CClientDC pdc( this);
17     CDC dc;
18     dc.CreateCompatibleDC(&pdc);
19     dc.SelectObject(bmp);
20 
21     CRect rect;
22     GetClientRect(&rect);
23 
24 
25     pdc.BitBlt( 00, 100100,&dc,   200200, SRCCOPY);
26 
27     DeleteDC(pdc);
28     ReleaseDC(&dc);
29     }
30      else
31     {
32         AfxMessageBox(_T( " loadimage error "));
33     }
34 }
View Code

 

 

双缓冲贴图演示:

 

 1  void CbitmapDlg::PastPlane()
 2 {
 3     CClientDC pdc( this);
 4     CDC pBufferdc, pBMPdc;
 5     HBITMAP ptbmp;
 6     ptbmp = CreateCompatibleBitmap(pdc, bkinfo.bmWidth, bkinfo.bmHeight);
 7     pBufferdc.CreateCompatibleDC(&pdc);
 8     pBMPdc.CreateCompatibleDC(&pdc);
 9     pBufferdc.SelectObject(ptbmp);
10     pBMPdc.SelectObject(bkbmp->m_hObject);
11 
12     pBufferdc.BitBlt( 00, bkinfo.bmWidth, bkinfo.bmHeight, &pBMPdc,  00, SRCCOPY);
13 pBMPdc.SelectObject(bullebmp->m_hObject);
14      for( int i =  0; i < iCurbullet; i++)
15     {
16         pBufferdc.TransparentBlt(bullet[i].pos_x, bullet[i].pos_y, bullet[i].Deswidth, bullet[i].Desheight, &pBMPdc, bullet[i].Sou_x, bullet[i].Sou_y, bullet[i].Deswidth, bullet[i].Desheight, RGB( 255255255));
17     }
18 pdc.BitBlt( 00, bkinfo.bmWidth, bkinfo.bmHeight, &pBufferdc,  00, SRCCOPY);
19     DeleteDC(pdc);
20     DeleteObject(ptbmp);
21     DeleteDC(pBufferdc);
22     DeleteDC(pBMPdc);
23 }
View Code

 

 

定时器设置、取消、处理的演示代码:

 

 1  void CbitmapDlg::StartTimer(START_METHOD method)
 2 {
 3      switch (method)
 4     {
 5      case INIT:
 6         m_speed =  2;
 7         bullespeed = m_speed;
 8         m_score =  0;
 9         m_level =  1;
10         life =  3;
11         iCurPlane =  0;
12         iCurbullet =  0;
13         AddPlane( 10);
14         AddDefender();
15         SetTimer( 150, NULL);
16         SetTimer( 2500, NULL);
17          break;
18      case NORMAL:
19         SetTimer( 150, NULL);
20         SetTimer( 2500, NULL);
21          break;
22      default:
23          break;
24     }
25 }
View Code

 

 1  long CbitmapDlg::OnTimer(WPARAM wp, LPARAM lp)
 2 {
 3      switch (wp)
 4     {
 5      case  1:
 6         TimerProc();
 7          break;
 8      case  2:
 9         AddBullet(LITTLE_BULLE);
10          break;
11      default:
12          break;
13     }
14      return MAKELONG( 00);
15 }
View Code

 

 

 1  void CbitmapDlg::TimerProc()
 2 {
 3      for( int i =  0; i < iCurPlane; i++)
 4     {
 5         plane[i].pos_y += m_speed;
 6         OnHit();
 7 
 8          // 飞机落地,我方基地over
 9           if(plane[i].pos_y + plane[i].Desheight >= bkinfo.bmHeight)
10         {
11             KillTimer( 1);
12             KillTimer( 2);
13              if(IDNO == AfxMessageBox(_T( " 游戏结束,再来一次? "), MB_YESNO|MB_ICONINFORMATION,  0))
14             {
15                 AfxMessageBox(_T( " Exit Game "));
16                 OnOK();
17             }
18              else
19             {
20                  // 初始化状态并拉起定时器                
21                   // KillTimer(2);
22                  StartTimer(INIT);
23             }
24         }
25     }
26 
27 
28      for( int j =  0; j < iCurbullet; j++)
29     {
30         bullet[j].pos_y -= bullespeed;
31          // 子弹检测以后在碰撞检测里一起做
32           if((bullet[j].pos_y + bullet[j].Desheight) <  0)
33             DeleteBullet(j--);
34     }
35     OnShot();
36     PastPlane();
37 }
View Code

 

 

 1  void CbitmapDlg::AddDefender()
 2 {
 3      if(!life)
 4     {
 5          // 生命归0时候,处理等同飞机落地
 6          KillTimer( 1);
 7         KillTimer( 2);
 8          if(IDNO == AfxMessageBox(_T( " 游戏结束,再来一次? "), MB_YESNO|MB_ICONINFORMATION,  0))
 9         {
10             AfxMessageBox(_T( " Exit Game "));
11             OnOK();
12         }
13          else
14         {
15              // 初始化状态并拉起定时器                
16               // KillTimer(2);
17              StartTimer(INIT);
18         }
19          return;
20     }
21      // life--;
22 
23     superdefender.Desheight = defenderinfo.bmHeight;
24     superdefender.Deswidth = defenderinfo.bmWidth;
25     superdefender.pos_x = (bkinfo.bmWidth - defenderinfo.bmWidth)/ 2;
26     superdefender.pos_y = bkinfo.bmHeight-defenderinfo.bmHeight;
27     superdefender.Sou_x =  0;
28     superdefender.Sou_y =  0;
29     superdefender.status = plstatus[ 0];
30 }
View Code

 

碰撞检测以及处理的过程:

 

 1  void CbitmapDlg::OnHit()
 2 {
 3      // defender hit
 4       for( int i =  0; i < iCurPlane; i++)
 5     {
 6          // 修正定时器偏差和键盘消息之间偏差导致的错误碰撞检测
 7           if (plane[i].status == DESTROYED)
 8              continue;
 9          int defendcox = superdefender.pos_x + superdefender.Deswidth/ 2;
10          int defendcoy = superdefender.pos_y + superdefender.Desheight/ 2;
11          int planecox = plane[i].pos_x + plane[i].Deswidth/ 2;
12          int planecoy = plane[i].pos_y + plane[i].Desheight/ 2;
13 
14          // 按照圆形包围体检测
15           if(((defendcox - planecox)*(defendcox - planecox) + (defendcoy - planecoy)*(defendcoy - planecoy)) > ((superdefender.Desheight + plane[i].Desheight)*(superdefender.Desheight + plane[i].Desheight)/ 4 + (superdefender.Deswidth + plane[i].Deswidth)*(superdefender.Deswidth + plane[i].Deswidth)/ 4))
16              continue;
17          else
18         {
19              // 检测defender的4个点是否碰撞到飞机
20              CRect rect;
21             rect.left = plane[i].pos_x;
22             rect.right = plane[i].pos_x + plane[i].Deswidth;
23             rect.top = plane[i].pos_y;
24             rect.bottom = plane[i].pos_y + plane[i].Desheight;
25 
26             CPoint point1, point2, point3, point4;
27             point1.x = superdefender.pos_x;
28             point1.y = superdefender.pos_y;
29             point2.x = superdefender.pos_x + superdefender.Deswidth;
30             point2.y = superdefender.pos_y;
31             point3.x = superdefender.pos_x;
32             point3.y = superdefender.pos_y + superdefender.Desheight;
33             point4.x = superdefender.pos_x + superdefender.Deswidth;
34             point4.y = superdefender.pos_y + superdefender.Desheight;
35 
36              if(PtInRect(rect, point1) || PtInRect(rect, point2) || PtInRect(rect, point3) || PtInRect(rect, point4))
37                 superdefender.status = DESTROYED;
38 
39         }
40          if(superdefender.status == DESTROYED)
41         {
42             life -=  1;
43             AddDefender();
44              return ;
45         }
46     }
47 }
View Code

 

修改对话框大小以及自定义对话框的方法:

 

1 CRect rect;
2         GetClientRect(rect);
3         ClientToScreen(rect);
4         MoveWindow(rect.left, rect.top, bkinfo.bmWidth, bkinfo.bmHeight, TRUE);
View Code

 

 

1 ModifyStyle( WS_CAPTION, WS_MINIMIZEBOX, SWP_DRAWFRAME ); 
View Code

 

你可能感兴趣的:(Win32)