10 C++课程设计 - 贪吃鱼 - 图文

发布时间 : 星期日 文章10 C++课程设计 - 贪吃鱼 - 图文更新完毕开始阅读

break;

case KEY_S: // 下 m_fVelocityDown = 15.f; break; } } else { switch(iKey) { }

case KEY_A: // 左 m_fVelocityLeft break;

= 0.f;

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 );

// 当速度不为0的时候,更改鱼的朝向 if( fVelX < -0.0001f || fVelX > 0.0001f ) { if( fVelX > 0.0001f ) SetSpriteFlipX( false ); else SetSpriteFlipX( true ); } }

6、 在CGameMain类中,首先添加一个小鱼对象的指针m_pMyFish。其次在构造函数

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

4

上海锐格软件有限公司

{ }

// 创建对象实例

m_pMyFish = new CMyFish(\

7、 在OnKeyDown和OnkeyUp中响应小鱼OnMove方法,它们的区别只是第一个参数

的值不同。下面是OnKeyDown方法中的调用。 if( 2 == GetGameState() ) {

m_pMyFish->OnMove(true,iKey); } 8、 在CGameMain类的GameInit方法中显示当前等级和分数。m_pLevelText和

m_pHpText需要在CGameMain类中声明,并在其构造函数中定义,其类类型为CTextSprite。

// 更新当前等级/HP显示

m_pLevelText->SetTextValue( 1 ); // 等级设置为1 m_pHpText->SetTextValue( 0 ); // 分数设置为0

实验二 为游戏添加各种小鱼

【实验内容】

1、 创建普通鱼CNormalFish类;

2、 新添的小鱼一共有4种,从鱼类模板中随机生成; 3、 间隔1到2秒生成一只小鱼; 4、 小鱼以随机速度从右向左移动; 5、 小鱼碰到世界边界后消失;

【实验思路】

我们将在游戏中出现的敌方小鱼看成对象,这些对象具有共同的属性和方法,因此我们创建一个CNormalFish类。并且给这些鱼一定的速度,让他们从产生就开始运动,游过屏幕,然后到达世界边界的另一端就被删除。

【实验指导】

1、 根据类向导创建CNormalFish类。

// 普通类型的鱼,有等级属性。我们控制的鱼如果等级大于等于此鱼,则可以吃 // 掉其,如果小于,则被吃掉 class CNormalFish : public CSprite {

public: CNormalFish( const char *szName); ~CNormalFish() {} };

2、 在CNormalFish类的构造函数中。首先生成一个1到100的随机数,根据随机数的

大小,我们选择不同的小鱼模板。当随机数小于15时我们选择yu_muban4的小鱼做为模板,当随机数在[15,35]区间时,我们选择yu_muban3做为模板,当随机数在[35,60]区间时,我们选择yu_muban2做为模板,当随机数在[60,100]区间,我们选

5

择yu_muban1做为模板。

int iRandom = CSystem::RandomRange( 1, 100 ); if( iRandom < 15 )

