• 射击的乐趣: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
  • 相关阅读:
    解决Linux系统下MYSQL数据表大小写敏感问题
    MYSQL报1022错误:Can't write;duplicate key in table '.....'
    本地测试Http升级到Https(证书信任)
    Linux查看端口占用情况
    Java报错:java.lang.NoSuchMethodError: io.netty.util.internal.ObjectUtil.checkPositive
    Linux查看磁盘空间
    如何解除Word中“保护文档”的限制
    tcpdump命令详解
    python 爬取视频
    pyecharts 画地图(热力图)(世界地图,省市地图,区县地图)
  • 原文地址:https://www.cnblogs.com/learn-my-life/p/3397158.html
Copyright © 2020-2023  润新知