信息科学与工程学院软件实践实训报告
4. 编码实现
4.1 绘制游戏背景位图程序
CDC *pDC=GetDC(); //获得矩形区域对象 CRect rect;
GetClientRect(&rect);
//设备环境对象类----CDC类。 CDC cdc;
//内存中承载临时图像的位图 CBitmap bitmap1;
//该函数创建一个与指定设备兼容的内存设备上下文环境(DC) cdc.CreateCompatibleDC(pDC);
//该函数创建与指定的设备环境相关的设备兼容的位图。 bitmap1.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
//该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。
CBitmap *pOldBit=cdc.SelectObject(&bitmap1); //用固定的固体色填充文本矩形框 cdc.FillSolidRect(rect,RGB(51,255,255));
//添加背景图片
CBitmap bitmap_BackGround;
bitmap_BackGround.LoadBitmap(IDB_BACKGROUND); BITMAP bimap2;//位图图像
bitmap_BackGround.GetBitmap(&bimap2); CDC cdc_BackGround;//定义一个兼容的DC
cdc_BackGround.CreateCompatibleDC(&cdc);//创建DC
CBitmap*Old=cdc_BackGround.SelectObject(&bitmap_BackGround);
cdc.StretchBlt(0,0,rect.Width(),rect.Height(),&cdc_BackGround,0,0,bimap2.bmWidth,bimap2.bmHeight,SRCCOPY);
11
信息科学与工程学院软件实践实训报告
4.2 飞机大战游戏对象的绘制程序
//画战机对象(唯一) if(myplane!= NULL) { }
//设置定时器,随机添加敌机,敌机随机发射炸弹,此时敌机速度与数量和关卡有关
SetTimer(2,300,NULL);//敌机产生的定时器 SetTimer(3,500,NULL);//敌机炸弹产生的定时器 if(myplane!=NULL&& is_Pause == 0)
{
switch(nIDEvent) {
case 2://设置定时器产生敌机 {
if(pass_Num == 1)//第一关 { }//if
else if(pass_Num >= 2)//第一关以后的关卡 {
int motion1 = 1;
//设置敌机的方向,从上方飞出
myplane->Draw(&cdc,TRUE);
int motion =1;//设置敌机的方向,从上方飞出 CEnemy *enemy=new CEnemy(motion); ListEnemy.AddTail(enemy);//随机产生敌机
CEnemy *enemy1=new CEnemy(motion1); enemy1->SetSpeed_en((rand()%5 +1)* pass_Num); ListEnemy.AddTail(enemy1);//随机产生敌机 int motion2 = -1;//设置敌机的方向,从下方飞出 CEnemy *enemy2=new CEnemy(motion2);
12
信息科学与工程学院软件实践实训报告
enemy2->SetSpeed_en((rand()%5 +1)* pass_Num); ListEnemy.AddTail(enemy2);//随机产生敌机
}//else if
}//case break;
}//switch
//判断产生的敌机是否出界,若已经出界,则删除该敌机 POSITION posEn=NULL,posEn_t=NULL; posEn=ListEnemy.GetHeadPosition(); int motion = 1; while(posEn!=NULL) {
posEn_t=posEn;
CEnemy *enemy= (CEnemy *)ListEnemy.GetNext(posEn); //判断敌机是否出界
if(enemy->GetPoint().x
enemy->Draw(&cdc,TRUE); switch(nIDEvent) {
case 3://设置定时器产生敌机炸弹 {
ListEnemy.RemoveAt(posEn_t); delete enemy;
CBall*ball=newCBall(enemy->GetPoint().x+17, enemy->GetPoint().y+30,enemy->GetMotion());
13
信息科学与工程学院软件实践实训报告
}//if
ListBall.AddTail(ball);
}//case break;
}//switch
}//else
}//while
//判断产生的敌机炸弹是否出界,若已经出界,则删除该敌机炸弹 POSITION posball=NULL,posball_t=NULL; posball= ListBall.GetHeadPosition(); while(posball!=NULL) {
posball_t=posball;
ball= (CBall *) ListBall.GetNext(posball);
if( ball->GetPoint().x
ball->Draw(&cdc,1); ListBall.RemoveAt(posball_t); delete ball;
|| ball->GetPoint().y
}//else
}//while
4.3 飞机大战游戏对象战机位置的动态控制
if(myplane!= NULL) {
myplane->Draw(&cdc,TRUE);
14
信息科学与工程学院软件实践实训报告
}
//获得键盘消息,战机位置响应,战机速度speed为30
if((GetKeyState(VK_UP) <0 || GetKeyState('W') < 0) && is_Pause== 0)//上方向键 { }//if
if((GetKeyState(VK_DOWN) <0|| GetKeyState('S') < 0)&& is_Pause== 0)//下方向键{}//if if((GetKeyState(VK_LEFT) <0|| GetKeyState('A') < 0)&& is_Pause== 0)//左方向键{}//if if((GetKeyState(VK_RIGHT) <0|| GetKeyState('D') < 0)&& is_Pause== 0)//右方向键{}//if if((GetKeyState(VK_SPACE)<0)&& is_Pause== 0)//空格键代表战机发射子弹 { }//if
if(GetKeyState('Z')<0) { }//if
is_Pause += 1; if(is_Pause != 1)
is_Pause=0;
//向子弹链表中添加子弹对象
CBomb *BombOne=new CBomb( myplane->GetPoint().x, myplane->GetPoint().y,1); ListBomb.AddTail(BombOne);
CBomb*BombTwo=newCBomb(myplane->GetPoint().x+35, myplane->GetPoint().y,1); ListBomb.AddTail(BombTwo);
PlaySound((LPCTSTR)IDR_WAVE2,AfxGetInstanceHandle(),SND_RESOURCE |SND_ASYNC);
if(myplane->GetPoint().y myplane->SetPoint(myplane->GetPoint().x,( myplane->GetPoint().y - speed) ); myplane->SetPoint( myplane->GetPoint().x,rect.bottom); //鼠标控制战机 void CPlaneGameView::OnMouseMove(UINT nFlags, CPoint point) 15