您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 11-C++课程设计-太空战机
FunCode程序设计实验教材系列C++面向对象课程设计实验指南上海锐格软件有限公司上海锐格软件有限公司1课程设计三太空战机一、游戏介绍太空战机是玩家用键盘控制战机移动并发射子弹,消灭敌方的战机。敌方战机从右到左移动,同时上下浮动。二、实验目的综合应用C++语言和面向对象的知识开发一款小游戏。三、实验内容在外星球上,玩家通过键盘WSAD键控制己方战机,消灭外星球的邪恶战机。要求如下:1、游戏运行时,初始界面如下图。2、按下空格键,游戏开始,玩家通过WSAD键控制己方战机移动;己方战机不能超出世界边界。3、玩家战机每隔0.3秒发射一发子弹;4、添加敌方战机,每隔5秒创建一架敌方战机;5、敌方战机每隔3秒发射一发子弹;6、记录游戏的最高分。游戏初始界面2四、实验指南实验一游戏开始和控制我方战机移动【实验内容】1、按空格键,游戏开始,“空格开始”字样消失。2、创建CMyFighter类,并创建对象实例玩家控制的战机。3、战机碰到世界边界时,静止。4、游戏开始后,通过键盘WSAD键控制战机移动。5、战机左右运动的速度为30。上下运动的速度为15。6、在游戏中显示游戏的当前积分和最高积分。【实验思路】按空格键开始游戏,属于键盘按下事件,我们在dOnKeyDown函数中编写代码。在游戏中,我们运用面向对象的知识将战机看成一个对象,并为这个对象添加一个类叫CMyFighter。类具有属性和方法,要控制战机能在各个方向上自由的游动,我们为CMyFighter类添加上下左右四个方向的速度,并且我们为战机添加OnMove方法控制战机的游动状态。【实验指导】1、在LCGameMain中定义类局部变量:CSprite*m_pBeginSprite;//GameBegin就是我们“空格开始”精灵。CTextSprite*m_pCurScoreText;//显示当前积分CTextSprite*m_pMaxScoreText;//显示最高分2、在CGameMain类的构造函数中添加代码,对变量进行初始化。m_pBeginSprite=newCSprite(GameBegin);m_pCurScoreText=newCTextSprite(CurScoreText);m_pMaxScoreText=newCTextSprite(MaxScoreText);3、在OnKeyDown中,当按下的按键为空格键并且此时的游戏状态为0,则设置游戏的状态为1。0表示此时游戏为等待状态,未开始。1表示游戏进行初始化,2表示初始化后会进入游戏运行状态。//按下空格,游戏开始if(KEY_SPACE==iKey&&0==GetGameState()){SetGameState(1);}4、在游戏初始化函数GameInit中隐藏按空格开始游戏这个提示图片。m_pBeginSprite-SetSpriteVisible(false);5、通过类向导创建CMyFighter类,其继承于CSprite类。以VC++6.0为例:第一步、点击菜单“插入”-〉“新建类”。上海锐格软件有限公司3第二步、在“NewClass”对话框中输入类名和父类名。第三步、点击“更改”按钮,在新对话框中修改CMyFighter类的头文件和cpp文件的路径。将头文件保存到项目文件夹的\SourceCode\Header文件夹中,将cpp文件保存到项目文件夹下的\SourceCode\Src文件夹中。这里需要特别注意的是创建文件路径的问题,所有的.h头文件应该在项目文件夹4\SourceCode\Header中,所有的.cpp源文件应该放在项目文件夹下的\SourceCode\Src文件夹中。为CMyFighter类添加m_fVelocityLeft,m_fVelocityRight,m_fVelocityUp,m_fVelocityDown四个成员变量分别表示飞机上下左右的速度,权限为private。本文档的命名采用匈牙利命名法,m_表示类成员变量,i表示整型,f表示float型,sz表示字符指针,g_表示全局变量等。1、CMyFighter的父类是CSprite类(具体声明查看CommonClass.h),构造函数为CSprite(constchar*szName)。所以通过上边方法自动生成的类,如果系统自动生成构造函数CMyFighter(void),删除掉它以及在CMyFighter.cpp中自动生成的对构造函数实现的代码:CMyFighter::CMyFighter(void){}再为CMyFighter类添加新的构造函数:CMyFighter(constchar*szName)。CMyFighter::CMyFighter(constchar*szName):CSprite(szName)//对构造函数进行实现{}子类对象创建时,要先调用父类的构造函数完成父类部分的构造。如果父类没有默认构造函数,子类的构造函数必须显示调用父类的构造函数。CMyFighter构造函数调用CSprite类构造函数,并将参数szName的值传递给它,从而将名称为szName的精灵图片与CMyFighter对象绑定起来。6、然后添加OnMove方法控制战机的游动,其参数bKeyDown表示键盘按键是否按下,iKey表示相应的是哪个按键。voidOnMove(boolbKeyDown,intiKey);7、在CMyFighter类的构造函数中,首先初始4个方向的速度为0,然后设置和世界编辑的碰撞属性为WORLD_LIMIT_STICKY,当碰到世界边界时,战机静止不动。m_fVelocityLeft=0.f;m_fVelocityRight=0.f;m_fVelocityUp=0.f;m_fVelocityDown=0.f;8、编写CMyFighter类OnMove方法代码。首先判断当前按键是按下还是松开的,其次判断是哪个按键的消息,根据这两个判断,为4个方向的速度矢量赋值。再次算出X后和Y轴上的速度,并设置战机的速度。voidCMyFighter::OnMove(boolbKeyDown,intiKey){if(bKeyDown){switch(iKey){caseKEY_A://左m_fVelocityLeft=30.f;break;caseKEY_D://右上海锐格软件有限公司5m_fVelocityRight=30.f;break;caseKEY_W://上m_fVelocityUp=15.f;break;caseKEY_S://下m_fVelocityDown=15.f;break;}}else{switch(iKey){caseKEY_A://左m_fVelocityLeft=0.f;break;caseKEY_D://右m_fVelocityRight=0.f;break;caseKEY_W://上m_fVelocityUp=0.f;break;caseKEY_S://下m_fVelocityDown=0.f;break;}}floatfVelX=m_fVelocityRight-m_fVelocityLeft;floatfVelY=m_fVelocityDown-m_fVelocityUp;SetSpriteLinearVelocity(fVelX,fVelY);}9、在CGameMain类中,首先添加一个战机对象的指针m_pMyFighter。注意需要包含头文件:#includeMyFighter.h其次在构造函数中将m_pMyFighter赋予NULL的初始值。再次在GameInit方法中初始化m_pMyFighter。因为我们用new方法创建了m_pMyFighter对象,分配了内存,所以我们在CGameMain类的析构函数中需要调用delete方法将m_pMyFighter使用的内存释放掉。//创建玩家控制的Spriteif(NULL==m_pMyFighter){m_pMyFighter=newCMyFighter(ControlSprite);m_pMyFighter-SetSpriteWorldLimit(WORLD_LIMIT_STICKY,CSystem::GetScreenLeft()-610.f,CSystem::GetScreenTop(),CSystem::GetScreenRight(),CSystem::GetScreenBottom());}10、在OnKeyDown和OnkeyUp中响应战机OnMove方法,它们的区别只是第一个参数的值不同。下面是OnKeyDown方法中的调用。if(2==GetGameState())//当游戏状态为2时{m_pMyFighter-OnMove(true,iKey);}在OnKeyUp中调用if(2==GetGameState()){m_pMyFighter-OnMove(false,iKey);}11、在CGameMain类的GameInit方法中显示当前积分和最高积分//更新当前等级/HP显示m_CurScoreText-SetTextValue(0);m_MaxScoreText-SetTextValue(0);实验二添加子弹类,实现战机开炮【实验内容】1、创建子弹类CBullet;2、通过空格键控制飞机发射子弹;3、当空格键按下时,飞机每隔0.3秒发射一发子弹;【实验思路】运用面向对象的知识,我们将游戏中的元素都看为一个对象,因此我们将子弹对象抽象为CBullet类。当子弹与世界边界碰撞时,子弹消失。当空格键按下时飞机每隔0.3发射一发子弹,因此我们在飞机类中增加一个bool型的属性m_bFire,控制子弹是否发射。然后增加方法OnFire,参数为游戏循环一次的时间间隔,当时间间隔大于0.3时并且m_bFire为true时,飞机发射一发子弹。飞机发射的子弹,我们在CGameMain类中进行创建。在游戏循环的GameRun函数中调用飞机的OnFire方法,实现飞机每隔三秒发射一发子弹。在CGameMain类中添加一个创举子弹的方法,当战机发射子弹时,调用此方法。【实验指导】1、仿照创建我方战机的方法创建CBullet类;classCBullet:publicCSprite{public:CBullet(constchar*szName);~CBullet();};上海锐格软件有限公司72、为CMyFighter增加控制是否发射子弹的变量,权限为Private。boolm_bCanFire;并添加SetCanFire方法设置其值,权限为Public。voidSetCanFire(constboolbCan){m_bCanFire=bCan;}GetCanFire获取其值。boolGetCanFire(){returnm_bCanFire;}3、再在CMyFighter添加m_fBulletCreateTime,表示子弹的发射间隔,注意在构造函数中初始化为0.3。然后添加LoopTick方法,处理子弹的发射。参数为游戏的时间间隔;//处理子弹的发射voidCMyFighter::OnFire(floatfDeltaTime){m_fBulletCreateTime-=fDeltaTime;if(m_fBulletCreateTime=0.f&&m_bCanFire){//固定发射时间m_fBulletCreateTime=0.3f;g_GameMain.CreateBullet(GetSpritePositionX(),GetSpritePositionY());}}这里用到了g_GameMain这个全局对象,所以在CMyFight.cpp中应该包含头文件:#includeLessonX.h4、在CGameMain类中添加m_iCreatedSpriteCount属性,表示游戏中发射子弹的数目注意在构造函数中初始化为0。然后添加CreateBullet方法,参数为子弹的X轴和Y轴坐标。并在该方法中创建一个子
本文标题:11-C++课程设计-太空战机
链接地址:https://www.777doc.com/doc-3989731 .html