读书人

【cocos2d-x入门实战】微信飞机大战之

发布时间: 2013-09-24 11:29:02 作者: rapoo

【cocos2d-x入门实战】微信飞机大战之九:碰撞检测

转载请表明地址:http://blog.csdn.net/jackystudio/article/details/11917875

碰撞检测是整个游戏的重头戏,没有它,子弹和敌机只能是路人。。。虽然很重要,但实现起来确是很简单。


1.update函数

每个从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图的大小,不知道这个图上哪些点有代表着飞机。

所以要根据游戏的实际情况来调整精灵矩形区域的大小以达到较好的游戏体验。

5楼lxq_20124分钟前
^^,解析好详细,感谢博主!每天都来支持你,顺便学习!
Re: jackyvincefu3分钟前
回复lxq_2012n谢谢支持,我尽量会每天进行更新的!
4楼u01221555749分钟前
阳痿早泄加群161024614
3楼lxq_201254分钟前
^^,解析好详细,感谢博主!每天都来支持你,顺便学习!
2楼u01221555753分钟前
阳痿早泄加群:161024614
1楼u0119604022小时前
嗯,不错
Re: jackyvincefu2小时前
回复u011960402n谢谢支持!

读书人网 >操作系统

热点推荐