\\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