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