11 C++课程设计_太空战机 联系客服

发布时间 : 星期三 文章11 C++课程设计_太空战机更新完毕开始阅读

\\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( const char *szName )。所以通过上边方法自动生成的类,如果系统自动生成构造函数CMyFighter (void), 删除掉它以及在CMyFighter.cpp中自动生成的对构造函数实现的代码:

CMyFighter:: CMyFighter (void) { }

再为CMyFighter类添加新的构造函数:CMyFighter (const char* szName)。

CMyFighter:: CMyFighter (const char* szName):CSprite(szName) //对构造函数进行实现

{

}

子类对象创建时,要先调用父类的构造函数完成父类部分的构造。如果父类没有默认构造函数,子类的构造函数必须显示调用父类的构造函数。CMyFighter构造函数调用CSprite类构造函数,并将参数szName的值传递给它,从而将名称为szName的精灵图片与CMyFighter对象绑定起来。 6、然后添加OnMove方法控制战机的游动,其参数bKeyDown表示键盘按键是否按下,

iKey表示相应的是哪个按键。

void OnMove(bool bKeyDown, int iKey);

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轴上的速度,并设置战机的速度。

void CMyFighter::OnMove(bool bKeyDown, int iKey) {

if(bKeyDown) {

switch(iKey) {

case KEY_A: // 左 m_fVelocityLeft =30.f; break;

case KEY_D: // 右

4

上海锐格软件有限公司 m_fVelocityRight =30.f; break;

case KEY_W: // 上 m_fVelocityUp =15.f; break;

case KEY_S: // 下 m_fVelocityDown = 15.f; break; } } else {

switch(iKey) {

case KEY_A: // 左 m_fVelocityLeft =0.f; break;

case KEY_D: // 右 m_fVelocityRight =0.f; break;

case KEY_W: // 上 m_fVelocityUp =0.f; break;

case KEY_S: // 下 m_fVelocityDown = 0.f; break; } }

float fVelX= m_fVelocityRight - m_fVelocityLeft; float fVelY = m_fVelocityDown - m_fVelocityUp; SetSpriteLinearVelocity( fVelX,fVelY ); }

9、在CGameMain类中,首先添加一个战机对象的指针m_pMyFighter。

注意需要包含头文件:

#include\

其次在构造函数中将m_pMyFighter赋予NULL的初始值。再次在GameInit方法中初始化m_pMyFighter。因为我们用new方法创建了m_pMyFighter对象,分配了内存,所以我们在CGameMain类的析构函数中需要调用delete方法将 m_pMyFighter使用的内存释放掉。

// 创建玩家控制的Sprite if( NULL == m_pMyFighter ) {

m_pMyFighter=new CMyFighter(\

m_pMyFighter->SetSpriteWorldLimit(WORLD_LIMIT_STICKY,CSystem::GetScreenLeft()-5

10.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类;

class CBullet : public CSprite {

public:

CBullet( const char *szName); ~CBullet(); };

6

上海锐格软件有限公司

2、为CMyFighter增加控制是否发射子弹的变量,权限为Private。

bool m_bCanFire;

并添加SetCanFire方法设置其值,权限为Public。

voidSetCanFire( const bool bCan ){ m_bCanFire = bCan; } GetCanFire获取其值。

bool GetCanFire(){return m_bCanFire;}

3、再在CMyFighter添加m_fBulletCreateTime,表示子弹的发射间隔,注意在构造函数中

初始化为0.3。然后添加LoopTick方法,处理子弹的发射。参数为游戏的时间间隔;

// 处理子弹的发射

void CMyFighter::OnFire( float fDeltaTime ) {

m_fBulletCreateTime-= fDeltaTime;

if( m_fBulletCreateTime <= 0.f && m_bCanFire ) {

// 固定发射时间 m_fBulletCreateTime=0.3f;

g_GameMain.CreateBullet(GetSpritePositionX(), GetSpritePositionY() ); } }

这里用到了g_GameMain这个全局对象,所以在CMyFight.cpp中应该包含头文件: #include\

4、在CGameMain类中添加m_iCreatedSpriteCount属性,表示游戏中发射子弹的数目注意在构造函数中初始化为0。然后添加CreateBullet方法,参数为子弹的X轴和Y轴坐标。并在该方法中创建一个子弹类,并设置子弹的位置和速度。因为模板子弹的方向是朝左,所以需要设置子弹按X轴对称旋转;

void CGameMain::CreateBullet( const float fPosX, const float fPosY ) {

charszName[MAX_NAME_LEN];// MAX_NAME_LE为CommonClass.h中宏定义 值为128

sprintf( szName, \m_iCreatedSpriteCount++;

CBullet *pBullet = new CBullet(szName); pBullet->CloneSprite( \pBullet->SetSpritePosition( fPosX, fPosY ); pBullet->SetSpriteLinearVelocityX( 60 );

pBullet->SetSpriteWorldLimit(WORLD_LIMIT_NULL,CSystem::GetScreenLeft()-10.f,CSystem::GetScreenTop(),CSystem::GetScreenRight() + 200.f, CSystem::GetScreenBottom()); }

这里用到CBullet类,所以应该在LessonX.h中包含头文件: #include\

5、在CGameMain类GameRun方法中,调用CMyFighter类的OnFire方法,控制我们战

机发射子弹;

void CGameMain::GameRun( float fDeltaTime )

7