#include "Persos_Gest.h" #include "../Control/IA/Brute.h" #include "../Control/IA/Follower.h" #include "../Control/IA/Sniper.h" Persos_Gest::Persos_Gest() :m_nextWave( 1 ), m_loading( true ), m_lastWon( SDL_GetTicks() ) { //ctor } Persos_Gest::~Persos_Gest() { std::cout << "Vous êtes allés juqu'à la vague : " << m_nextWave-1 << std::endl; // Destruction des alliés while ( !m_allies.empty() ) { delete m_allies.back(); m_allies.pop_back(); } // Destruction des ennemis while ( !m_foes.empty() ) { delete m_foes.back(); m_foes.pop_back(); } } void Persos_Gest::allDisplay(const Vec &lookAt, SDL_Surface* screen) const { for (unsigned int i(0); i < m_allies.size(); i++) m_allies[i]->afficher(lookAt, screen); for (unsigned int i(0); i < m_foes.size(); i++) m_foes[i]->afficher(lookAt, screen); } void Persos_Gest::allMove() const { for (unsigned int i(0); i < m_allies.size(); i++) m_allies[i]->bouger(); for (unsigned int i(0); i < m_foes.size(); i++) m_foes[i]->bouger(); } void Persos_Gest::addAllie(Perso* newPerso) { m_allies.push_back(newPerso); } void Persos_Gest::addFoe(Perso* newFoe) { m_foes.push_back(newFoe); } Uint16 Persos_Gest::getNb( bool allie ) const { if ( allie ) return m_allies.size(); else return m_foes.size(); } Vec Persos_Gest::getPos( const Uint16 &ID, bool allie ) const { if ( allie && ID < m_allies.size() ) return m_allies[ID]->getPos(); else if ( !allie && ID < m_foes.size() ) return m_foes[ID]->getPos(); return Vec(0.0f, 0.0f); } bool Persos_Gest::getVivant( const Uint16 &ID, bool allie ) const { if ( allie && ID < m_allies.size() ) return m_allies[ID]->estVivant(); else if ( !allie && ID < m_foes.size() ) return m_foes[ID]->estVivant(); return false; } void Persos_Gest::nextWave( SpriteLoader &skinGiver, Tirs_Gest* tirsGest, Armes_Gest* armGest ) { /// Attente if ( m_loading ) { if ( SDL_GetTicks() - m_lastWon < (Uint32)5000 ) return; } else { for (unsigned int i(0); i < m_foes.size(); i++) // Teste si tous les ennemis sont morts { if ( m_foes[i]->estVivant() ) return; } /// Régénerer les alliés vivants for (unsigned int i(0); i < m_allies.size(); i++) m_allies[i]->regen(); m_loading = true; m_lastWon = SDL_GetTicks(); return; } m_loading = false; /// Remettre les ennemis sur pieds // Destruction des ennemis while ( !m_foes.empty() ) { delete m_foes.back(); m_foes.pop_back(); } // Apparition des nouveaux ennemis IACtrl* IAEnemy( 0x0 ); Perso* ennemi( 0x0 ); unsigned int nbNewFoes( m_nextWave ); float x, y; float dx(6000.0f / nbNewFoes); for (unsigned int i(0); i < nbNewFoes; i++) { x = dx*i; // Balayage des abscisses y = ( (i%2) == 0 )? -1460.0f : 1460.0f; // Haut ou bas IAEnemy = createRandIA(); ennemi = new Perso( skinGiver.takeSprite("Ennemi"), skinGiver.takeSprite("Mort"), IAEnemy, tirsGest, false, armGest, x, y ); IAEnemy->setPersoMoi( ennemi ); addFoe( ennemi ); } /// Préparer la prochaine vague m_nextWave++; } IACtrl* Persos_Gest::createRandIA() { int nbAlea( rand() % 10 ); switch ( nbAlea ) { case 0 : return new Follower( this ); break; case 1 : return new Sniper( this ); break; default : return new Brute( this ); break; } } ///END FICHIER