00001 00002 // Shoot(r) 00009 00010 #include "affichage.h" 00011 #include "ctrl_particule.h" 00012 #include "ctrl_fenetre.h" 00013 #include "ctrl_jeu.h" 00014 #include "fx_etoile.h" 00015 #include "fx_explosion.h" 00016 #include "fx_fumee.h" 00017 #include "texture_manager.h" 00018 00019 CParticleManager* CParticleManager::m_pParticleManager = 0; 00020 00021 CParticleManager::CParticleManager () 00022 { 00023 // On initialise tous les pointeurs sur générateur de particules à 0 pour pouvoir vérifier qu'ils sont utilisés ou non. 00024 for (int i = 0; i < CTRL_GENERATEUR_PARTICULE_NOMBRE; i++) 00025 m_pGenParticule[i] = 0; 00026 00027 // Chargement de la texture de particules 00028 m_pTexture = CTextureManager::Instance ()->Texture2D (FICHIER_TEXTURE_PARTICULE); 00029 00030 // Variable permettrant de déactiver l'affichage des particules 00031 m_bActif = true; 00032 } 00033 00034 CParticleManager::~CParticleManager () 00035 { 00036 // Destruction des générateurs de particules. 00037 for (int i = 0; i < CTRL_GENERATEUR_PARTICULE_NOMBRE; i++) 00038 if (m_pGenParticule[i]) 00039 Kill (i); 00040 // Déchargement de la texture de particules 00041 CTextureManager::Instance ()->Delete (m_pTexture); 00042 } 00043 00044 // Creation ou récupération de l'instance du gestionnaire de générateurs de particules. 00045 // Si l'instance n'existe pas (m_pParticleManager == 0), on la créé. 00046 CParticleManager* CParticleManager::Instance () 00047 { 00048 if (m_pParticleManager == 0) 00049 m_pParticleManager = new CParticleManager; 00050 return m_pParticleManager; 00051 } 00052 00053 // Suppression de l'instance du gestionnaire de générateurs de particules si elle existe. 00054 void CParticleManager::Kill () 00055 { 00056 if (m_pParticleManager != 0) 00057 { 00058 delete m_pParticleManager; 00059 m_pParticleManager = 0; 00060 } 00061 } 00062 00063 // Offre un accès aux générateurs de particules. On prend soin de vérifier que l'index indentifie bien une entrée de la table 00064 const CParticleSystem* CParticleManager::GetGenerateurParIndex (unsigned int uiIndex) const 00065 { 00066 if (uiIndex < CTRL_GENERATEUR_PARTICULE_NOMBRE) 00067 return m_pGenParticule[uiIndex]; 00068 return 0; 00069 } 00070 00071 // Seul cette fonction permet la création d'une instance d'effet de défilement d'étoile 00072 CEtoile* CParticleManager::CreateEtoile () 00073 { 00074 if (m_bActif) 00075 { 00076 // Recherche d'un index libre dans la table des générateurs de particules. 00077 int iIndex = GetIndexLibre (); 00078 // S'il y a un index libre, alors on alloue de la mémoire pour l'effet de particules 00079 return static_cast<CEtoile*> (iIndex != -1 ? m_pGenParticule[iIndex] = new CEtoile (m_pTexture) : 0); 00080 } 00081 return 0; 00082 } 00083 00084 // Seul cette fonction permet la création d'une instance d'effet de fumée 00085 CFumee* CParticleManager::CreateFumee () 00086 { 00087 if (m_bActif) 00088 { 00089 // Recherche d'un index libre dans la table des générateurs de particules. 00090 int iIndex = GetIndexLibre (); 00091 // S'il y a un index libre, alors on alloue de la mémoire pour l'effet de particules. 00092 return static_cast<CFumee*> (iIndex != -1 ? m_pGenParticule[iIndex] = new CFumee (m_pTexture) : 0); 00093 } 00094 return 0; 00095 } 00096 00097 // Seul cette fonction permet la création d'une instance d'effet d'explosion. 00098 CExplosion* CParticleManager::CreateExplosion () 00099 { 00100 if (m_bActif) 00101 { 00102 // Recherche d'un index libre dans la table des générateurs de particules. 00103 int iIndex = GetIndexLibre (); 00104 // S'il y a un index libre, alors on alloue de la mémoire pour l'effet de particules. 00105 return static_cast<CExplosion*> (iIndex != -1 ? m_pGenParticule[iIndex] = new CExplosion (m_pTexture) : 0); 00106 } 00107 return 0; 00108 } 00109 00110 // Seule cette fonction est autorisée a détruire une instance de générateur de particules 00111 void CParticleManager::Kill (unsigned int uiIndex) 00112 { 00113 delete m_pGenParticule[uiIndex]; 00114 m_pGenParticule[uiIndex] = 0; 00115 } 00116 00117 // Recherche d'un index libre dans la table des générateurs de particules 00118 int CParticleManager::GetIndexLibre () const 00119 { 00120 for (int i = 0; i < CTRL_GENERATEUR_PARTICULE_NOMBRE; i++) 00121 if (m_pGenParticule[i] == 0) 00122 return i; 00123 return -1; 00124 } 00125 00126 // Mise à jour des générateurs de particules : Détermine s'il faut les détrire 00127 void CParticleManager::Update () 00128 { 00129 for (int i = 0; i < CTRL_GENERATEUR_PARTICULE_NOMBRE; i++) 00130 { 00131 if (m_pGenParticule[i]) 00132 { 00133 m_pGenParticule[i]->Update (); 00134 00135 // 27/04/2004 - Suppression des ennemis 00136 if (m_pGenParticule[i]->GetSupprime ()) 00137 { 00138 Kill (i); 00139 continue; 00140 } 00141 } 00142 } 00143 } 00144 00145
1.3.8