在超级玛丽游戏中,马里奥在移动,怪物也在移动,当他们遇见时,需要判断是马里奥身亡还是怪物身亡。
这个判断的代码在怪物类的检测函数实现中。
比如蘑菇怪的冲突检测函数:
bool CMMonsterMushrooms::OnCollisionMario() { do { CCNode* pMushrooms = dynamic_cast<CCNode*>(getChildByTag(enTagMainNode)); CC_BREAK_IF(pMushrooms==NULL); //马里奥与蘑菇怪的碰撞 if (m_pMario->boundingBox().intersectsRect(boundingBox())) { //被踩死 if (getPositionY()<m_pMario->getPositionY() && abs(m_pMario->getPositionY()-getPositionY())>boundingBox().size.height*0.8) { //移除行走动画 removeChildByTag(enTagMainNode); //ccbi读取 //构造一个ccbi文件读取器 CCNodeLoaderLibrary * ccNodeLoaderLibrary = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary(); cocos2d::extension::CCBReader * pCcbReader = new cocos2d::extension::CCBReader(ccNodeLoaderLibrary); //读取动画文件 CCNode *pCcbiNode = pCcbReader->readNodeGraphFromFile("ccbResources/monster.ccbi", this); CC_BREAK_IF(pCcbiNode==NULL); pCcbReader->getAnimationManager()->setAnimationCompletedCallback(this,callfunc_selector(CMMonsterMushrooms::OnCallDeadAnimationFinished)); pCcbReader->getAnimationManager()->runAnimationsForSequenceNamed("mushroom_die"); //读完之后,立刻释放即可 pCcbReader->release(); CC_BREAK_IF(pCcbiNode==NULL); addChild(pCcbiNode,enZOrderBack,enTagMainNode); pCcbiNode->setPosition(ccp(8,8)); m_bIsTouched = true; return true; } else { TCmd_Remove_Monster* pData = new TCmd_Remove_Monster; pData->pMonster = this; SendMsg(enMsgBeHurt,pData,sizeof(pData)); return false; } } return false; } while (false); CCLog("fun CMMonsterMushrooms::OnCollisionMario Error!"); return false; }
if (getPositionY()<m_pMario->getPositionY() && abs(m_pMario->getPositionY()-getPositionY())>boundingBox().size.height*0.8)
getPositionY()<m_pMario->getPositionY(),表示怪物的Y轴比马里奥的Y轴要小,要小的意思是马里奥在上面,怪物在下面,那么怪物被踩死了。
abs(m_pMario->getPositionY()-getPositionY())>boundingBox().size.height*0.8这句代码的判断是,马里奥必须在怪物身体的80%高度以上才算把对方踩死
接下来的代码表示要将蘑菇怪杀死:杀死的就是播放蘑菇怪死掉的动画,播放完了之后,再发送自杀的信息给地图即可
//移除行走动画 removeChildByTag(enTagMainNode); //ccbi读取 //构造一个ccbi文件读取器 CCNodeLoaderLibrary * ccNodeLoaderLibrary = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary(); cocos2d::extension::CCBReader * pCcbReader = new cocos2d::extension::CCBReader(ccNodeLoaderLibrary); //读取动画文件 CCNode *pCcbiNode = pCcbReader->readNodeGraphFromFile("ccbResources/monster.ccbi", this); CC_BREAK_IF(pCcbiNode==NULL); pCcbReader->getAnimationManager()->setAnimationCompletedCallback(this,callfunc_selector(CMMonsterMushrooms::OnCallDeadAnimationFinished)); pCcbReader->getAnimationManager()->runAnimationsForSequenceNamed("mushroom_die"); //读完之后,立刻释放即可 pCcbReader->release(); CC_BREAK_IF(pCcbiNode==NULL); addChild(pCcbiNode,enZOrderBack,enTagMainNode); pCcbiNode->setPosition(ccp(8,8)); m_bIsTouched = true; return true;
根据不同的物体,做响应的处理,比如马里奥跳起与砖头的接触,则和蘑菇怪的处理不同,要稍微复杂些,因为需要停掉跳跃动作