www.gusucode.com > VC++写的飞机游戏源码程序 > VC++写的飞机游戏源码程序\code\Game.cpp
//Download by http://www.NewXing.com // Game.cpp: implementation of the CGame class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "6_1.h" #include "Game.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CGame::CGame() { int i,j; plane.LoadBitmap(IDB_BITMAP2); bmshot.LoadBitmap(IDB_BITMAP4); enemy.LoadBitmap(IDB_BITMAP3); enemydead.LoadBitmap(IDB_BITMAP5); bmenemyshot.LoadBitmap(IDB_BITMAP6); bmfire.LoadBitmap(IDB_BITMAP7); //设置透明色 cTransparentColor=RGB(192,192,192); //我发飞机数量5 numplane=5; //飞机开始出现位置 xStart=5; yStart=10; //火力没有出现 iffire=false; //火力强度 fire=0; //数组为0 for(i=0;i<15;i++) for(j=0;j<12;j++) back[i][j]=0; } CGame::~CGame() { } //本函数把一种指定的颜色变成透明色,并可改变大小 // hdc 显示句柄 // hBitmap要显示的位图 // xStart,xStart显示的位置 // xadd,yadd显示的位图的加大加小 // cTransparentColor变成透明的那种颜色 void CGame::TransparentBitmap(HDC hdc, HBITMAP hBitmap, short xStart, short yStart, short xadd,short yadd, COLORREF cTransparentColor) { BITMAP m_bm; COLORREF cColor; // 创建临时DC HDC hMem, hBack, hObject, hTemp, hSave; hBack = CreateCompatibleDC(hdc); hObject = CreateCompatibleDC(hdc); hMem = CreateCompatibleDC(hdc); hSave = CreateCompatibleDC(hdc); hTemp = CreateCompatibleDC(hdc); // 选入位图 SelectObject(hTemp, hBitmap); GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&m_bm); //显示位图宽高 POINT ptSize; // 取得位图的宽度 ptSize.x = m_bm.bmWidth; // 取得位图的该度 ptSize.y = m_bm.bmHeight; // 转换为逻辑点值 DPtoLP(hTemp, &ptSize, 1); // 创建临时位图 HBITMAP bmBack, bmObject, bmMem, bmSave; // 单色位图 bmBack = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL); bmObject = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL); // 与设备兼容位图 bmMem = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y); bmSave = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y); // 将创建的临时位图选入临时DC中 HBITMAP OldbmBack, OldbmObject, OldbmMem, OldbmSave; OldbmBack = (HBITMAP)SelectObject(hBack, bmBack); OldbmObject = (HBITMAP)SelectObject(hObject, bmObject); OldbmMem = (HBITMAP)SelectObject(hMem, bmMem); OldbmSave = (HBITMAP)SelectObject(hSave, bmSave); // 设置映射模式 SetMapMode(hTemp, GetMapMode(hdc)); // 先保留原始位图 BitBlt(hSave, 0, 0, ptSize.x, ptSize.y, hTemp, 0, 0, SRCCOPY); // 将背景颜色设置为需透明的颜色 cColor = SetBkColor(hTemp, cTransparentColor); // 创建目标屏蔽码 BitBlt(hObject, 0, 0, ptSize.x, ptSize.y, hTemp, 0, 0, SRCCOPY); // 恢复源DC的原始背景色 SetBkColor(hTemp, cColor); // 创建反转的目标屏蔽码 BitBlt(hBack, 0, 0, ptSize.x, ptSize.y, hObject, 0, 0, NOTSRCCOPY); // 拷贝主DC的背景到目标DC BitBlt(hMem, 0, 0, ptSize.x, ptSize.y, hdc, xStart, yStart, SRCCOPY); // 屏蔽位图的显示区 BitBlt(hMem, 0, 0, ptSize.x, ptSize.y, hObject, 0, 0, SRCAND); // 屏蔽位图中的透明色 BitBlt(hTemp, 0, 0, ptSize.x, ptSize.y, hBack, 0, 0, SRCAND); // 将位图与目标DC的背景左异或操作 BitBlt(hMem, 0, 0, ptSize.x, ptSize.y, hTemp, 0, 0, SRCPAINT); // 拷贝目标到屏幕上 StretchBlt(hdc, xStart, yStart, ptSize.x+xadd, ptSize.y+yadd, hMem, 0, 0, ptSize.x, ptSize.y,SRCCOPY); // 恢复原始位图 BitBlt(hTemp, 0, 0, ptSize.x, ptSize.y, hSave, 0, 0, SRCCOPY); // 删除临时内存位图 DeleteObject(SelectObject(hBack, OldbmBack)); DeleteObject(SelectObject(hObject, OldbmObject)); DeleteObject(SelectObject(hMem, OldbmMem)); DeleteObject(SelectObject(hSave, OldbmSave)); // 删除临时内存DC DeleteDC(hMem); DeleteDC(hBack); DeleteDC(hObject); DeleteDC(hSave); DeleteDC(hTemp); } //以2表示子弹 void CGame::Shot() { int i; //火力0 一线火力 if(fire==0) //从飞机前方到尽头 for(i=0;i<yStart;i++) { //如果有敌机 if(back[xStart][i]==3) //敌机被炸位图 back[xStart][i]=7; else //我方子弹位图 back[xStart][i]=2; } //火力1 两线火力 if(fire==1) { for(i=1;i<=yStart;i++) { //如果不出界 if((xStart-i)>=0) { //左上角 if(back[xStart-i][yStart-i]==3) back[xStart-i][yStart-i]=7; else back[xStart-i][yStart-i]=2; } //如果不出界 if((xStart+i)<15) { //右上角 if(back[xStart+i][yStart-i]==3) back[xStart+i][yStart-i]=7; else back[xStart+i][yStart-i]=2; } } } //其他 三线火力 if(fire>1) { for(i=1;i<=yStart;i++) { if((xStart-i)>=0) { if(back[xStart-i][yStart-i]==3) back[xStart-i][yStart-i]=7; else back[xStart-i][yStart-i]=2; } //正前方 if(back[xStart][i]==3) //敌机被炸位图 back[xStart][yStart-i]=7; else back[xStart][yStart-i]=2; if((xStart+i)<15) { if(back[xStart+i][yStart-i]==3) back[xStart+i][yStart-i]=7; else back[xStart+i][yStart-i]=2; } } } } void CGame::Enemyplaneout() { int x,y; //初始化随即数种子 srand(GetTickCount()); //循环到飞机出现为止 do { x=rand()%15; y=rand()%3; //如果位置空 if(back[x][y]==0) //显示敌机 back[x][y]=3; }while(back[x][y]==0); } void CGame::Enemyshot() { int i,j; for(i=0;i<15;i++) for(j=0;j<12;j++) if(back[i][j]==3) { //如果左下方空 if(back[i-1][j+1]==0) //数组赋值4,表示子弹向左下方移动 back[i-1][j+1]=4; //如果下方空 if(back[i][j+1]==0) //数组赋值5,表示子弹向下方移动 back[i][j+1]=5; //如果右下方空 if(back[i+1][j+1]==0) //数组赋值5,表示子弹向右下方移动 back[i+1][j+1]=6; } } void CGame::shotmove() { int i,j; for(j=11;j>=0;j--) for(i=14;i>=0;i--) { //数组赋值4,表示子弹向左下方移动 if(back[i][j]==4) { //清除数组 back[i][j]=0; //如果不出界 if(i>0) //如果左下方空 if(back[i-1][j+1]==0) //数组赋值4,表示子弹向左下方移动 back[i-1][j+1]=4; } if(back[i][j]==5) { back[i][j]=0; if(back[i][j+1]==0) back[i][j+1]=5; } if(back[i][j]==6) { back[i][j]=0; if(i<14) if(back[i+1][j+1]==0) back[i+1][j+1]=6; } //如果有敌机或子弹 if((back[xStart][yStart]==3)||(back[xStart][yStart]==4)||(back[xStart][yStart]==5)||(back[xStart][yStart]==6)) { //数组赋值8,表示我方被炸 back[xStart][yStart]=8; //飞机数量减1 numplane--; /*在numplane--的时候判断是否为0,如果为0则游戏结束*/ if(numplane==0) { AfxMessageBox("在这里编码,游戏应该在这里结束!"); } } //如果敌方子弹到了下方边界 if((back[i][11]==4)||(back[i][11]==5)||(back[i][11]==6)) //赋值0 back[i][11]=0; } } //火力位图是否出现 void CGame::FireOutIf() { //没有出现 if(!iffire) { //随机位置 pointfire.x=rand()%15; pointfire.y=rand()%8; //出现 iffire=true; } //出现 else { //如果和我方飞机位置相同 if((pointfire.x==xStart)&&(pointfire.y==yStart)) { //不出现 iffire=false; //如果火力大于5 if(fire>5) { //火力加强 fire++; //飞机数量加强 numplane++; } //否则 else //火力加强 fire++; //消失 pointfire.y=-1; } else { //位置下移 pointfire.y++; //出界 if(pointfire.y>11) //不出现 iffire=false; } } } void CGame::DrawMessage(CDC *pDC,int width,int height) { int nOldDC=pDC->SaveDC(); //设置字体 CFont font; if(0==font.CreatePointFont(250,"Comic Sans MS")) { AfxMessageBox("Can't Create Font"); } pDC->SelectObject(&font); //设置字体颜色及其背景颜色 CString str; pDC->SetTextColor(RGB(0,10,244)); pDC->SetBkColor(RGB(0,255,0)); //输出数字 str.Format("%d",numplane); pDC->TextOut((width-800)/2+70,height-80,str); str.Format("%d",fire); pDC->TextOut((width-800)/2+800-70,height-80,str); pDC->TextOut((width-800)/2+200,height-40,"暂停:F3 退出:Esc"); pDC->RestoreDC(nOldDC); }