打飞机游戏源码补充
从指定位置加载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, 0, 0, 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(0, 0,100, 100,&dc, 200, 200, SRCCOPY);
26
27 DeleteDC(pdc);
28 ReleaseDC(&dc);
29 }
30 else
31 {
32 AfxMessageBox(_T("loadimage error"));
33 }
34 }
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, 0, 0, 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(0, 0,100, 100,&dc, 200, 200, SRCCOPY);
26
27 DeleteDC(pdc);
28 ReleaseDC(&dc);
29 }
30 else
31 {
32 AfxMessageBox(_T("loadimage error"));
33 }
34 }
双缓冲贴图演示:
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(0, 0, bkinfo.bmWidth, bkinfo.bmHeight, &pBMPdc, 0, 0, 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(255, 255, 255));
17 }
18 pdc.BitBlt(0, 0, bkinfo.bmWidth, bkinfo.bmHeight, &pBufferdc, 0, 0, SRCCOPY);
19 DeleteDC(pdc);
20 DeleteObject(ptbmp);
21 DeleteDC(pBufferdc);
22 DeleteDC(pBMPdc);
23 }
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(0, 0, bkinfo.bmWidth, bkinfo.bmHeight, &pBMPdc, 0, 0, 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(255, 255, 255));
17 }
18 pdc.BitBlt(0, 0, bkinfo.bmWidth, bkinfo.bmHeight, &pBufferdc, 0, 0, SRCCOPY);
19 DeleteDC(pdc);
20 DeleteObject(ptbmp);
21 DeleteDC(pBufferdc);
22 DeleteDC(pBMPdc);
23 }
定时器设置、取消、处理的演示代码:
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(1, 50, NULL);
16 SetTimer(2, 500, NULL);
17 break;
18 case NORMAL:
19 SetTimer(1, 50, NULL);
20 SetTimer(2, 500, NULL);
21 break;
22 default:
23 break;
24 }
25 }
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(1, 50, NULL);
16 SetTimer(2, 500, NULL);
17 break;
18 case NORMAL:
19 SetTimer(1, 50, NULL);
20 SetTimer(2, 500, NULL);
21 break;
22 default:
23 break;
24 }
25 }
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(0, 0);
15 }
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(0, 0);
15 }
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 }
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 }
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 }
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 }
碰撞检测以及处理的过程:
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 }
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 }
修改对话框大小以及自定义对话框的方法:
1 CRect rect;
2 GetClientRect(rect);
3 ClientToScreen(rect);
4 MoveWindow(rect.left, rect.top, bkinfo.bmWidth, bkinfo.bmHeight, TRUE);
2 GetClientRect(rect);
3 ClientToScreen(rect);
4 MoveWindow(rect.left, rect.top, bkinfo.bmWidth, bkinfo.bmHeight, TRUE);
1 ModifyStyle( WS_CAPTION, WS_MINIMIZEBOX, SWP_DRAWFRAME );