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,一个是马里奥对象,我们分两个文章来介绍这两个知识。