123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427 |
- #include "Game.h"
- using namespace std;
- Game::Game()
- :m_screen( 0x0 ), m_lvlSelect(0), m_shipSelect(0), m_pSelect(0)
- {
- //ctor
- }
- Game::~Game()
- {
- if ( m_screen ) SDL_FreeSurface( m_screen );
- m_screen = 0x0;
- }
- /// Public
- bool Game::init()
- {
- /// [1] Démarrage
- // [1.1] Démarrages SDL
- if ( SDL_Init( SDL_INIT_VIDEO ) < 0)
- {
- cout << "Impossible d'initialiser la SDL: " << SDL_GetError() << endl;
- return false;
- }
- // [1.2] Préparation de fermeture
- atexit(SDL_Quit);
- // [1.3] Para-fenêtre
- SDL_WM_SetCaption("ASCII Space Destroyer", 0);
- // [1.4] Seed pour nombres aléatoires
- srand( time(0) );
- /// [2] Préparation des composants
- // [2.1] Préparation de la fenêtre
- m_screen = SDL_SetVideoMode(1280, 720, 32, SDL_HWSURFACE|SDL_DOUBLEBUF );
- if ( !m_screen )
- {
- cout << "Bug à l'initialisation: " << SDL_GetError() << endl;
- return false;
- }
- // [2.2] Préparation du WaveManager
- m_waver.giveHitManager( &m_hiter );
- // [2.3] Préparation du joueur
- m_player.giveHitManager( &m_hiter );
- // [2.4] Préparation du HitManager
- //...
- /// [3] Finalisation de la procédure
- return true;
- }
- void Game::run()
- {
- string msg;
- while ( true )
- {
- msg = menu();
- if ( msg == "Quit" )
- return;
- msg.erase(0, 2);
- if ( rush( msg ) && ( msg != "Tutoriel" ) )
- {
- m_score.addVictory();
- m_score.giveLoot( msg );
- }
- m_score.save();
- }
- }
- /// Protected
- string Game::menu()
- {
- /// [1] Préparation
- // [1.2] Chargement des index
- ifstream levelStream("Resources/Levels/index.txt");
- ifstream shipStream("Resources/Ships/index.txt");
- ifstream playerStream("Resources/Saves/index.txt");
- // [1.3] Variables
- string line;
- vector< vector<string> > levelDetail;
- vector<string> shipNames;
- vector<Uint32> shipCpu;
- vector<string> playerNames;
- bool loop( true );
- bool canDrive( false );
- // [1.3] Lecture des planètes
- while ( getline( levelStream, line ) )
- {
- if ( line[0] == '>' )
- {
- // Nouvelle planète
- levelDetail.push_back( {} );
- }
- levelDetail.back().push_back( line );
- }
- levelStream.close();
- // [1.4] Lecture des vaisseaux
- while ( getline( shipStream, line ) )
- {
- shipNames.push_back( line );
- shipCpu.push_back( 0 );
- }
- shipStream.close();
- // [1.4] Lecture des joueurs
- while ( getline( playerStream, line ) )
- {
- playerNames.push_back( line );
- }
- playerStream.close();
- // [1._] Erreurs
- if ( levelDetail.empty() || shipNames.empty() )
- {
- cout << "Problème de lecture d'un index." << endl;
- return "Quit";
- }
- // [1.1] Préparation du joueur
- m_player.loadShape("Resources/Ships/" + shipNames[m_shipSelect] + ".txt");
- m_player.setPos( 50, 100 );
- shipCpu[m_shipSelect] = m_player.countCPU();
- string weapNames[ SHOT_NB ] = ACTOR_NAME;
- m_score.load( playerNames[m_pSelect] );
- // [1. ] Pointeur souris
- m_input.placerPtr( m_screen );
- m_input.afficherPointeur( true );
- m_input.capturerPointeur( false );
- /// [2] Lancement boucle principale
- while ( loop )
- {
- /// [3] Évènements
- // [2.1] Mise à jour des évènements
- m_input.updateEvenements();
- // [2.2] Gestion de la boucle
- loop = !m_input.terminer() && !m_input.getToucheHeld( SDLK_ESCAPE );
- if ( loop && m_input.getToucheHeld( SDLK_RETURN ) && canDrive )
- loop = false;
- // [2.2] Gestion évènements choix du vaisseau
- if ( m_input.getToucheInstant( SDLK_RIGHT )
- || ( m_input.getBoutonSourisInstant( 1 )
- && m_input.getX() < m_screen->w / 2
- && m_input.getY() < m_screen->h / 2 ) )
- {
- m_shipSelect += 1;
- if ( m_shipSelect >= shipNames.size() ) m_shipSelect = 0;
- m_player.loadShape("Resources/Ships/" + shipNames[m_shipSelect] + ".txt");
- m_player.setPos( 50, 100 );
- if ( shipCpu[m_shipSelect] == 0 ) shipCpu[m_shipSelect] = m_player.countCPU();
- }
- if ( m_input.getToucheInstant( SDLK_LEFT )
- || ( m_input.getBoutonSourisInstant( 3 )
- && m_input.getX() < m_screen->w / 2
- && m_input.getY() < m_screen->h / 2 ) )
- {
- m_shipSelect -= 1;
- if ( m_shipSelect >= shipNames.size() ) m_shipSelect = shipNames.size() - 1;
- m_player.loadShape("Resources/Ships/" + shipNames[m_shipSelect] + ".txt");
- m_player.setPos( 50, 100 );
- if ( shipCpu[m_shipSelect] == 0 ) shipCpu[m_shipSelect] = m_player.countCPU();
- }
- // [2.2] Gestion évènements choix du joueur
- if ( m_input.getToucheInstant( SDLK_d )
- || ( m_input.getBoutonSourisInstant( 1 )
- && m_input.getX() < m_screen->w / 2
- && m_input.getY() > m_screen->h / 2 ) )
- {
- m_pSelect += 1;
- if ( m_pSelect >= playerNames.size() ) m_pSelect = 0;
- m_score.load( playerNames[ m_pSelect ] );
- }
- if ( m_input.getToucheInstant( SDLK_a ) || m_input.getToucheInstant( SDLK_q )
- || ( m_input.getBoutonSourisInstant( 3 )
- && m_input.getX() < m_screen->w / 2
- && m_input.getY() > m_screen->h / 2 ) )
- {
- m_pSelect -= 1;
- if ( m_pSelect >= playerNames.size() ) m_pSelect = playerNames.size() - 1;
- m_score.load( playerNames[ m_pSelect ] );
- }
- // [3.3] Gestion évènements choix du niveau
- if ( m_input.getToucheInstant( SDLK_DOWN )
- || ( m_input.getBoutonSourisInstant( 1 )
- && m_input.getX() > m_screen->w / 2 ) )
- {
- m_lvlSelect += 1;
- if ( m_lvlSelect >= levelDetail.size() ) m_lvlSelect = 0;
- }
- if ( m_input.getToucheInstant( SDLK_UP )
- || ( m_input.getBoutonSourisInstant( 3 )
- && m_input.getX() > m_screen->w / 2 ) )
- {
- m_lvlSelect -= 1;
- if ( m_lvlSelect >= levelDetail.size() ) m_lvlSelect = levelDetail.size() - 1;
- }
- /// [4] Validité du vaisseau
- canDrive = true;
- canDrive = canDrive && shipCpu[ m_shipSelect ] <= m_score.getCpuLoad();
- canDrive = canDrive && ( m_score.hasShield() || !m_player.hasShield() );
- for ( unsigned int i(1); i < SHOT_NB; i++ )
- canDrive = canDrive && ( m_score.hasWeapon(i) || !m_player.hasWeapon(i) );
- /// [5] Dessin des composants
- // [4.1] Nettoyage fenêtre
- SDL_FillRect(m_screen, 0, 0x000000);
- // [4.2] Affichage de vaisseau
- m_player.draw( m_screen );
- stringRGBA( m_screen, 50, 50, shipNames[m_shipSelect].c_str(), 255, 255, 255, 255 );
- stringRGBA( m_screen, 50, 60, "CPU needed :", 255, 255, 255, 255 );
- for ( unsigned int i(0); i < 6; i++ )
- {
- char s[2];
- s[0] = (char)( shipCpu[m_shipSelect] % (Uint32)pow(10, 6 - i) / pow(10, 5 - i) );
- s[0] += 48;
- s[1] = 0;
- stringRGBA( m_screen, 146 + i*8, 60, s, 255, 255, 255, 255 );
- }
- stringRGBA( m_screen, 50, 70, "Can be driven :", 255, 255, 255, 255 );
- if ( canDrive ) stringRGBA( m_screen, 178, 70, "Yes", 0, 255, 42, 255 );
- else stringRGBA( m_screen, 178, 70, "No", 255, 0, 0, 255 );
- // [4.3] Affichage du niveau
- for ( unsigned int i(0); i < levelDetail[m_lvlSelect].size(); i++)
- {
- stringRGBA( m_screen, m_screen->w / 2, 50 + i * 12, levelDetail[m_lvlSelect][i].c_str(), 255, 255, 255, 255 );
- }
- // [4.4] Affichage des données du joueur
- stringRGBA( m_screen, 50, m_screen->h / 2, m_score.getName().c_str(), 255, 255, 255, 255 );
- stringRGBA( m_screen, 50, m_screen->h / 2 + 12, "Nombre de victoires :", 255, 255, 255, 255 );
- for ( unsigned int i(0); i < 6; i++ )
- {
- char vict[2];
- vict[0] = (char)( m_score.getWinNumber() % (Uint32)pow(10, 6 - i) / pow(10, 5 - i) );
- vict[0] += 48;
- vict[1] = 0;
- stringRGBA( m_screen, 224 + i*8, m_screen->h / 2 + 12, vict, 255, 255, 255, 255 );
- }
- stringRGBA( m_screen, 50, m_screen->h / 2 + 24, "CPU disponible :", 255, 255, 255, 255 );
- for ( unsigned int i(0); i < 6; i++ )
- {
- char s[2];
- s[0] = (char)( m_score.getCpuLoad() % (Uint32)pow(10, 6 - i) / pow(10, 5 - i) );
- s[0] += 48;
- s[1] = 0;
- stringRGBA( m_screen, 186 + i*8, m_screen->h / 2 + 24, s, 255, 255, 255, 255 );
- }
- stringRGBA( m_screen, 50, m_screen->h / 2 + 36, "Possede le bouclier :", 255, 255, 255, 255 );
- if ( m_score.hasShield() ) stringRGBA( m_screen, 224, m_screen->h / 2 + 36, "Oui", 0, 255, 42, 255 );
- else stringRGBA( m_screen, 224, m_screen->h / 2 + 36, "Non", 255, 0, 0, 255 );
- for ( unsigned int i(1); i < SHOT_NB; i ++ )
- {
- stringRGBA( m_screen, 50, m_screen->h / 2 + 36 + 12 * i, weapNames[i].c_str(), 255, 255, 255, 255 );
- if ( m_score.hasWeapon( i ) )
- stringRGBA( m_screen, 60 + 8 * weapNames[i].size(), m_screen->h / 2 + 36 + 12 * i, ": Disponible", 0, 255, 42, 255 );
- else
- stringRGBA( m_screen, 60 + 8 * weapNames[i].size(), m_screen->h / 2 + 36 + 12 * i, ": Inconnue", 255, 0, 0, 255 );
- }
- // [4.5] Double buff
- SDL_Flip( m_screen );
- /// [6] Temps
- SDL_Delay( 16 ); // Economie du CPU
- }
- /// [7] Fin
- if ( m_input.getToucheHeld( SDLK_RETURN ) )
- return levelDetail[m_lvlSelect][0];
- else
- return "Quit";
- }
- bool Game::rush( string planet )
- {
- /// [1] Préparation
- // [1.1] Préparation du joueur
- //m_player.loadShape("Resources/Ships/LightBeam.txt");
- m_player.setPos( m_screen->w, m_screen->h / 2 );
- // [1.2] Nettoyage
- m_hiter.clean();
- m_waver.reset();
- // [1.3] Paramètrage des vagues
- m_waver.setPlanet( planet );
- // [1.4] Variables du temps
- Uint32 lastFresh( SDL_GetTicks() );
- // [1.5] Capturer le pointeur
- m_input.placerPtr( m_screen );
- m_input.afficherPointeur( false );
- m_input.capturerPointeur( true );
- /// [2] Boucle principale
- while ( !m_input.terminer() && !m_input.getToucheHeld( SDLK_ESCAPE ) )
- {
- // [2.1] Mise à jour des évènements
- m_input.updateEvenements();
- // [2.2] Gestion évènements
- m_player.scroll( m_input.getYRel() );
- if ( m_input.getToucheHeld( SDLK_SPACE ) || m_input.getBoutonSourisHeld( 1 ) ) // Clic gauche
- m_player.fire( GUN_ID );
- if ( m_input.getToucheHeld( SDLK_SPACE ) || m_input.getBoutonSourisHeld( 3 ) ) // Clic droit
- m_player.fire( CUTTER_ID );
- if ( m_input.getToucheHeld( SDLK_SPACE ) || m_input.getToucheHeld( SDLK_a ) ) // Touche a
- m_player.fire( PHOTO_ID );
- if ( m_input.getToucheHeld( SDLK_SPACE ) || m_input.getToucheHeld( SDLK_z ) ) // Touche z
- m_player.fire( MISSILE_ID );
- if ( m_input.getToucheHeld( SDLK_SPACE ) || m_input.getToucheHeld( SDLK_e ) ) // Touche e
- m_player.fire( DISPER_ID );
- if ( m_input.getToucheHeld( SDLK_SPACE ) || m_input.getToucheHeld( SDLK_r ) ) // Touche r
- m_player.fire( BREXIT_ID );
- if ( m_input.getToucheHeld( SDLK_SPACE ) || m_input.getToucheHeld( SDLK_t ) ) // Touche t
- m_player.fire( HECTO_ID );
- if ( m_input.getToucheHeld( SDLK_SPACE ) || m_input.getToucheHeld( SDLK_y ) ) // Touche y
- m_player.fire( SNIPER_ID );
- // [2.3] Mise à jour des éléments
- m_player.enableThruster( m_waver.hasWon() );
- m_player.update();
- m_waver.update();
- m_hiter.setNearPt( m_waver.nearestFromPoint( m_player.getHeartPos() ) );
- m_hiter.setNearAxe( m_waver.nearestFromAxe( m_player.getHeartPos() ) );
- m_hiter.setNearAlly( m_player.getHeartPos() );
- m_hiter.update();
- // [2.4] Dessin des composants
- SDL_FillRect(m_screen, 0, 0x000000);
- m_waver.draw( m_screen );
- m_player.draw( m_screen );
- m_hiter.draw( m_screen );
- if ( !m_player.getIsAlive() || m_waver.hasLost() )
- printGameOver();
- SDL_Flip( m_screen );
- // [2.5] Temps
- while( SDL_GetTicks() - lastFresh < 16 )
- {
- if ( SDL_GetTicks() - lastFresh < 12 )
- SDL_Delay( 2 ); // Economie du CPU
- }
- lastFresh = SDL_GetTicks();
- }
- /// [3] Fin
- // [3. ] Si victoire
- bool victory( m_waver.hasWon() );
- // [3._] Nettoyage
- m_hiter.clean();
- m_waver.clean();
- // [3._] Attente de la touche echape
- while ( m_input.getToucheHeld( SDLK_ESCAPE ) ) m_input.updateEvenements();
- // [3._] Retour
- return m_player.getIsAlive() && victory;
- }
- /// Private
- void Game::printGameOver()
- {
- stringRGBA( m_screen, 12, 30, "GAME OVER", 255, 255, 255, 255 );
- }
|