123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- #include "WaveManager.h"
- WaveManager::WaveManager()
- :m_lvl(0), m_chrono( SDL_GetTicks() ), m_allDead( true ), m_complete( false ), m_gameLost( false ), m_planet("Sideral Space"),
- m_hiter( 0x0 )
- {
-
- }
- WaveManager::~WaveManager()
- {
-
- }
- void WaveManager::giveHitManager( HitManager* theHitManager )
- {
- m_hiter = theHitManager;
- }
- void WaveManager::draw( SDL_Surface* screen )
- {
-
- std::string wave( "Vague numero ");
- wave += char( m_lvl + 48 );
- stringRGBA( screen, 12, 10, wave.c_str(), 255, 255, 255, 255 );
-
- stringRGBA( screen, 12, 20, m_planet.c_str(), 255, 255, 255, 255 );
-
- if ( m_complete )
- {
- stringRGBA( screen, 12, 30, "Mission accomplie !", 255, 255, 255, 255 );
- stringRGBA( screen, 12, 40, "Appuyer sur ECHAP pour rentrer a la base.", 255, 255, 255, 255 );
- }
-
- for ( unsigned int i(0); i < m_escadron.size(); i++ ) {
- m_escadron[i]->draw( screen );
- }
- }
- void WaveManager::update()
- {
-
- for ( unsigned int i(0); i < m_escadron.size(); i++ ) {
- m_escadron[i]->update();
-
- if ( m_escadron[i]->getPos()->x > 1280 )
- m_gameLost = true;
- }
-
- if ( !m_allDead && !m_complete ){
- m_allDead = allDead();
- if ( m_allDead )
- m_chrono = SDL_GetTicks();
- }
- else if ( SDL_GetTicks() - m_chrono > 3000 ){
- nextWave();
- }
- }
- void WaveManager::clean()
- {
- while ( !m_escadron.empty() ) {
- delete m_escadron.back();
- m_escadron.back() = 0x0;
- m_escadron.pop_back();
- }
- }
- void WaveManager::reset()
- {
- clean();
- m_lvl = 0;
- m_allDead = true;
- m_complete = false;
- }
- bool WaveManager::allDead()
- {
- for ( unsigned int i(0); i < m_escadron.size(); i++ ) {
- if ( m_escadron[i]->getIsAlive() )
- return false;
- }
- return true;
- }
- bool WaveManager::hasWon()
- {
- return m_complete;
- }
- bool WaveManager::hasLost()
- {
- return m_gameLost;
- }
- void WaveManager::setPlanet( std::string planet )
- {
- m_planet = planet;
- }
- std::vector< Foe* >* WaveManager::getFoes()
- {
- return &m_escadron;
- }
- void WaveManager::nextWave()
- {
-
- m_allDead = false;
- m_gameLost = false;
-
- m_lvl ++;
-
- clean();
-
-
-
- std::string lvlPath("Levels/" + m_planet + "/w_" + (char)(m_lvl + 48) + ".txt" );
- std::ifstream flux( lvlPath.c_str() );
- std::string shipName;
- Sint16 shipPos;
- Sint16 shipLate;
- while ( flux >> shipName )
- {
-
- flux >> shipPos;
- flux >> shipLate;
-
- m_escadron.push_back( new Foe );
- m_escadron.back()->loadShape("Levels/" + m_planet + "/" + shipName + ".txt");
- m_escadron.back()->giveHitManager( m_hiter );
- Uint16 dec( m_escadron.back()->getHitBox()->w );
- m_escadron.back()->setPos( -dec - shipLate, 720 * shipPos / 100 );
- }
-
- if ( m_escadron.empty() )
- {
- m_complete = true;
- m_lvl --;
- }
- }
- SDL_Rect WaveManager::nearestFromPoint( SDL_Rect pos_ref )
- {
- SDL_Rect pos_rep( pos_ref );
- pos_rep.x = -10000;
- SDL_Rect pos_i;
- Sint32 dist_min( 2147483647 );
- Sint32 dist_i;
- Sint32 x_i;
- Sint32 y_i;
- for ( unsigned int i(0); i < m_escadron.size(); i++ )
- {
- pos_i = m_escadron[i]->getHeartPos();
- x_i = ( pos_i.x - pos_ref.x );
- y_i = ( pos_i.y - pos_ref.y );
- dist_i = x_i * x_i + y_i * y_i;
- if ( dist_i < dist_min && m_escadron[i]->getIsAlive() )
- {
- dist_min = dist_i;
- pos_rep = pos_i;
- }
- }
-
- return pos_rep;
- }
- SDL_Rect WaveManager::nearestFromAxe( SDL_Rect pos_ref )
- {
- SDL_Rect pos_rep( pos_ref );
- pos_rep.x = -10000;
- SDL_Rect pos_i;
- Sint32 dist_min( 2147483647 );
- Sint32 dist_i;
- for ( unsigned int i(0); i < m_escadron.size(); i++ )
- {
- pos_i = m_escadron[i]->getHeartPos();
- dist_i = abs( pos_i.y - pos_ref.y );
- if ( dist_i < dist_min && m_escadron[i]->getIsAlive() )
- {
- dist_min = dist_i;
- pos_rep = pos_i;
- }
- }
- return pos_rep;
- }
|