c++游戏设计五:打飞机
#include
/*常量之类的一些东西应该放到头文件,用宏定义一下
*/
class CMyWnd :public CFrameWnd
{typedef struct entity{int x;int y;BOOL exist;}myEntity;
private:CDC *m_pmdc;CDC *temp_cdc;//用于双缓冲的CBitmap *m_pbitmap[5];//存image文件夹中的5张图CBitmap *temp_bitmap;//用于双缓冲CString pic_path[5];//5张图的路径myEntity plane[10];//默认飞机为10架myEntity rocket[3];//天空中最多有3枚火箭myEntity bomb;//炸弹的实体int s_x;//发射台的x坐标int s_y;//发射台的y坐标int b_time;//用于记录爆炸效果的int plane_kill;//存储已击毁的敌机
public:CMyWnd(){Create(NULL,"Fifth App");CClientDC dc(this);///一些初始化m_pmdc=new CDC;temp_cdc=new CDC;temp_bitmap=new CBitmap;s_x=0;s_y=450;bomb.x=0;bomb.y=0;bomb.exist=FALSE;b_time=0;plane_kill=0;pic_path[0]="../image/back.bmp";pic_path[1]="../image/plane.bmp";pic_path[2]="../image/rocket.bmp";pic_path[3]="../image/bomb.bmp";pic_path[4]="../image/station.bmp";MoveWindow(20,20,1000,500);for(int i=0;i<3;i++){rocket[i].x=rocket[i].y=0;rocket[i].exist=FALSE;}for(int i=0;i<10;i++){plane[i].x=500+i*200;//设定飞机已在一长列上排列好plane[i].y=0;plane[i].exist=TRUE;}for(int i=0;i<5;i++){m_pbitmap[i]=new CBitmap;m_pbitmap[i]->m_hObject=(HBITMAP)::LoadImage(NULL,pic_path[i],IMAGE_BITMAP, 0,0,LR_LOADFROMFILE);}m_pmdc->CreateCompatibleDC(&dc);temp_cdc->CreateCompatibleDC(&dc);temp_bitmap->CreateCompatibleBitmap(&dc,1000,500);temp_cdc->SelectObject(temp_bitmap);SetTimer(1,100,NULL);//启动计时器}void position_change();//新建一个位置改变的函数~CMyWnd(){for(int i=0;i<5;i++)delete m_pbitmap[i];delete m_pmdc;}DECLARE_MESSAGE_MAP()
// afx_msg void OnPaint();afx_msg void OnTimer(UINT_PTR nIDEvent);afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
};class CMyApp:public CWinApp
{
public:BOOL InitInstance();
};BOOL CMyApp::InitInstance()
{CMyWnd *pf=new CMyWnd;pf->ShowWindow(m_nCmdShow);this->m_pMainWnd=pf;return TRUE;
}
CMyApp FirstApp;BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd)ON_WM_TIMER()ON_WM_KEYDOWN()END_MESSAGE_MAP()void CMyWnd::OnTimer(UINT_PTR nIDEvent)//为了防止闪烁,在这里画图的
{// TODO: 在此添加消息处理程序代码和/或调用默认值CClientDC dc(this); // device context for paintingthis->position_change();m_pmdc->SelectObject(m_pbitmap[0]);//画背景temp_cdc->BitBlt(0,0,1000,500,m_pmdc,0,0,SRCCOPY);m_pmdc->SelectObject(m_pbitmap[1]);plane_kill=0;for(int i=0;i<10;i++)//画飞机{if(plane[i].exist){temp_cdc->BitBlt(plane[i].x,plane[i].y,175,60,m_pmdc,0,60,SRCAND);temp_cdc->BitBlt(plane[i].x,plane[i].y,175,60,m_pmdc,0,0,SRCPAINT);}elseplane_kill++;}if(plane_kill==10&&b_time==7){KillTimer(1);MessageBox("所有飞机已消灭!你赢了!!");}m_pmdc->SelectObject(m_pbitmap[2]);//画导弹for(int i=0;i<3;i++){if(rocket[i].exist){temp_cdc->BitBlt(rocket[i].x,rocket[i].y,30,150,m_pmdc,30,0,SRCAND);temp_cdc->BitBlt(rocket[i].x,rocket[i].y,30,150,m_pmdc,0,0,SRCPAINT);}}m_pmdc->SelectObject(m_pbitmap[4]);//画炮台temp_cdc->BitBlt(s_x,s_y,40,20,m_pmdc,0,0,SRCCOPY);if(bomb.exist){if(b_time>7){bomb.exist=FALSE;b_time=0;}m_pmdc->SelectObject(m_pbitmap[3]);//画爆炸temp_cdc->BitBlt(bomb.x,bomb.y,150,120,m_pmdc,150*b_time,120,SRCAND);//b_time的作用是记录爆炸要加载的图片temp_cdc->BitBlt(bomb.x,bomb.y,150,120,m_pmdc,150*b_time,0,SRCPAINT);b_time++;}dc.BitBlt(0,0,1000,500,temp_cdc,0,0,SRCCOPY);//将整体画出来CFrameWnd::OnTimer(nIDEvent);
}void CMyWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{// TODO: 在此添加消息处理程序代码和/或调用默认值switch (nChar)//键值的判断,并采取相应的操作{case VK_LEFT:if(s_x>10)s_x-=10;break;case VK_RIGHT:if(s_x<950)s_x+=10;break;case VK_SPACE:for(int i=0;i<3;i++)//控制火箭的循环发射{if (!rocket[i].exist){rocket[i].exist=TRUE;rocket[i].x=s_x-5;rocket[i].y=s_y;break;}}break;default:break;}CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}void CMyWnd::position_change()
{for(int i=0;i<10;i++)//飞机,整个嵌套在一个大循环里,有利有弊{if(plane[i].exist)for (int j = 0; j < 3; j++)//火箭{if(rocket[j].exist&&rocket[j].y<60&&rocket[j].y>-150&&rocket[j].x>plane[i].x-30&&rocket[j].x
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
