cocos2d-x游戏开发系列教程-超级玛丽10-怪物与马里奥冲突检测

在超级玛丽游戏中,马里奥在移动,怪物也在移动,当他们遇见时,需要判断是马里奥身亡还是怪物身亡。

这个判断的代码在怪物类的检测函数实现中。

比如蘑菇怪的冲突检测函数:

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 (m_pMario->boundingBox().intersectsRect(boundingBox()))这句代码判断冲突,如果马里奥的矩形范围和蘑菇怪的矩形范围有交集,那么说明他们相遇了。

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;

总结:冲突检测在物体的冲突检测函数里实现,主要判断马里奥和物体的矩形是否有重合,如果有说明是接触了。

根据不同的物体,做响应的处理,比如马里奥跳起与砖头的接触,则和蘑菇怪的处理不同,要稍微复杂些,因为需要停掉跳跃动作

你可能感兴趣的:(cocos2d-x游戏开发系列教程-超级玛丽10-怪物与马里奥冲突检测)