【cocos2d-x入门实战】微信飞机大战之九:碰撞检测
转载请表明地址:http://blog.csdn.net/jackystudio/article/details/11917875
碰撞检测是整个游戏的重头戏,没有它,子弹和敌机只能是路人。。。虽然很重要,但实现起来确是很简单。
每个从CCObject继承的类都包含了一个update函数,它是一个内联虚函数,执行频率为每帧调用一次。
原型:
CCArray* bulletsToDelete=CCArray::create();//创建一个CCArray,用以存放待删除的子弹,也就是此帧中被检测到碰撞的子弹bulletsToDelete->retain();//必须调用retain,CCArray内部调用了autoReleaseCCObject* bt,*et;//enemy3 & bullet CheckCollosionCCARRAY_FOREACH(this->bulletLayer->m_pAllBullet,bt)//遍历所有子弹{CCSprite* bullet=(CCSprite*)bt;CCArray* enemy3sToDelete=CCArray::create();//创建一个CCArray,用以存放待删除的敌机,也就是此子弹击中的敌机enemy3sToDelete->retain();//调用retainCCARRAY_FOREACH(this->enemy3Layer->m_pAllEnemy3,et)//遍历所有敌机{Enemy3Sprite* enemy3=(Enemy3Sprite*)et;if (CCRect::CCRectIntersectsRect(bullet->boundingBox(),enemy3->boundingBox()))//检测碰撞,即矩形区域是否相交{//如果life>1,移除bulletif (enemy3->life>1)//因为Enemy3设置了生命值为5{enemy3->life--;bulletsToDelete->addObject(bullet);//把待删除子弹放入CCArray}//如果life==1,移除enemy3else if(enemy3->life==1)//只剩一条命的时候,再碰撞就挂掉了{enemy3->life--;bulletsToDelete->addObject(bullet);//把待删除子弹放入CCArrayenemy3sToDelete->addObject(enemy3);//把待删除敌机放入CCArray}//此时处在敌机爆炸动画阶段,敌机未消失,子弹还有打到的机会,所以不进行检测else ;}}CCARRAY_FOREACH(enemy3sToDelete,et)//遍历所有此帧中碰撞死亡的敌机,必须是死亡{Enemy3Sprite* enemy3=(Enemy3Sprite*)et;this->enemy3Layer->enemy3Blowup(enemy3);//执行爆炸}enemy3sToDelete->release();//release}CCARRAY_FOREACH(bulletsToDelete,bt)//遍历所有此帧中碰撞的子弹{CCSprite* bullet=(CCSprite*)bt;this->bulletLayer->RemoveBullet(bullet);//执行移除}bulletsToDelete->release();//release
不过要注意的是,实际游戏如果只是简单的检测矩形区域,那么可能会出现子弹从敌机身边掠过,而敌机却挂了的情况,这不科学啊!这是因为敌机两侧的透明区域过大了,碰撞检测的是整个PNG图的大小,不知道这个图上哪些点有代表着飞机。
所以要根据游戏的实际情况来调整精灵矩形区域的大小以达到较好的游戏体验。