1、4、 小鱼左右运动的速度为30。上下运动的速度为15。5、 小鱼碰到世界边界时,静止。6、 游戏开始后,通过键盘WSAD键控制小鱼移动。7、 在游戏中显示游戏的等级和玩家控制的鱼的HP。【实验思路】按空格键开始游戏,属于键盘按下事件,我们在dOnKeyDown函数中编写代码。在游戏中,我们运用面向对象的知识将小鱼看成一个对象,并为这个对象添加一个类叫CMyFish。类具有属性和方法,要控制小鱼能在各个方向上自由的游动,我们为CMyFish类添加上下左右四个方向的速度,并且我们为小鱼添加OnMove方法控制小鱼的游动状态。【实验指导】1、 在OnKeyDown中,当按下的按键为空格键并且此时的游
2、戏状态为0,则设置游戏的状态为1。0表示此时游戏为等待状态,未开始。1表示游戏进行初始化,初始化后会进入2游戏运行状态。/ 按下空格键,游戏开始 if( KEY_SPACE = iKey & 0 = GetGameState() ) SetGameState( 1 ); 2、 在游戏初始化函数GameInit中隐藏 按空格开始游戏 这个提示图片。在CGameMain中添加成员变量:CSprite * m_pBeginSprite;在CGameMain的构造函数中进行初始化:m_pBeginSprite = new CSprite(kaishi);在GameInit中添加一下代码:m_pBegi
3、nSprite-SetSpriteVisible( false );3、 通过类向导创建CMyFish类。首先添加向左、向右、向上、向下4个方向的运动速度属性。添加OnMove方法控制小鱼的游动,bKeyDown表示键盘时按下的,iKey表示相应的是哪个按键。class CMyFish : public CSprite public: CMyFish(const char *szName); virtual CMyFish(); void OnMove(bool bKeyDown,int iKey);private: float m_fVelocityLeft; / 控制的鱼的上下左右游动速度
4、 float m_fVelocityRight; float m_fVelocityUp; float m_fVelocityDown; ;4、 在CMyFish类的构造函数中,首先初始4个方向的速度为0,然后设置小鱼缩小到原图的1/4,最后设置和世界边界的碰撞属性为WORLD_LIMIT_STICKY,当碰到世界边界时,小鱼静止不动。而小鱼的世界边界大小,我们设置为比屏幕的大小大2个单位。/ 设置鱼的模型大小为1/4 SetSpriteScale( 0.25f ); / 世界边界限制 SetSpriteWorldLimit( WORLD_LIMIT_STICKY, CSystem:GetSc
5、reenLeft()-2.f, CSystem:GetScreenTop() - 2.f, GetScreenRight() + 2.f, CSystem:GetScreenBottom() + 2.f );5、 编写CMyFish类OnMove方法代码。首先判断当前按键是按下还是松开的,其次判断是哪个按键的消息,根据这两个判断,为4个方向的速度矢量赋值。再次算出X后和Y轴上的速度,并设置小鱼的速度。最后根据X轴方向的速度值设置鱼的朝向。 当速度不为0的时候,更改鱼的朝向。void CMyFish:OnMove(bool bKeyDown,int iKey) if(bKeyDown) swit
6、ch(iKey) case KEY_A: / 左 m_fVelocityLeft = 30.f; break; case KEY_D: / 右 m_fVelocityRight = 30.f; case KEY_W: / 上 m_fVelocityUp = 15.f; case KEY_S: / 下 m_fVelocityDown = 15.f; else m_fVelocityLeft = 0.f; m_fVelocityRight = 0.f; m_fVelocityUp = 0.f; m_fVelocityDown = 0.f; float fVelX = m_fVelocityRigh
7、t - m_fVelocityLeft; float fVelY = m_fVelocityDown - m_fVelocityUp; SetSpriteLinearVelocity( fVelX,fVelY ); / 当速度不为0的时候,更改鱼的朝向 if( fVelX 0.0001f ) if( fVelX SetSpriteFlipX( false ); else SetSpriteFlipX( true );6、 在CGameMain类中,首先添加一个小鱼对象的指针m_pMyFish。其次在构造函数中将m_pMyFish赋予NULL的初始值。再次在GameInit方法中初始化m_pMy
8、Fish。因为我们用new方法创建了m_pMyFish对象,分配了内存,所以我们在CGameMain类的析构函数中需要调用delete方法将 m_pMyFish使用的内存释放掉。 if( NULL = m_pMyFish ) / 创建对象实例 m_pMyFish = new CMyFish(kongzhiyu7、 在OnKeyDown和OnkeyUp中响应小鱼OnMove方法,它们的区别只是第一个参数的值不同。下面是OnKeyDown方法中的调用。if( 2 = GetGameState() ) m_pMyFish-OnMove(true,iKey);8、 在CGameMain类的GameIn
9、it方法中显示当前等级和分数。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、 小鱼碰到世界边界后消失;我们将在游戏中出现的敌方小鱼看成对象,
10、这些对象具有共同的属性和方法,因此我们创建一个CNormalFish类。并且给这些鱼一定的速度,让他们从产生就开始运动,游过屏幕,然后到达世界边界的另一端就被删除。1、 根据类向导创建CNormalFish类。/ 普通类型的鱼,有等级属性。我们控制的鱼如果等级大于等于此鱼,则可以吃 / 掉其,如果小于,则被吃掉class CNormalFish : public CSprite CNormalFish( const char *szName); CNormalFish() 2、 在CNormalFish类的构造函数中。首先生成一个1到100的随机数,根据随机数的大小,我们选择不同的小鱼模板。当
11、随机数小于15时我们选择yu_muban4的小鱼做为模板,当随机数在15,35区间时,我们选择yu_muban3做为模板,当随机数在35,60区间时,我们选择yu_muban2做为模板,当随机数在60,100区间,我们选择yu_muban1做为模板。int iRandom = CSystem:RandomRange( 1, 100 ); if( iRandom 15 ) CloneSprite( yu_muban4 ); else if( iRandom 35 )yu_muban3 60 )yu_muban2 yu_muban13、 接着为小鱼设置X轴坐标和一个随机的Y轴坐标。因为小鱼从右向左
12、游,因此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区间。当小
13、鱼碰到世界边界时小鱼消失,因此设置为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,5、 完成了CNormalFish类后,我们需要
14、在CGameMain类中生成小鱼,即生成CNormalFish类的实例。首先添加一个变量表示创建鱼的时间间隔和表示小鱼数目的变量。float m_fCreateNormalTime;int m_iCreatedFishCount;6、 然后在GameRun方法中,游戏循环将m_fCreateNormalTime递减,当m_fCreateNormalTime小于0时,创建一只鱼。并在100,300区间随机去个数除以100做为下一次创建小鱼的时间间隔。char szName128;m_fCreateNormalTime -=fDeltaTime; if( m_fCreateNormalTime p
15、Ptr = pSprite;pNext = NULL;pPrev = NULL;/ 插入链表中if( NULL = m_pFishHeader ) m_pFishHeader = pFish;else FishList *pTemp = m_pFishHeader; while( NULL != pTemp-pNext ) pTemp = pTemp-pNext; pFish-pPrev = pTemp; pTemp-pNext = pFish;6、 同时在碰撞时,我们需要根据小鱼的名称获得小鱼的对象,因此添加GetFishFromName方法。CNormalFish* CGameMain:G
16、etFishFromName( const char *szName )FishList *pFish = NULL;for( pFish = m_pFishHeader; NULL != pFish; pFish = pFish- if( strcmp( szName, pFish-pPtr-GetName() = 0 ) return pFish-pPtr;return NULL;7、 在CGameMain类的GameRun方法中,将创建的小鱼对象的指针添加到链表中。8、 玩家的小鱼根据HP值分为1-4不同的等级,初始HP的值为10,等级为1。当HP大于20时且等级为1时,玩家升为2级;当
17、HP值大于100时且等级为2时,玩家升为3级;当HP值大于1000时且等级为3时,玩家升为4级。每升1级,鱼的大小也变大25%。在CNormalFish类中添加碰撞处理函数:void OnColControlFish(CMyFish *pControlFish);定义如下:void CNormalFish:OnColControlFish(CMyFish *pControlFish) .在上述函数中添加以下代码:if (pControlFish = NULL) if( m_pMyFish-GetLevel() = GetLevel() ) pControlFish-SetHp(pControl
18、Fish -GetHp()+GetHp(); if(m_pMyFish -GetHp() = 1000 & m_pMyFish -GetLevel() = 3 ) m_pMyFish -SetLevel( 4 );SetSpriteScale( 1.0f ); / 模型变大 else if(m_pMyFish -= 100 &GetLevel() = 2 ) SetLevel( 3 );SetSpriteScale( 0.75f ); = 20 &GetLevel() = 1 ) SetLevel( 2 );SetSpriteScale( 0.5f ); pControlFish-SetHp(
19、0);9、 接着我们在CGameMain类中声明函数OnSpriteColSprite处理碰撞。OnSpriteColSprite函数的第一个参数是碰撞的产生方的名称,第二个参数是碰撞接受方的名称。由上面两个步骤,我们知道碰撞产生方是玩家控制的小鱼的名称,接受方是敌方小鱼的名称。而碰撞方是直接被删除。同时更新玩家控制小鱼的HP。if( 2 != GetGameState() | NULL = m_pMyFish)return;else if( strcmp( m_pMyFish-GetName(), szSrcName ) = 0 )if( !strstr( szTarName, putong
20、yu ) ) return; CNormalFish *pFish = GetFishFromName( szTarName );if( NULL != pFish ) OnColControlFish(m_pMyFish); DeleteFishFromName(szTarName);10、 DeleteFishFromName将碰撞后的小鱼从链表中删除。DeleteFishFromName( const char *szName )GetName() ) = 0 ) if( NULL != pFish- pFish-pNext-pPrev = pFish-pPrev;pPrev )pPrev-pNext = pFish- if( pFish = m_pFishHeader ) m_pFishHeader = m_pFishHeader-
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1