1 /*****************************************************************************
2  *
3  *  Copyright (C) 2003 C�dric Br�gardis <cedric.bregardis@free.fr>
4  *
5  *  This file is part of BRIQUOLO
6  *
7  *  BRIQUOLO is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation; either version 2 of the License, or
10  *  (at your option) any later version.
11  *
12  *  BRIQUOLO is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with BRIQUOLO; if not, write to the Free Software
19  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  *
21  *****************************************************************************/
22 #include "Balle.h"
23 #include "TraceBalle.h"
24 #include <MOGL_Temps.h>
25 #include <MOGL_GestionnaireObjet.h>
26 #include <MOGL_MatriceTransformation.h>
27 #include "BibliothequeSon.h"
28 #include "Constante.h"
29 #ifndef M_PI
30 #define M_PI 3.14159265359
31 #endif
32 
33 #define VITESSE_DECELERATION  0.5
34 #define FACT_ACC_MAX          2
35 
36 MOGL_Objet * Balle::_ObjetSource=NULL;
37 
Balle()38 Balle::Balle(): ElementCollision(), MOGL_Action(),
39                 _Vitesse(0), _FacteurTaille(1), _RayonInit(0.5), _SuperPuissance(false),
40                 _TempoSuperPuissance(10, false, false), _CanalSonSuperPuissance(-1),
41                 _FacteurAcceleration(1)
42 {
43   if (_ObjetSource==NULL)
44   {
45     PreCharger(Texture::GetGestionnaireTexture());
46   }
47   _ElementArbre=new MOGL_Objet(*_ObjetSource);
48   _TraceBalle=new TraceBalle(this);
49   ((MOGL_Objet *)_ElementArbre)->AjouterElement(_TraceBalle);
50   _Rayon=_RayonInit;
51   _TempoSuperPuissance.FinTemporisation.Connecter(this, &Balle::_OnFinSuperPuissance);
52   ((MOGL_Objet *)_ElementArbre)->AjouterElement(&_TempoSuperPuissance);
53 }
54 
Balle(const Balle & p_Balle)55 Balle::Balle(const Balle & p_Balle): ElementCollision(p_Balle), _RayonInit(p_Balle._RayonInit), _CanalSonSuperPuissance(-1)
56 {
57   _ElementArbre=new MOGL_Objet(*_ObjetSource);
58 
59   _TraceBalle=new TraceBalle(this);
60   _SuperPuissance=p_Balle._SuperPuissance;
61   _TraceBalle->SetSuperPuissance(_SuperPuissance);
62   ((MOGL_Objet *)_ElementArbre)->AjouterElement(_TraceBalle);
63   _Vitesse = p_Balle._Vitesse;
64   _DirectionX = p_Balle._DirectionX;
65   _DirectionY = p_Balle._DirectionY;
66   _FacteurAcceleration = p_Balle._FacteurAcceleration;
67 
68   _Rayon=p_Balle._Rayon;
69   _FacteurTaille=p_Balle._FacteurTaille;
70   _TempoSuperPuissance=p_Balle._TempoSuperPuissance;
71   _TempoSuperPuissance.FinTemporisation.Connecter(this, &Balle::_OnFinSuperPuissance);
72   ((MOGL_Objet *)_ElementArbre)->AjouterElement(&_TempoSuperPuissance);
73   _MatriceRotation=p_Balle._MatriceRotation;
74 
75   val=12;
76 }
77 
~Balle()78 Balle::~Balle()
79 {
80   if (_CanalSonSuperPuissance!=-1)
81   {
82     Son::ArreterCanal(_CanalSonSuperPuissance);
83   }
84   delete _TraceBalle;
85   delete _ElementArbre;
86 }
87 
PreCharger(MOGL_GestionnaireTexture * p_GestionnaireTexture)88 void Balle::PreCharger(MOGL_GestionnaireTexture * p_GestionnaireTexture)
89 {
90   _ObjetSource=new MOGL_Objet;
91   MOGL_GestionnaireObjet::ChargerObjetASCTriangle((Constante::GetGlobalDir()+Constante::GetDataDir()+"/balle.tri").c_str(), *p_GestionnaireTexture, *_ObjetSource);
92 }
93 
Deplacer(double p_Temps)94 void Balle::Deplacer(double p_Temps)
95 {
96   SetPosition(_X + p_Temps*_Vitesse*_DirectionX*_FacteurAcceleration, _Y + p_Temps*_Vitesse*_DirectionY*_FacteurAcceleration);
97 
98   double ang = atan2(_DirectionY, _DirectionX);
99   if (GetVitesseTotale() != 0 && (fabs(ang)<0.34))
100   {
101     _DirectionX = cos(ang*1.5);
102     _DirectionY = sin(ang*1.5);
103   }
104 
105   if (_SuperPuissance && _CanalSonSuperPuissance==-1)
106   {
107     _CanalSonSuperPuissance=BibliothequeSon::SonSuperPuissance->Jouer(true);
108   }
109 }
110 
GetRayon() const111 double Balle::GetRayon() const
112 {
113   return _Rayon;
114 }
115 
SetPosition(double p_X,double p_Y)116 void Balle::SetPosition(double p_X, double p_Y)
117 {
118   _X=p_X;
119   _Y=p_Y;
120   if (_ElementArbre!=NULL)
121   {
122     if (_Vitesse!=0)
123     {
124       double distance=MOGL_Temps::GetVariationTemps()*_Vitesse;
125       double angleRot=distance/_Rayon;
126 
127       MOGL_Struct_Vecteur vec;
128       vec.x=-_DirectionY;
129       vec.y=_DirectionX;
130       vec.z=0;
131 
132       MOGL_MatriceTransformation matRot=MOGL_MatriceTransformation::FabriqueRotation(vec, angleRot*180.0/M_PI);
133       _MatriceRotation.Multiplier(matRot);
134     }
135 
136     MOGL_MatriceTransformation mat=MOGL_MatriceTransformation::FabriqueEchelle(_FacteurTaille, _FacteurTaille, _FacteurTaille);
137     mat.Multiplier(_MatriceRotation);
138 
139 
140     _ElementArbre->ReinitialiserPosition();
141     _ElementArbre->AjouteTransformation(mat);
142 
143     _ElementArbre->AjouterTranslation(_X,_Y,0);
144   }
145 }
146 
SetTaille(double p_Facteur)147 void Balle::SetTaille(double p_Facteur)
148 {
149   _Rayon*=p_Facteur;
150   _FacteurTaille*=p_Facteur;
151 
152   MOGL_MatriceTransformation mat=MOGL_MatriceTransformation::FabriqueEchelle(_FacteurTaille, _FacteurTaille, _FacteurTaille);
153   mat.Multiplier(_MatriceRotation);
154 
155   _ElementArbre->ReinitialiserPosition();
156   _ElementArbre->AjouteTransformation(mat);
157 
158   _ElementArbre->AjouterTranslation(_X,_Y,0);
159 }
160 
GetSuperPuissance() const161 bool Balle::GetSuperPuissance() const
162 {
163   return _SuperPuissance;
164 }
165 
SetSuperPuissance(bool p_Actif)166 void Balle::SetSuperPuissance(bool p_Actif)
167 {
168   if (!_SuperPuissance && p_Actif && _CanalSonSuperPuissance==-1)
169   {
170     _CanalSonSuperPuissance=BibliothequeSon::SonSuperPuissance->Jouer(true);
171   }
172 
173   if (_SuperPuissance && !p_Actif && _CanalSonSuperPuissance!=-1)
174   {
175     Son::ArreterCanal(_CanalSonSuperPuissance);
176     _CanalSonSuperPuissance=-1;
177   }
178 
179   _SuperPuissance=p_Actif;
180   _TraceBalle->SetSuperPuissance(p_Actif);
181   if (p_Actif)
182   {
183     _TempoSuperPuissance.Arreter();
184     _TempoSuperPuissance.Demarrer();
185   }
186   else
187   {
188     _TempoSuperPuissance.Arreter();
189   }
190 }
191 
_OnFinSuperPuissance()192 void Balle::_OnFinSuperPuissance()
193 {
194   SetSuperPuissance(false);
195 }
196 
GetTempsMax() const197 double Balle::GetTempsMax() const
198 {
199   return _TempsMax;
200 }
201 
SetTempsMax(double p_TempsMax)202 void Balle::SetTempsMax(double p_TempsMax)
203 {
204   _TempsMax = p_TempsMax;
205 }
206 
TesterCollision(Balle * p_Balle)207 Struct_Collision Balle::TesterCollision(Balle * p_Balle)
208 {
209   Struct_Collision collision;
210   collision.TempsCollision = p_Balle->GetTempsMax();
211   return collision;
212 }
213 
SetFacteurAcceleration(double p_Facteur)214 void Balle::SetFacteurAcceleration(double p_Facteur)
215 {
216   _FacteurAcceleration = p_Facteur;
217   if (_FacteurAcceleration > FACT_ACC_MAX)
218   {
219     _FacteurAcceleration = FACT_ACC_MAX;
220   }
221 }
222 
GetFacteurAcceleration() const223 double Balle::GetFacteurAcceleration() const
224 {
225   return _FacteurAcceleration;
226 }
227 
SetDirection(double p_DirectionX,double p_DirectionY)228 void Balle::SetDirection(double p_DirectionX, double p_DirectionY)
229 {
230   _DirectionX = p_DirectionX;
231   _DirectionY = p_DirectionY;
232 }
233 
GetDirectionX() const234 double Balle::GetDirectionX() const
235 {
236   return _DirectionX;
237 }
238 
GetDirectionY() const239 double Balle::GetDirectionY() const
240 {
241   return _DirectionY;
242 }
243 
SetVitesseTotale(double p_Vitesse)244 void Balle::SetVitesseTotale(double p_Vitesse)
245 {
246   _Vitesse = p_Vitesse / _FacteurAcceleration;
247 }
248 
GetVitesseTotale() const249 double Balle::GetVitesseTotale() const
250 {
251   return _Vitesse * _FacteurAcceleration;
252 }
253 
254 
SetVitesseBase(double p_Vitesse)255 void Balle::SetVitesseBase(double p_Vitesse)
256 {
257   _Vitesse = p_Vitesse;
258 }
259 
GetVitesseBase() const260 double Balle::GetVitesseBase() const
261 {
262   return _Vitesse;
263 }
264 
GetVitesseTotaleX() const265 double Balle::GetVitesseTotaleX() const
266 {
267   return (_Vitesse * _FacteurAcceleration) * _DirectionX;
268 }
269 
GetVitesseTotaleY() const270 double Balle::GetVitesseTotaleY() const
271 {
272   return (_Vitesse * _FacteurAcceleration) * _DirectionY;
273 }
274 
SetVitesseTotale(double p_VitesseX,double p_VitesseY)275 void Balle::SetVitesseTotale(double p_VitesseX, double p_VitesseY)
276 {
277   double vit = sqrt(p_VitesseX * p_VitesseX + p_VitesseY * p_VitesseY);
278   _DirectionX = p_VitesseX / vit;
279   _DirectionY = p_VitesseY / vit;
280 
281   _Vitesse = vit / _FacteurAcceleration;
282 }
283 
MajVitesse()284 void Balle::MajVitesse()
285 {
286   double val = VITESSE_DECELERATION * MOGL_Temps::GetVariationTemps();
287 
288   if (_FacteurAcceleration > 1)
289   {
290     _FacteurAcceleration -= val;
291     if (_FacteurAcceleration < 1)
292     {
293       _FacteurAcceleration = 1;
294     }
295   }
296   else if (_FacteurAcceleration < 1)
297   {
298     _FacteurAcceleration += val;
299     if (_FacteurAcceleration > 1)
300     {
301       _FacteurAcceleration = 1;
302     }
303   }
304 }
305 
AddAcceleration(double p_Facteur)306 void Balle::AddAcceleration(double p_Facteur)
307 {
308   _FacteurAcceleration *= p_Facteur;
309 
310   if (_FacteurAcceleration > FACT_ACC_MAX)
311   {
312     _FacteurAcceleration = FACT_ACC_MAX;
313   }
314 }
315