Cocos2d-x碰撞检測
假设不适用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碰撞检測的更多相关文章
- cocos2d-x ios游戏开发初认识(八) 触摸事件与碰撞检測
玩过植物大战僵尸都知道,要在草坪里放一朵向日葵或者其他的植物仅仅需触摸那个植物将其拖入到想要摆放的位置,这事实上就是这节要写的触摸事件.还能够发现当我们的僵尸出来的时候,我们的小豌豆会发子弹攻击僵尸, ...
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》第七步--物理碰撞检測(1)
说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
- 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检測
在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...
- Cocos2d-x 精灵碰撞检測(方法二)
将"Cocos2d-x 精灵碰撞检測(方法一)" update函数改动一下. 使用精灵boundingBox函数获取直接精灵边界框, 不用自己计算精灵矩形大小了,还比較精确,然后调 ...
- cocos2d-x 旅程開始--(实现瓦片地图中的碰撞检測)
转眼隔了一天了,昨天搞了整整一下午加一晚上,楞是没搞定小坦克跟砖头的碰撞检測,带着个问题睡觉甚是难受啊!还好今天弄成功了.只是感觉程序不怎么稳定啊.并且发现自己写的东西让我重写一遍的话我肯定写不出来. ...
- cocos2d-html5 碰撞检測的几种方法
游戏中的碰撞还是比較多的,比方角色与角色的碰撞,角色与墙壁的碰撞,角色与怪物的碰撞等,都须要 进行碰撞的检測,来触发一定的事件 近期在尝试制作一个小游戏的时候须要用到碰撞检測,然后就查了下资料,并在论 ...
- Unity3D入门(二):碰撞检測
碰撞器由来 1.系统默认会给每一个对象(GameObject)加入一个碰撞组件(ColliderComponent),一些背景对象则能够取消该组件. 2.在unity3d中,能检測碰撞发生的方式有两种 ...
- iOS 碰撞检測以及事件响应
*/ //碰撞检測 //碰撞检測de过程 //碰撞检測 //碰撞检測 //碰撞检測 //UIApplication-> UIWindow-> UIController-> 视图控制器 ...
- cocos2d-x游戏开发 跑酷(八) 对象管理 碰撞检測
对象管理类的原理是这种: ObjectManager类是一个单例类,全局仅仅有一个对象实例存在.初始化的时候创建两个数组CCArray来保存金币和岩石.为什么要保存,由于在地图重载的时候.要销毁看不见 ...
- Cocos2d-x3.0游戏实例之《别救我》第七篇——物理世界的碰撞检測
事实上我也非常吃惊-居然写到第七篇了,我估计也就是四篇的内容,感觉非常奇妙,我也不会非常唠叨什么吖); // 0001 ); // 0001 ); // 0001 这样我们才干监听到它们的碰 ...
随机推荐
- Floyed理解
Floyed理解 Floyd算法的本质是动态规划,其转移方程为:f(k,i,j) = min( f(k-1,i,j), f(k-1,i,k)+f(k-1,k,j) ). f(k-1,i,j)表示经过前 ...
- 对象设计解耦的方法IOC和DI
耦合关系不仅会出现在对象与对象之间,也会出现在软件系统的各模块之间,以及软件系统和硬件系统之间.如何降低系统之间.模块之间和对象之间的耦合度,是软件工程永远追求的目标之一.为了解决对象之间的耦合度过高 ...
- 2017-3-10 leetcode 229 238 268
今天登陆leetcode突然发现531被锁了,有种占了便宜的感觉哈哈哈! ================================================ leetcode229 Ma ...
- 南海区行政审批管理系统接口规范v0.3(规划) 3.业务办理API 3.1.businessAuditById【业务办理】
{"c_accept":"Q2015112400002","c_operators":"gz99","v_op ...
- 负载均衡获得真实源IP的6种方法
除了X-FORWARD-FOR,负载均衡中获得真实源IP的方法还有很多种. 本文抛砖引玉,主要介绍获得真实源IP的多种方法,而不是具体配置. 负载均衡获得真实IP的方法有很多种,将形成专题文章. 本文 ...
- Python基础:lambda 匿名函数
格式 lambda argument1, argument2,... argumentN : expression square = lambda x: x**2 print(square(2)) 与 ...
- python笔记:文件操作
1.逐行打印整个文件 # -*- coding: utf-8 -*- f = open("test",'r',encoding="utf-8") count = ...
- python里使用reduce()函数
reduce()函数在库functools里,如果要使用它,要从这个库里导入.reduce函数与map函数有不一样地方,map操作是并行操作,reduce函数是把多个参数合并的操作,也就是从多个条件简 ...
- VM虚拟机-Windows
前提:安装了vm虚拟机 一.下载win10原版镜像文件 一定要是原版,修改版的不能用. 推荐下载网址:http://www.xitongtiandi.net/win10yuanban/ 下载后放在D盘 ...
- BZOJ 4756 线段树合并(线段树)
思路: 1.最裸的线段树合并 2. 我们可以观察到子树求一个东西 那我们直接DFS序好了 入队的时候统计一下有多少比他大的 出的时候统计一下 减一下 搞定~ 线段树合并代码: //By SiriusR ...