一段碰撞检测代码

来源:互联网 发布:unity3d 烘焙 编辑:程序博客网 时间:2024/06/05 02:02
void GameScene::checkOutCollisionBetweenEnemiesAndBullet(){    Weapon* weapon = _cannonLayer->getWeapon();    CCArray* bullets = weapon->getBullets();    CCArray* enemies = _enemyLayer->getEnemies();        CCArray* bulletDelete = CCArray::create();    CCArray* enemyDelete = CCArray::create();        CCObject* iter;    CCARRAY_FOREACH(bullets, iter){        Bullet* bullet = (Bullet*)(iter);                CCObject* iterator;        CCARRAY_FOREACH(enemies, iterator){            EnemyBase* enemy = (EnemyBase*)(iterator);            //isRunnning判断fish是否已经在屏幕上显示            if(enemy->isRunning()){                CCRect fishCollisionArea = enemy->getCollisionArea();                //子弹的位置是否在碰撞区域中                if (bullet->isRunning()) {                    bool isCollision = fishCollisionArea.intersectsRect(bullet->getCollisionArea());                    if(isCollision){                        bulletDelete->addObject(bullet);                        enemyDelete->addObject(enemy);                    }                }            }        }        CCObject* it = NULL;        CCARRAY_FOREACH(enemyDelete, it)        {            EnemyBase *target = (EnemyBase*)(it);            target->getHurt(bullet->demage);            if (target->currentHP<=0 ) {                enemies->removeObject(target);                target->unscheduleUpdate();                target->beCaught();            }                    }        }            CCObject* it = NULL;    CCARRAY_FOREACH(bulletDelete, it)    {        Bullet *target = (Bullet*)(it);        bullets->removeObject(target);        target->unscheduleUpdate();        target->end();    }}

总结:

A,其实,代码也挺平凡的,但是里面有几处需要自己去学习,比如,不在数组中直接删除,而是创建一个数组的引用,然后通过该引用把数组元素给删除掉.这点细节东西值得自己学习.

假如B是需要被删除的对象,A存储的是数据,那么遍历B数组,并且依次从A数组删除B数组的内容,无疑是正确的.

B,利用isRunning来判断精灵是否在显示范围内,如果不在,就删除掉.


0 0
原创粉丝点击