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 这样我们才干监听到它们的碰 ...
随机推荐
- 利用Powershell和ceye.io实现Windows账户密码回传
利用Powershell和ceye.io实现Windows账户密码回传 转自:http://www.freebuf.com/articles/system/129068.html 最近在研究Power ...
- [xPlugin] smartupload jsp图片上传
URL:http://www.cnblogs.com/ISeeYouBlogs/p/jsp.html 1.要实现图片上传,首先需要一个组件,这里我用的是smartupload.jar可以到这里下载ht ...
- 给统计人讲Python(1)_科学计算库-Numpy
本地代码是.ipynb格式的转换到博客上很麻烦,这里展示部分代码,了解更多可以查看我的git-hub:https://github.com/Yangami/Python-for-Statisticia ...
- 修改 Mac 默认 PHP 运行环境
更新了自带php版本后,修改默认php环境变量 首先,创建 .bash_profile 文件 sudo nano ~/.bash_profile # 添加一行.注意 PHP5.4.10 修改成你正在运 ...
- 3.Ventuz Designer新建项目Demo
Ventuz Designer新建项目Demo 1.打开ventuz,点Recent Projects>New Project,在弹出的界面填写具体项目信息,如下图: 图1.1 图1.2 2.在 ...
- 修改ElementUI源码
1.克隆ElementUI官方仓库代码到本地 https://github.com/ElemeFE/element 2.在cmd命令行安装依赖 1)找到代码文件夹 cd element 2)npm ...
- apk回编译问题汇总(阶段)
反编译apk,在smali中注入一段自己的代码. 试了几个工具(apkdb.apktool.apkSign), 发现反编译都可以,但是回编译都不兼容java1.8,导致回编译成功,但apk没有签名,不 ...
- [ Linux ] [ OS ] [ memory ] Linux 如何查看系統硬體的記憶體(RAM)資訊
cat /proc/meminfo https://blog.longwin.com.tw/2013/05/linux-ram-memory-info-2013/
- class A<T> where T:new()相关知识点
来源:http://www.cnblogs.com/FredWang/p/4284251.html class A<T> where T:new() ===>>> ...
- 谈谈c++中继承中的虚函数
c++继承中的虚函数 c++是一种面向对象的编程语言的一个很明显的体现就是对继承机制的支持,c++中继承分很多种,按不同的分类有不同分类方法,比如可以按照基类的个数分为多继承和单继承,可以按照访问 ...