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");
	}
}
时间: 2024-08-06 23:14:14

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

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

在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact(b2Contact* contact).两个物体開始接触时会响应,但仅仅调用一次. virtual void EndContact(b2Contact* contact).分离时响应. 但仅仅调用一次. virtual void PreSolve(b2Contact* contact, const

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

玩过植物大战僵尸都知道,要在草坪里放一朵向日葵或者其他的植物仅仅需触摸那个植物将其拖入到想要摆放的位置,这事实上就是这节要写的触摸事件.还能够发现当我们的僵尸出来的时候,我们的小豌豆会发子弹攻击僵尸,当子弹与僵尸碰撞的时候子弹自己主动消失,这就这节要说的碰撞检測. 以下详细看代码的实现: 做ios开发有触摸事件cocos2d相同也有 一.先覆写touch事件 .h文件 using namespace cocos2d; class MainScene:public CCLayer { privat

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

转眼隔了一天了,昨天搞了整整一下午加一晚上,楞是没搞定小坦克跟砖头的碰撞检測,带着个问题睡觉甚是难受啊!还好今天弄成功了.只是感觉程序不怎么稳定啊.并且发现自己写的东西让我重写一遍的话我肯定写不出来.还要继续学习啊! 上次的进度: 实现了坦克的移动,昨天把程序优化了一下,能整合在一起的就整合在一个函数里了.并且对碰到屏幕边缘的情况进行了检測.之前的代码都是部分代码,今天试试把代码整个贴上去. 这两天的进度: 打这么多汉字,自个都看不进去.直接上代码: /////////////////////实

iOS 碰撞检測以及事件响应

*/ //碰撞检測 //碰撞检測de过程 //碰撞检測 //碰撞检測 //碰撞检測 //UIApplication-> UIWindow-> UIController-> 视图控制器view-> 父视图 ->子视图 //事件响应 //事件响应de过程 //事件响应 //事件响应 //事件响应 //反方向处理;UIApplication <- UIWindow <- UIController <- 视图控制器view <- 父视图 <- 子视图;

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

将"Cocos2d-x 精灵碰撞检測(方法一)" update函数改动一下. 使用精灵boundingBox函数获取直接精灵边界框, 不用自己计算精灵矩形大小了,还比較精确,然后调用intersectsRect计算2个精灵矩形是否存在交集. 代码: void HelloWorld::update(float delta) { //返回精灵边界框 CCRect cr1 = sp1->boundingBox(); CCRect cr2 = sp2->boundingBox();

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

事实上我也非常吃惊-居然写到第七篇了,我估计也就是四篇的内容,感觉非常奇妙,我也不会非常唠叨什么吖(小若:32个喷! ),怎么都到第七篇了. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www.benmutou.com/blog/archives/920 文章来源:笨木头与游戏开发 碰撞监听 首先,确保我们创建物理对象的时候,给对象设置了碰撞条件(假设你是一步步按着教程来写的代码,那就是设置好了): body->setCategoryBitmask(1);  

Unity3D入门(二):碰撞检測

碰撞器由来 1.系统默认会给每一个对象(GameObject)加入?一个碰撞组件(ColliderComponent),一些背景对象则能够取消该组件. 2.在unity3d中,能检測碰撞发生的方式有两种,一种是利用碰撞器,还有一种则是利用触发器.这两种方式的应用很广泛.为了完整的了解这两种方式,我们必须理解下面概念: (一)碰撞器是一群组件,它包括了非常多种类,比方:Box Collider,Capsule Collider等,这些碰撞器应用的场合不同,但都必须加到GameObjecet身上.(

Cocos2d-x 3.0中 物理碰撞检測中onContactBegin回调函数不响应问题

好吧,事实上这篇也是暂时冒出来的,近期朋友要做个物理游戏,曾经做物理还是用box2d,呃.确实要花些功夫才干搞懂当中的精髓,可是听讲这套引擎又一次封装了一次.要easy非常多,所以就简单尝试了一下,感觉确实要简单不少,只是在这当中还是遇到了些问题,首先就来说说onContactBegin这个回调函数响应问题. 先说说情况.简单做了一个打砖块的游戏.前面一切都非常顺利,仅仅是做到碰撞检測的时候,发现回调函数弄死都不调用.開始我以为函数写错了,后来查了api.testCpp都没有错,在3.0的api

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

游戏中的碰撞还是比較多的,比方角色与角色的碰撞,角色与墙壁的碰撞,角色与怪物的碰撞等,都须要 进行碰撞的检測,来触发一定的事件 近期在尝试制作一个小游戏的时候须要用到碰撞检測,然后就查了下资料,并在论坛进行提问等算是找到了比較惬意的碰撞检測方法,这里记录下来 如今自己知道的方法算是有了三种了,以下一一记录并分析下他们各自的优缺点 1.就是官方提供的,依据getBoundingBox();方法获取要检測的碰撞物体的范围,然后再依据rectIntersectsRect();方法进行推断须要检測的两个