青山相待

            白云相爱

            梦不到紫罗袍共黄金带

            一茅斋

            野花开

            管甚谁家兴废谁成败

            陋巷单瓢亦乐哉

            贫,气不改!

            达,志不改!

射击的乐趣: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

 

posted @ 2013-10-30 16:38  Leo.Z  阅读(728)  评论(0编辑  收藏  举报