假设不适用Box2D物理引擎。那么要进行Cocos2d-x的碰撞检測那我们的方法往往就是进行“矩形和点”、“矩形和矩形”这样粗略的碰撞检測。我们一般採取开启scheduleUpdate定时器。然后重写update函数进行每一帧都进行碰撞检測。

<1>碰撞检測的代码较为繁琐。恕我无法为你具体列出其思路能够是在update中遍历全部的sprite,
然后推断每一个sprite和其它sprite(还需遍历一遍。刨除自己)是否碰撞。 这样等于推断次数是sprite的数量的平方,效率非常低。 所以你须要优化一下,比方将“其它sprite(还需遍历一遍)”这个逻辑改成“附近的sprite。
两个sprite的碰撞检測就非常easy了,假设不过矩形推断,非常多教程都会有。 <2>捕鱼达人人家写的碰撞检測。
bool GameScene::checkOutCollisionBetweenFishesAndBullet()
{
Weapon* weapon = _cannonLayer->getWeapon();
CCPoint bulletCollision = weapon->getCollisionPoint();
CCArray* fishes = _fishLayer->getFishes();
CCObject* iterator;
CCARRAY_FOREACH(fishes, iterator){
Fish* fish = (Fish*)iterator;
//isRunnning推断fish是否已经在屏幕上显示
if(fish->isRunning()){
CCRect fishCollisionArea = fish->getCollisionArea();
bool isCollision = fishCollisionArea.containsPoint(bulletCollision);
if(isCollision){
weapon->end();
return true;
}
}
}
return false;
} <3>小强写的碰撞检測。“矩形和点的碰撞检測”
void GameLayer::shoot_callback(CCObject* pSender)
{
CCLog("shoot_callback");
CCObject* obj = NULL;
CCARRAY_FOREACH(enemyManager->getEnemyArray(),obj)
{
Enemy* enemy = (Enemy*)obj;
CCPoint aimPoint = getChildByTag(100)->getPosition();
if(enemy->boundingBox().containsPoint(aimPoint)) //矩形碰撞检測。boundingBox()这个函数返回容纳这个精灵的矩形。从而结合
{
enemy->setHpBar(((Hero*)getChildByTag(101))->damage);
return;
}
}
} <4>简单的“矩形与矩形的碰撞检測”。
bool Rectbong::init()
{
if(!CCLayer::init()) return false;
CCSize mysize = CCDirector::sharedDirector()->getWinSize(); CCSprite* sp1 = CCSprite::create("A.png");
sp1->setPosition(ccp(100, mysize.height/2));
this->addChild(sp1, 0,1); //精灵名字,Z 轴位置,Tag值 CCSprite* sp2 = CCSprite::create("B.png");
sp2->setPosition(ccp(mysize.width-300, mysize.height/2)); this->addChild(sp2, 0,2); //在做个显示
CCLabelTTF * ttf=CCLabelTTF::create("none","Arial",20);
ttf->setPosition(ccp(mysize.width/2,mysize.height-50));
this->addChild(ttf,0,3); //做个移动
sp1->runAction(CCMoveTo::create(5,ccp(mysize.width-190,mysize.height/2))); //开启更新(在每一帧都会调用update方法,来检測是否碰撞)
scheduleUpdate();
return true;
} void Rectbong::update(float dt)
{
CCSprite * sp1=(CCSprite *)this->getChildByTag(1); //通过getChildByTag(...)获取精灵,我感觉比較好用。而不是每次把精灵当做数据成员来用。 CCSprite * sp2=(CCSprite *)this->getChildByTag(2); //这样在addChild(...)时,只须要设置下setTag属性,就能够easy找到精灵,从而尽量用局部变量。
CCLabelTTF * ttf=(CCLabelTTF *)this->getChildByTag(3); // CCRect rect1 = sp1->boundingBox();
CCRect rect2 = sp2->boundingBox();
if(rect1.intersectsRect(rect2)) //矩形碰撞检測。boundingBox()这个函数返回容纳这个精灵的矩形。从而结合intersectsRect进行矩形碰撞检測。
{ //我认为当两个物体接近矩形时利用矩形碰撞检測更合适。
ttf->setString("bong!!!!");
}else
{
ttf->setString("none");
}
}

