Page principale | Hiérarchie des classes | Liste des classes | Liste des fichiers | Membres de classe | Membres de fichier

ctrl_jeu.cpp

Aller à la documentation de ce fichier.
00001 00002 // Shoot(r) 00009 00010 #include "affichage.h" 00011 #include "ctrl_fenetre.h" 00012 #include "ctrl_jeu.h" 00013 #include "ctrl_particule.h" 00014 #include "ctrl_son.h" 00015 #include "ctrl_entite.h" 00016 #include "entite_arme.h" 00017 #include "entite_bonus.h" 00018 #include "entite_ennemi.h" 00019 #include "entite_joueur.h" 00020 #include "xml_score.h" 00021 #include "fx_etoile.h" 00022 #include "fx_explosion.h" 00023 #include "texture_manager.h" 00024 00025 CGameManager* CGameManager::m_pGameManager = 0; 00026 00027 // On initialise tous les pointeurs à 0. 00028 // Ce réflexe permet de vérifier si de la mémoire a été alloué. 00029 CGameManager::CGameManager () 00030 { 00031 m_pGameManager = 0; 00032 m_pJoueur1 = 0; 00033 m_pJoueur2 = 0; 00034 m_uiNiveau = 0; 00035 m_bNiveau = true; 00036 m_Etat = ETAT_JEU_JEU; 00037 00038 // On quite le jeu donc on desactive les canaux utilisés pour le jeu 00039 CSoundManager::Instance () ->ActiverCanauxJeu (); 00040 } 00041 00042 CGameManager::~CGameManager () 00043 { 00044 // On quite le jeu donc on desactive les canaux utilisés pour le jeu 00045 CSoundManager::Instance () ->DeactiverCanauxJeu (); 00046 00047 // Libération de la mémoire réservée pour le contrôleur d'entités. 00048 CEntityManager::Kill (); 00049 00050 // Libération de la mémoire réservée par le moteur de particules. 00051 CParticleManager::Kill (); 00052 } 00053 00054 // Creation ou récupération de l'instance du gestionnaire de jeu. 00055 // Si l'instance n'existe pas (m_pGameManager == 0), on la créé. 00056 CGameManager* CGameManager::Instance () 00057 { 00058 if (m_pGameManager == 0) 00059 m_pGameManager = new CGameManager; 00060 return m_pGameManager; 00061 } 00062 00063 // Suppression de l'instance du gestionnaire de jeu si elle existe. 00064 void CGameManager::Kill () 00065 { 00066 if (m_pGameManager != 0) 00067 { 00068 delete m_pGameManager; 00069 m_pGameManager = 0; 00070 } 00071 } 00072 00073 bool CGameManager::IsCreate () 00074 { 00075 return m_pGameManager != 0; 00076 } 00077 00078 void CGameManager::EnregistrerScore () 00079 { 00080 SScore Score; 00081 00082 // Chargement du fichier XML contenant les scores 00083 CXMLScore XMLScore; 00084 XMLScore.Charger (FICHIER_XML_SCORE); 00085 00086 // Création d'un résultat pour le joueur 1 00087 SJoueur Joueur1; 00088 Joueur1.m_szNom = m_TypeJoueur[0].GetNom (); 00089 Joueur1.m_uiScore = m_TypeJoueur[0].GetScore (); 00090 Joueur1.m_uiNiveau = m_TypeJoueur[0].GetNiveau (); 00091 Score.m_Joueur.push_back (Joueur1); 00092 00093 // Création d'un résultat pour le joueur 2, si c'est une partie pour 2 joueurs 00094 if (m_uiTypeJoueur == 2) 00095 { 00096 SJoueur Joueur2; 00097 Joueur2.m_szNom = m_TypeJoueur[1].GetNom (); 00098 Joueur2.m_uiScore = m_TypeJoueur[1].GetScore (); 00099 Joueur2.m_uiNiveau = m_TypeJoueur[1].GetNiveau (); 00100 Score.m_Joueur.push_back (Joueur2); 00101 } 00102 00103 // Enregistrement du score 00104 XMLScore.AjouterScore (Score); 00105 XMLScore.Sauver (); 00106 } 00107 00108 void CGameManager::GererNiveau () 00109 { 00110 CEntityManager *pControleurEntite = CEntityManager::Instance (); 00111 00112 // Détermine s'il y a défaite 00113 if (m_pJoueur1 == 0 && m_pJoueur2 == 0 && m_Etat != ETAT_JEU_DEFAITE) 00114 { 00115 m_Etat = ETAT_JEU_DEFAITE; 00116 EnregistrerScore (); 00117 } 00118 00119 // Détermine la fin d'un niveau : quand le nombre d'ennemi détruit est égale au nombre d'ennemis dans le niveau 00120 if (m_bNiveau && pControleurEntite->GetStatistique ().m_uiEnnemiDetruit == m_XMLNiveaux.GetEnnemiNombre (m_uiNiveau)) 00121 { 00122 m_bNiveau = false; 00123 m_NiveauTimer.Init (); 00124 } 00125 00126 // Changement de niveau 00127 if (!m_bNiveau && (m_NiveauTimer.GetTime () > TEMPS_ENTRE_NIVEAU)) 00128 { 00129 m_bNiveau = true; 00130 m_uiNiveau++; 00131 pControleurEntite->Init (); 00132 // Détermine s'il y a victoire 00133 if (m_uiNiveau >= m_XMLNiveaux.GetNiveauNombre ()) 00134 { 00135 // Indique pour chaque joueur de la partie le niveau atteint (le dernier) 00136 m_uiNiveau = m_XMLNiveaux.GetNiveauNombre () - 1; 00137 m_Etat = ETAT_JEU_VICTOIRE; 00138 m_TypeJoueur[0].SetNiveau (m_uiNiveau + 1); 00139 if (m_uiTypeJoueur == 2) 00140 m_TypeJoueur[1].SetNiveau (m_uiNiveau + 1); 00141 // Enregistrement des scores obtenus par les joueurs 00142 EnregistrerScore (); 00143 00144 // Le bouquet final ! 00145 for (int i = 0; i < 8; i++) 00146 { 00147 CCouleur Couleur (RandFloat (0, 1), RandFloat (0, 1), RandFloat (0, 1)); 00148 CExplosion::Create (0, 32, CVecteur (RandFloat (0, FENETRE_LARGEUR), RandFloat (0, FENETRE_HAUTEUR)), RandInt (100, 200), RandFloat (1, 4), Couleur); 00149 } 00150 } 00151 } 00152 } 00153 00154 void CGameManager::Update () 00155 { 00156 // S'il n'y a niveau victoire ni défaire, on met à jour le niveau, les entités et les particules 00157 if (m_Etat != ETAT_JEU_DEFAITE && m_Etat != ETAT_JEU_VICTOIRE) 00158 { 00159 GererNiveau (); 00160 UpdateEntite (); 00161 00162 CParticleManager::Instance ()->Update (); 00163 } 00164 00165 CAffichage *pAffichage = CAffichage::Instance (); 00166 pAffichage->Debut (); 00167 // On affiche les particules 00168 pAffichage->Particule (); 00169 // On affciche les entités 00170 pAffichage->Entite (); 00171 00172 // On affiche le HUD, suivant l'état du jeu et le nombre de joueurs dans la partie 00173 switch (m_Etat) 00174 { 00175 default: 00176 break; 00177 case ETAT_JEU_JEU: 00178 if (m_uiTypeJoueur == 2) 00179 pAffichage->HUDJeu (m_uiNiveau, m_TypeJoueur[0].GetScore (), m_TypeJoueur[0].GetNom (), m_TypeJoueur[1].GetScore (), m_TypeJoueur[1].GetNom ()); 00180 else 00181 pAffichage->HUDJeu (m_uiNiveau, m_TypeJoueur[0].GetScore (), m_TypeJoueur[0].GetNom ()); 00182 break; 00183 case ETAT_JEU_VICTOIRE: 00184 if (m_uiTypeJoueur == 2) 00185 pAffichage->HUDVictoire (m_TypeJoueur[0].GetScore (), m_TypeJoueur[0].GetNom (), m_TypeJoueur[1].GetScore (), m_TypeJoueur[1].GetNom ()); 00186 else 00187 pAffichage->HUDVictoire (m_TypeJoueur[0].GetScore (), m_TypeJoueur[0].GetNom ()); 00188 break; 00189 case ETAT_JEU_DEFAITE: 00190 if (m_uiTypeJoueur == 2) 00191 pAffichage->HUDDefaite (m_TypeJoueur[0].GetScore (), m_TypeJoueur[0].GetNom (), m_TypeJoueur[1].GetScore (), m_TypeJoueur[1].GetNom ()); 00192 else 00193 pAffichage->HUDDefaite (m_TypeJoueur[0].GetScore (), m_TypeJoueur[0].GetNom ()); 00194 break; 00195 } 00196 pAffichage->Fin (); 00197 } 00198 00199 void CGameManager::UpdateEntite () 00200 { 00201 // On récupère un pointeur vers l'instance de l'entity manager 00202 CEntityManager *pEntityManager = CEntityManager::Instance (); 00203 00204 if (pEntityManager->GetStatistique ().m_uiEnnemiCree < m_XMLNiveaux.GetEnnemiNombre (m_uiNiveau) && m_bNiveau) 00205 { 00206 // Ajout des ennemis 00207 // Quand l'intervale de temps entre la création de deux ennemis défini dans le niveau est écoulé, alors on créé une entité ennemi. 00208 if (m_EnnemiTimer.GetTime () > m_XMLNiveaux.GetEnnemiFrequence (m_uiNiveau)) 00209 { 00210 m_EnnemiTimer.Init (); 00211 CEntiteEnnemi::Create (m_XMLNiveaux.GetTypeEnnemi (m_uiNiveau), CVecteur (RandFloat (64, FENETRE_LARGEUR - 64), FENETRE_HAUTEUR + 96)); 00212 } 00213 00214 // Ajout des ennemis 00215 // Quand l'intervale de temps entre la création de deux bonus d'arme défini dans le niveau est écoulé, alors on créé une entité bonus d'arme. 00216 if (m_BonusArmeTimer.GetTime () > m_XMLNiveaux.GetBonusArmeFrequence (m_uiNiveau)) 00217 { 00218 m_BonusArmeTimer.Init (); 00219 CEntiteBonus::Create (m_XMLNiveaux.GetTypeBonusArme (m_uiNiveau), CVecteur (RandFloat (64, FENETRE_LARGEUR - 64), FENETRE_HAUTEUR + 96)); 00220 } 00221 00222 // Ajout des ennemis 00223 // Quand l'intervale de temps entre la création de deux bonus de bouclier défini dans le niveau est écoulé, alors on créé une entité bonus de bouclier. 00224 if (m_BonusBouclierTimer.GetTime () > m_XMLNiveaux.GetBonusBouclierFrequence (m_uiNiveau)) 00225 { 00226 m_BonusBouclierTimer.Init (); 00227 CEntiteBonus::Create (m_XMLNiveaux.GetTypeBonusBouclier (m_uiNiveau), CVecteur (RandFloat (64, FENETRE_LARGEUR - 64), FENETRE_HAUTEUR + 96)); 00228 } 00229 } 00230 00231 // Mise à jour des entités 00232 pEntityManager->Update (); 00233 } 00234 00235 bool CGameManager::Init (unsigned int uiJoueur, const char* szJoueur1, const char* szJoueur2) 00236 { 00237 // Chargement des niveaux, en cas d'echec on renvoie une erreur. 00238 if (!m_XMLNiveaux.Charger (FICHIER_XML_NIVEAU)) 00239 return false; 00240 00241 // Creation de l'instance de l'entity manager 00242 CEntityManager::Instance (); 00243 // Creation de l'instance du particle manager 00244 CParticleManager::Instance (); 00245 00246 // Initialisation des joueurs, création des entités joueurs 00247 InitJoueur (uiJoueur, szJoueur1, szJoueur2); 00248 00249 // Création d'une instance d'effet de défilement d'étoiles 00250 CEtoile::Create (); 00251 00252 // Initialisation des timers 00253 m_EnnemiTimer.Init (); 00254 m_BonusArmeTimer.Init (); 00255 m_BonusBouclierTimer.Init (); 00256 00257 return true; 00258 } 00259 00260 // Création des entités du joueur 00261 void CGameManager::InitJoueur (unsigned int uiJoueur, const char* szJoueur1, const char* szJoueur2) 00262 { 00263 m_uiTypeJoueur = uiJoueur; 00264 00265 // Configuration du joueur 1 00266 m_TypeJoueur[0].SetNumero (1); 00267 m_TypeJoueur[0].SetTexture (CTextureManager::Instance ()->Texture2D (FIFHIER_TEXTURE_JOUEUR1)); 00268 m_TypeJoueur[0].SetTextureBouclier (CTextureManager::Instance ()->Texture2D (FIFHIER_TEXTURE_BOUCLIER)); 00269 m_TypeJoueur[0].SetCouleur (CCouleur (0.5f, 0.5f, 1.0f)); 00270 m_TypeJoueur[0].SetDommage (5); 00271 m_TypeJoueur[0].SetTaille (32); 00272 m_TypeJoueur[0].SetSon (FICHIER_SON_EXPLOSION); 00273 m_TypeJoueur[0].SetNom (szJoueur1); 00274 m_TypeJoueur[0].SetPositionSpawn (CVecteur (FENETRE_LARGEUR * 1.f / 3.f, FENETRE_HAUTEUR / 6.f)); 00275 00276 // Configuration du joueur 2 00277 m_TypeJoueur[1].SetNumero (2); 00278 m_TypeJoueur[1].SetTexture (CTextureManager::Instance ()->Texture2D (FIFHIER_TEXTURE_JOUEUR2)); 00279 m_TypeJoueur[1].SetTextureBouclier (CTextureManager::Instance ()->Texture2D (FIFHIER_TEXTURE_BOUCLIER)); 00280 m_TypeJoueur[1].SetCouleur (CCouleur (1.0f, 0.5f, 0.5f)); 00281 m_TypeJoueur[1].SetDommage (5); 00282 m_TypeJoueur[1].SetTaille (32); 00283 m_TypeJoueur[1].SetSon (FICHIER_SON_EXPLOSION); 00284 m_TypeJoueur[1].SetNom (szJoueur2); 00285 m_TypeJoueur[1].SetPositionSpawn (CVecteur (FENETRE_LARGEUR * 2.f / 3.f, FENETRE_HAUTEUR / 6.f)); 00286 00287 // Création de l'entité du joueur 1 00288 m_pJoueur1 = CEntiteJoueur::Create (&m_TypeJoueur[0]); 00289 m_pJoueur1->SetArme (m_XMLNiveaux.GetTypeBonusArme (0)->GetArme ()); 00290 00291 if (m_uiTypeJoueur == 2) 00292 { 00293 // Création de l'entité du joueur 2 00294 m_pJoueur2 = CEntiteJoueur::Create (&m_TypeJoueur[1]); 00295 m_pJoueur2->SetArme (m_XMLNiveaux.GetTypeBonusArme (0)->GetArme ()); 00296 } 00297 } 00298 00299 // Commande de tire des joueurs 00300 void CGameManager::Tirer (EJoueur Joueur, bool bTire) 00301 { 00302 switch (Joueur) 00303 { 00304 default: 00305 break; 00306 case JOUEUR_1: 00307 if (m_pJoueur1) 00308 m_pJoueur1->SetTirer (bTire); 00309 break; 00310 case JOUEUR_2: 00311 if (m_pJoueur2) 00312 m_pJoueur2->SetTirer (bTire); 00313 break; 00314 } 00315 } 00316 00317 // Commande de positionnement des joueurs 00318 void CGameManager::PositionnerJoueur (EJoueur Joueur, CVecteur Position) 00319 { 00320 switch (Joueur) 00321 { 00322 default: 00323 break; 00324 case JOUEUR_1: 00325 if (m_pJoueur1) 00326 m_pJoueur1->SetPosition (Position); 00327 break; 00328 case JOUEUR_2: 00329 if (m_pJoueur2) 00330 m_pJoueur2->SetPosition (Position); 00331 break; 00332 } 00333 } 00334 00335 // Initialisation des joueurs quand les entités joueurs sont détruites 00336 void CGameManager::InitJoueur (CEntiteJoueur* pJoueur) 00337 { 00338 if (m_pJoueur1 == pJoueur) 00339 { 00340 // On indique le niveau atteint pas le joueur 1 00341 m_TypeJoueur[0].SetNiveau (m_uiNiveau + 1); 00342 m_pJoueur1 = 0; 00343 } 00344 if (m_pJoueur2 == pJoueur) 00345 { 00346 // On indique le niveau atteint pas le joueur 2 00347 if (m_uiTypeJoueur == 2) 00348 m_TypeJoueur[1].SetNiveau (m_uiNiveau + 1); 00349 m_pJoueur2 = 0; 00350 } 00351 } 00352

Généré le Sun Sep 26 11:36:46 2004 pour Shoot(r) par doxygen 1.3.8