c++飞机大战实训报告 附带码(3)

2019-03-04 13:19

信息科学与工程学院软件实践实训报告

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().xGetPoint().x>rect.right ||enemy->GetPoint().yGetPoint().y>rect.bottom) { }//if else {

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().xGetPoint().x>rect.right { }//if else {

ball->Draw(&cdc,1); ListBall.RemoveAt(posball_t); delete ball;

|| ball->GetPoint().yGetPoint().y>rect.bottom)

}//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


c++飞机大战实训报告 附带码(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:四川省自贡市2010届高三二诊(英语)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: