예제 #1
0
파일: LigneSol.cpp 프로젝트: Olwaro/TP_PvZ
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;
}
예제 #2
0
파일: LigneSol.cpp 프로젝트: Olwaro/TP_PvZ
/*!
	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;
}
예제 #3
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;
    }
}