{ CloneSprite( \ } else if( iRandom < 35 ) { CloneSprite( \ } else if( iRandom < 60 ) { CloneSprite( \ } else { CloneSprite( \

}

3、 接着为小鱼设置X轴坐标和一个随机的Y轴坐标。因为小鱼从右向左游,因此X坐

标在世界边界的右边一些。而Y轴坐标的区间在世界边界的Top和Bottom值之间。同时因为小鱼向右游,我们需要将鱼的朝向改为朝向X轴的负方向。 iRandom=CSystem::RandomRange((int)CSystem::GetScreenTop(),

(int)CSystem::GetScreenBottom());

SetSpritePosition(CSystem::GetScreenRight() + 10.f, (float)iRandom ); SetSpriteFlipX( true ); 4、 最后我们为小鱼设置一个随机速度和世界边界的碰撞属性和范围限制。速度在

[10,25]区间。当小鱼碰到世界边界时小鱼消失,因此设置为WORLD_LIMIT_KILL,而范围,我们需设置的比屏幕边界大一些,让小鱼完全游出屏幕时才消失。 iRandom = CSystem::RandomRange( 10, 25 );

SetSpriteLinearVelocityX( -(float)iRandom ); SetSpriteWorldLimit(WORLD_LIMIT_NULL, CSystem::GetScreenLeft() - 10.f,

CSystem::GetScreenTop(),CSystem::GetScreenRight()+20.f,

CSystem::GetScreenBottom());

5、 完成了CNormalFish类后,我们需要在CGameMain类中生成小鱼,即生成

CNormalFish类的实例。首先添加一个变量表示创建鱼的时间间隔和表示小鱼数目的变量。

float m_fCreateNormalTime; int m_iCreatedFishCount;

6、 然后在GameRun方法中,游戏循环将m_fCreateNormalTime递减,当

m_fCreateNormalTime小于0时,创建一只鱼。并在[100,300]区间随机去个数除以100做为下一次创建小鱼的时间间隔。 char szName[128];

m_fCreateNormalTime -=fDeltaTime; if( m_fCreateNormalTime <= 0.f )

6

上海锐格软件有限公司

{

int iNextTime = CSystem::RandomRange( 100, 300 ); m_fCreateNormalTime = (float)iNextTime / 100.f; sprintf( szName, \ m_iCreatedFishCount++;

CNormalFish *fish = new CNormalFish(szName); }

实验三 吃小鱼

【实验内容】

1、 玩家控制小鱼与其它小鱼碰撞,当玩家小鱼等级小于敌方小鱼时,玩家小鱼被吃掉,

反之敌方小鱼被吃掉;每吃掉一只小鱼,玩家小鱼的分数增加为敌方小鱼的HP值 2、 需要根据小鱼的等级确定碰撞的不同结果,因此为小鱼添加等级的属性; 3、 同时不同的等级拥有不同的分数,因此为小鱼增加分数的属性;

【实验思路】

首先为CMyFish类增加碰撞属性;然后为CMyFish类增加表示小鱼等级和HP的属性,增加设置等级、HP值和获得等级、HP值的方法;同理为CNormalFish类增加碰撞属性及其小鱼等级、HP的属性和获得等级、HP值的方法。CMyFish、CNormalFish类小鱼,是在创建时就设置好了其等级和HP值,因此我们可以在构造函数中增加两个参数,直接在创建小鱼时,就初始化好等级和HP值。在CGameMain类的OnSpriteColSprite碰撞函数中检测碰撞,并更新游戏界面中HP的值。在OnSpriteColSprite中,我可以知道碰撞双方的名称,但我们还需要根据名称获得具体的小鱼的对象,以便获得小鱼的等级和HP值等属性,因此我们每创建一只小鱼,就把这只小鱼增加到链表中管理起来。这样我们就增加了一个FishList链表。

【实验指导】

1、 首先为MyFish设置碰撞属性。MyFish产生碰撞,敌方小鱼接受碰撞。这个在控制

面板中已经设置好了,如果想自己设置么可以添加如下代码,将控制面板中碰撞属性取消,在构造函数中设置碰撞属性。 SetSpriteCollisionActive(true,false);

2、 其次为敌方小鱼设置碰撞属性。敌方小鱼接受碰撞,这个属性和1一样,也在界面

中设置好了,如果想要自行设置,可以取消界面中的设置,然后在CNormalFish类的构造函数中增加如下代码。 SetSpriteCollisionActive(false,true); 3、 为CMyFish和CNormalFish增加等级和HP值的属性,和设置、获得这两个属性的

方法,最后改造构造函数。 int m_iHp; int m_iLevel;

CMyFish:: CMyFish ( const char *szName, const int iHp, const int iLevel );

CNormalFish::CNormalFish( const char *szName); //普通鱼的HP和level随机生成 4、 在LessonX.h中定义结构体FishList,并在CGameMain类中添加一个头节点

m_pFishHeader。 struct FishList {

7

联系合同范文客服:xxxxx#qq.com(#替换为@)