Zombie* LigneSol::detect_first_on_right(const int x) { /* * Permet de connaitre la position du premier zombie à droite d'une position précisée, s'il n'est pas dieu. * Etre dieu pour un zombie correspond à ne pas se faire tirer à "vue" (même si en soit elles ne voient rien!). */ bool shoot = false; if(zombies.size()!=0) { Zombie* min = zombies.back(); std::list<Zombie*>::iterator itz; for(itz = zombies.begin() ; itz != zombies.end() ; ++itz) if(!(*itz)->isLikeGod()) { if(x < (*itz)->getx() < min->getx()) //if((*itz)->getx() ) { shoot = true; min=*itz; } } if(shoot) return min; } return 0; }
/*! Recherche du zombie le plus proche. @return Le zombie lep lus proche (Zombie*) */ Zombie* LigneSol::detect_first() { if(zombies.size()!=0) { Zombie* first = zombies.back(); std::list<Zombie*>::iterator it; for(it=zombies.begin();it!=zombies.end();++it) if((*it)->getx() < first->getx()) first=*it; return first; } return 0; }
void CollisionManager::perform_bullet_hit(vector<Zombie*> zombies, vector<Projectile*> bullets) { vector<Zombie*>::iterator zombie_it; vector<Projectile*>::iterator bullets_it; bool hit = false; for (zombie_it = zombies.begin(); zombie_it != zombies.end(); zombie_it++) { Zombie* zombie = (*zombie_it); if (!zombie->getcollisionable()) { continue; } if (!zombie->getrevealed() || zombie->gethidden()) { continue; } // check collision for each bullet for (bullets_it = bullets.begin(); bullets_it != bullets.end(); bullets_it++) { Projectile* bullet = (*bullets_it); if ((bullet->getx() >= (zombie->getx() - MAX_DISTANCE_FOR_COLLISION)) && (bullet->gety() >= (zombie->gety() - MAX_DISTANCE_FOR_COLLISION)) && (bullet->gety() <= (zombie->gety() + zombie->getsurface()->h)) && (bullet->getx() <= (zombie->getx() + zombie->getsurface()->w))) { int bullet_min_x = bullet->getx(); int bullet_min_y = bullet->gety(); int bullet_max_x = bullet->getx() + bullet->getwidth(); int bullet_max_y = bullet->gety() + bullet->getheight(); int zombie_min_x = zombie->getx(); int zombie_min_y = zombie->gety(); int zombie_max_x = zombie->getx() + zombie->getsurface()->w; int zombie_max_y = zombie->gety() + zombie->getsurface()->h; if ((bullet_min_x > zombie_min_x) && (bullet_max_x < zombie_max_x) && (bullet_min_y > zombie_min_y) && (bullet_max_y < zombie_max_y)) { hit = true; } } if (hit) { // remove the bullet if (zombie->getrevealed() && !zombie->gethidden()) { zombie->setdamage(bullet->getdamage()); if (zombie->gethealth() <= 0) { GarbageCollector::add_deletion_queue(zombie); } GarbageCollector::add_deletion_queue(bullet); } hit = false; } } zombie = 0; } }