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

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

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

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-怪物与马里奥冲突检测的更多相关文章

  1. cocos2d-x游戏开发系列教程-超级玛丽09-怪物激活与移动

    在游戏中,很多怪物本身是会移动的,这里主要有蘑菇怪,乌龟等. 说起怪物的移动,首先在游戏里先要考虑怪物的抽象和设计. 在CMMonster.h中,有个类CMMonsterBasic,这个类抽象了所有的 ...

  2. cocos2d-x游戏开发系列教程-超级玛丽01-前言

    前言 上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实现,并以一些篇幅来详细讲述遇到的具体问题和具体的 ...

  3. cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap

    背景 在上一篇博客中,我们提到CMGameScene,但是CMGameScene只是个框架,实际担任游戏逻辑的是CMGameMap类,这个博文就来了解下CMGameMap 头文件 class CMGa ...

  4. cocos2d-x游戏开发系列教程-超级玛丽06-CMGameScene

    背景 在CMMenuScene中,当用户点击开始游戏时,导演让场景进入到CMGameScene 头文件 class CMGameScene : public cocos2d::CCLayer,publ ...

  5. cocos2d-x游戏开发系列教程-超级玛丽08-消息机制

    在超级玛丽游戏里,地图类CMGameMap负责所有的程序逻辑,它包含了背景地图,包含了游戏元素精灵,当游戏中的精灵之间发生碰撞时,比如马里奥撞上砖头这种事情发生时,马里奥对象本身不知道怎么处理这个逻辑 ...

  6. cocos2d-x游戏开发系列教程-超级玛丽05-CMMenuScene

    代码下载链接 http://download.csdn.net/detail/yincheng01/6864893 解压密码:c.itcast.cn 背景 上一篇博文提到appDelegate,在该类 ...

  7. cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap(六)-马里奥跳跃

    当w键按下时,马里奥执行跳跃动作 执行跳跃动作也是在MarioMove函数中调用的

  8. cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap(五)-地图卷动

    马里奥在平移的过程中,涉及到地图的卷动问题. 在这个游戏里,地图比窗口大,窗口只是显示了地图的一部分,因此马里奥在移动的时候,移动到一定位置之后要卷动地图,否则马里奥移动到窗口右边之后......那结 ...

  9. cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap(三)-按键处理

    在地图初始化好了之后,就开始移动马里奥吧,我在windows下,是使用键盘来移动马里奥的 w是跳,d是前进,a是后退,那么在程序里是怎么来获取这个按键的呢? 普通的windows程序,在按键之后,会有 ...

随机推荐

  1. 180行ruby代码搞定游戏2048

    最今在玩2048这款小游戏,游戏逻辑简单,很适合我这样的对于游戏新入行的人来实现逻辑.于是选择了最拿手的ruby语言来实现这款小游戏的主要逻辑.还是挺简单的,加起来4小时左右搞定. 上代码: requ ...

  2. 七日筑基——C#第二天

    上一次讲到了变量,变量这个东西可以说是编程的基础,主要的作用就是用来存放数据,就跟做菜一样的,不同的菜要放在不同类型的容器中,那么不同的数据也需要存放在不同类型的变量里.先放张饭菜的图给大家看看,增加 ...

  3. Linux字符界面和图形界面

    Ubuntu图形界面和字符界面的切换 Ubuntu和其他的Linux系统一样,有图形界面和字符界面,同时能够设置默认的启动界面. linux的显示界面分为命令行的字符界面和图形界面,我们可以设置lin ...

  4. javascript 绝对路径工具类

    // #region 取虚拟目录示例代码 //获取网站虚拟目录名称 function GetVirtualDirectoryName() { var pathname = removeFirstSla ...

  5. C#读取网页

    public bool getweb(string strURL,out string buf) { buf=""; try { //Uri url=new Uri(strURL, ...

  6. java.lang.ClassCastException: oracle.sql.TIMESTAMP cannot be cast to java.sql.Timestamp

    http://stackoverflow.com/questions/13269564/java-lang-classcastexception-oracle-sql-timestamp-cannot ...

  7. PC游戏编程(入门篇)(前言写的很不错)

    PC游戏编程(入门篇) 第一章 基石 1. 1 BOSS登场--GAF简介 第二章 2D图形程式初体验 2.l 饮水思源--第一个"游戏"程式 2.2 知其所以然一一2D图形学基础 ...

  8. elaserch 查看节点是否是master

    http://192.168.32.81:9200/_cat/nodes 192.168.32.81 192.168.32.81 3 21 0.00 d * node02 192.168.32.80 ...

  9. 17.1.2.1 Advantages and Disadvantages of Statement-Based and Row-Based Replication

    17.1.2.1 Advantages and Disadvantages of Statement-Based and Row-Based Replication 基于语句和基于行复制的优点和缺点: ...

  10. HDU 1544 Palindromes(回文子串)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1544 问题分析: 问题要求求出字符串的连续子串中的回文子串个数.首先,需要区分连续子串与子序列的区别. ...