zoukankan      html  css  js  c++  java
  • 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;

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

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

  • 相关阅读:
    自定义类型转换器之TypeConverter
    python测试工具nosetests
    算法练习之相同的树,对称二叉树
    算法练习之x的平方根,爬楼梯,删除排序链表中的重复元素, 合并两个有序数组
    算法练习之报数, 最大子序和,最后一个单词的长度,加一,二进制求和
    java.sql.SQLException: Zero date value prohibited
    java打包小记
    修改jar的.class文件,并重新打包
    算法练习之合并两个有序链表, 删除排序数组中的重复项,移除元素,实现strStr(),搜索插入位置,无重复字符的最长子串
    解决GitHub访问速度慢的问题
  • 原文地址:https://www.cnblogs.com/new0801/p/6177203.html
Copyright © 2011-2022 走看看