Cocos2d-x碰撞检测

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

      

<1>碰撞检测的代码较为繁琐,恕我无法为你详细列出其思路可以是在update中遍历所有的sprite,
然后判断每个sprite和其他sprite(还需遍历一遍,刨除自己)是否碰撞。这样等于判断次数是sprite的数量的平方,效率很低。
所以你需要优化一下,比如将“其他sprite(还需遍历一遍)”这个逻辑改成“附近的sprite。
两个sprite的碰撞检测就很简单了,如果仅仅是矩形判断,很多教程都会有。

<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属性,就可以容易找到精灵,从而尽量用局部变量。
	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碰撞检测)