• 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;

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

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

  • 相关阅读:
    APIO dispatching
    奶牛抗议
    擦弹
    逃跑
    [Hnoi2016]网络
    [Ahoi2005]LANE 航线规划
    素数密度_NOI导刊2011提高(04)
    P2939 [USACO09FEB]改造路Revamping Trails(分层图最短路)
    洛谷P3396 哈希冲突(分块)
    洛谷P4332 [SHOI2014]三叉神经树(LCT)
  • 原文地址:https://www.cnblogs.com/new0801/p/6177203.html
Copyright © 2020-2023  润新知