cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap(六)-马里奥跳跃

当w键按下时,马里奥执行跳跃动作


执行跳跃动作也是在MarioMove函数中调用的

实际的跳跃则调用了mario对象的OnCtrlJump函数,来看看OnCtrlJump函数吧

void CMMario::OnCtrlJump()
{
	//根据马里奥当前状态 来处理
	switch(m_eCurMarioStatus)
	{
	case enMarioStatusStandLeft:	//待机 和 跑动 时 马里奥允许跳跃
	case enMarioStatusStandRight:
	case enMarioStatusRunLeft:	
	case enMarioStatusRunRight:	
		{
			//播放跳跃动画
			switch(m_eCurMarioLevel)
			{
			case enMarioLevelSmall:
				{
					m_pCcbReader->getAnimationManager()->runAnimationsForSequenceNamed(_CCB_MARIO_SMALL_JUMP_);
				}break;
			case enMarioLevelBig:
				{
					m_pCcbReader->getAnimationManager()->runAnimationsForSequenceNamed(_CCB_MARIO_BIG_JUMP_);
				}break;
			case enMarioLevelMax:
				{
					m_pCcbReader->getAnimationManager()->runAnimationsForSequenceNamed(_CCB_MARIO_MAX_JUMP_);
				}break;
			}

			if(getActionByTag(enTagOfActionJump)==NULL)
			{
				//强制瞬间离地
				setPositionY(getPositionY()+10.f);
				//增加跳跃运动
				CCJumpTo *pJump = CCJumpTo::create(_MARIO_BASIC_JUMP_TIME_,ccp(getPositionX(),getPositionY()-10.f),_MARIO_BASIC_JUMP_HEIGHT_,1);
				if(pJump==NULL)
				{
					CCAssert(false,"Can't Create Jump!");
					return;
				}
				//为Jump设置独立的Tag
				pJump->setTag(enTagOfActionJump);
				runAction(pJump);

				m_fMarioJumpMaxHeight = -100.f;
			}
			//将Mario状态设置为悬空
			SetMarioStatus(m_bFaceToRight?enMarioStatusOnAirRight:enMarioStatusOnAirLeft);
			
		}break;
	}
}

在代码中可以看到,如果马里奥已经在空中,就不能再跳跃了,只有在马里奥站立和行走时候可以跳跃。

当可以跳跃时,首先让马里奥对象播放跳跃动画,这个动画指马里奥本身的变化,比如马里奥的胳膊和腿,并不是马里奥跳跃的动作

跳跃的动作是pJump这个Action。


在runAction之前,先判断了这个action是否存在,如果这个action存在,则不需要再执行action了,这个也有避免连续两次跳跃的意思

和之前的状态判断差不多,去掉这个判断也是可以的,但是这样判断鲁棒性更好些吧。


最后根据马里奥的方向,设置马里奥的状态。


这里涉及新的知识点了,一个是执行动作runAction,一个是马里奥对象,我们分两个文章来介绍这两个知识。


原文地址:https://www.cnblogs.com/new0801/p/6177208.html