Cocos2d-x碰撞检測的更多相关文章

  1. cocos2d-x ios游戏开发初认识(八) 触摸事件与碰撞检測

    玩过植物大战僵尸都知道,要在草坪里放一朵向日葵或者其他的植物仅仅需触摸那个植物将其拖入到想要摆放的位置,这事实上就是这节要写的触摸事件.还能够发现当我们的僵尸出来的时候,我们的小豌豆会发子弹攻击僵尸, ...

  2. cocos2d-x 3.0游戏实例学习笔记 《跑酷》第七步--物理碰撞检測(1)

    说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  3. 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检測

    在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...

  4. Cocos2d-x 精灵碰撞检測(方法二)

    将"Cocos2d-x 精灵碰撞检測(方法一)" update函数改动一下. 使用精灵boundingBox函数获取直接精灵边界框, 不用自己计算精灵矩形大小了,还比較精确,然后调 ...

  5. cocos2d-x 旅程開始--(实现瓦片地图中的碰撞检測)

    转眼隔了一天了,昨天搞了整整一下午加一晚上,楞是没搞定小坦克跟砖头的碰撞检測,带着个问题睡觉甚是难受啊!还好今天弄成功了.只是感觉程序不怎么稳定啊.并且发现自己写的东西让我重写一遍的话我肯定写不出来. ...

  6. cocos2d-html5 碰撞检測的几种方法

    游戏中的碰撞还是比較多的,比方角色与角色的碰撞,角色与墙壁的碰撞,角色与怪物的碰撞等,都须要 进行碰撞的检測,来触发一定的事件 近期在尝试制作一个小游戏的时候须要用到碰撞检測,然后就查了下资料,并在论 ...

  7. Unity3D入门(二):碰撞检測

    碰撞器由来 1.系统默认会给每一个对象(GameObject)加入一个碰撞组件(ColliderComponent),一些背景对象则能够取消该组件. 2.在unity3d中,能检測碰撞发生的方式有两种 ...

  8. iOS 碰撞检測以及事件响应

    */ //碰撞检測 //碰撞检測de过程 //碰撞检測 //碰撞检測 //碰撞检測 //UIApplication-> UIWindow-> UIController-> 视图控制器 ...

  9. cocos2d-x游戏开发 跑酷(八) 对象管理 碰撞检測

    对象管理类的原理是这种: ObjectManager类是一个单例类,全局仅仅有一个对象实例存在.初始化的时候创建两个数组CCArray来保存金币和岩石.为什么要保存,由于在地图重载的时候.要销毁看不见 ...

  10. Cocos2d-x3.0游戏实例之《别救我》第七篇——物理世界的碰撞检測

    事实上我也非常吃惊-居然写到第七篇了,我估计也就是四篇的内容,感觉非常奇妙,我也不会非常唠叨什么吖);    // 0001 );   // 0001 ); // 0001 这样我们才干监听到它们的碰 ...

随机推荐

  1. SharePoint创建一个简单的Visio Web部件图

    SharePoint创建一个简单的Visio Web部件图 Visio有很多强大的Mash-up混聚功能,使它能够轻松集成到SharePoint 2010中. 1. 打开Visio 2010,创建新的 ...

  2. luogu1965 转圈游戏

    题目大意 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置,--,依此 ...

  3. php中全局变量global和超全局变量$GLOBALS

    php中全局变量global和超全局变量$GLOBALS 1.global Global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require ...

  4. hdoj--1045--Fire Net(二分图)

    Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  5. 【BZOJ 2351】 Matrix

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2351 [算法] 哈希 [代码] #include<bits/stdc++.h& ...

  6. hihoCoder-1839 榶榶榶 数学

    题面 题意:给你一个500000长度的数字,然后环形的让每位做头,例如123,就有123,231,312三个,然后问这n个数字的和S,S的最小非1因子是多少 题解:每个数字在每个位置都会有一次,如果说 ...

  7. Aspose.Words将Word模板打印出来

    利用Aspose.Words将制作好的模板,输出出来自己所需的文件 /// <summary> /// 打印信息和列表 /// </summary> /// <param ...

  8. Kettle 版本及使用问题

    kettle 简介 Kettle也叫PDI (Pentaho Data Intergration) Kettle 版本及下载 7.1及更早版本: https://sourceforge.net/pro ...

  9. Ajax+Struts做登录判断

    Action类里: /* * 登录 */ public ActionForward doLogin(ActionMapping mapping,ActionForm form,HttpServletR ...

  10. GEF入门笔记

    最近项目中需要用到Eclipse GEF框架进行画图,故将平时学习笔记更新到博客中,便于查阅 自己画的一个GEF基本结构     最基本流程 1.创建model(包括数据域.在界面中的布局.图片索引等 ...