1
/************************************************************************************
3
AstroMenace (Hardcore 3D space shooter with spaceship upgrade possibilities)
4
Copyright © 2006-2012 Michael Kurinnoy, Viewizard
7
AstroMenace 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 3 of the License, or
10
(at your option) any later version.
12
AstroMenace 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.
17
You should have received a copy of the GNU General Public License
18
along with AstroMenace. If not, see <http://www.gnu.org/licenses/>.
21
Web Site: http://www.viewizard.com/
22
Project: http://sourceforge.net/projects/openastromenace/
23
E-mail: viewizard@viewizard.com
25
*************************************************************************************/
28
/// подключаем нужные файлы
29
#include "SpaceObject.h"
30
#include "../../Game.h"
35
//-----------------------------------------------------------------------------
36
// Конструктор, инициализация всех переменных
37
//-----------------------------------------------------------------------------
38
CSpaceObject::CSpaceObject(void)
41
ObjectStatus = 1; // чужой
45
Velocity = RotationSpeed = VECTOR3D(0.0f,0.0f,0.0f);
51
BossPartCountDown = -1.0f;
53
LastCameraPoint = GamePoint;
55
// подключаем к своему списку
57
AttachSpaceObject(this);
64
//-----------------------------------------------------------------------------
66
//-----------------------------------------------------------------------------
67
CSpaceObject::~CSpaceObject(void)
69
if (GFXLocation != 0) {delete [] GFXLocation; GFXLocation = 0;}
72
for (int i=0; i<GFXQuantity; i++)
75
GFX[i]->IsSuppressed = true;
76
GFX[i]->DestroyIfNoParticles = true;
78
delete [] GFX; GFX = 0;
81
DetachSpaceObject(this);
93
//-----------------------------------------------------------------------------
94
// Установка положения объекта
95
//-----------------------------------------------------------------------------
96
void CSpaceObject::SetLocation(VECTOR3D NewLocation)
98
// вызываем родительскую функцию
99
::CObject3D::SetLocation(NewLocation);
103
for (int i=0; i<GFXQuantity; i++)
107
GFX[i]->MoveSystem(NewLocation + GFXLocation[i]);
108
GFX[i]->SetStartLocation(GFXLocation[i] + NewLocation);
116
//-----------------------------------------------------------------------------
117
// Установка углов поворота объекта
118
//-----------------------------------------------------------------------------
119
void CSpaceObject::SetRotation(VECTOR3D NewRotation)
121
// вызываем родительскую функцию
122
::CObject3D::SetRotation(NewRotation);
126
for (int i=0; i<GFXQuantity; i++)
128
Matrix33CalcPoint(&(GFXLocation[i]), OldInvRotationMat);
129
Matrix33CalcPoint(&(GFXLocation[i]), CurrentRotationMat);
133
if (GFX[i]->SpeedOnCreation == -1.0f)
135
GFX[i]->MoveSystem(GFXLocation[i] + Location);
136
GFX[i]->SetStartLocation(GFXLocation[i] + Location);
137
GFX[i]->RotateSystemAndParticlesByAngle(Rotation);
141
GFX[i]->MoveSystemLocation(GFXLocation[i] + Location);
142
GFX[i]->RotateSystemByAngle(Rotation);
156
//-----------------------------------------------------------------------------
157
// Обновление данных объектa
158
//-----------------------------------------------------------------------------
159
bool CSpaceObject::Update(float Time)
161
// вызываем родительскую функцию
162
// если там передали удалить - выходим
163
if (!::CObject3D::Update(Time)) return false;
165
// если это часть корабля босса, взрываем через время
166
if (BossPartCountDown > -1.0f)
168
BossPartCountDown -= TimeDelta;
170
if (BossPartCountDown<=0.0f)
172
CSpaceExplosion *TMPExplosion;
173
TMPExplosion = new CSpaceExplosion;
174
TMPExplosion->Create(this, 34, Location, Speed, -1);
182
if (ObjectType == 7 || ObjectType == 15)
184
// если большие астероиды летящие сверху
185
if (ObjectType == 15 && (ObjectCreationType>20 && ObjectCreationType<30))
187
SetRotation(VECTOR3D(RotationSpeed.x*TimeDelta, RotationSpeed.y*TimeDelta, 0.0f));
191
if (RotationSpeed.x != 0.0f)
193
Rotation.x -= RotationSpeed.x*TimeDelta;
194
if (Rotation.x <= 360.0f) Rotation.x += 360.0f;
196
if (RotationSpeed.y != 0.0f)
198
Rotation.y -= RotationSpeed.y*TimeDelta;
199
if (Rotation.y <= 360.0f) Rotation.y += 360.0f;
208
// если части корабля или техники, останавливаем
213
Speed -= 1.0f*TimeDelta;
214
if (Speed<0.0f) Speed=0.0f;
218
Speed += 1.0f*TimeDelta;
219
if (Speed>0.0f) Speed=0.0f;
222
if (RotationSpeed.x != 0.0f)
224
SetRotation(VECTOR3D(-RotationSpeed.x*TimeDelta,0.0f,0.0f));
225
RotationSpeed.x -= (RotationSpeed.x/4.0f)*TimeDelta;
227
if (RotationSpeed.y != 0.0f)
229
SetRotation(VECTOR3D(0.0f,-RotationSpeed.y*TimeDelta,0.0f));
230
RotationSpeed.y -= (RotationSpeed.y/4.0f)*TimeDelta;
232
if (RotationSpeed.z != 0.0f)
234
SetRotation(VECTOR3D(0.0f,0.0f,-RotationSpeed.z*TimeDelta));
235
RotationSpeed.z -= (RotationSpeed.z/4.0f)*TimeDelta;
242
// если планеты, должны учесть положение камеры т.е. ее смещение
243
if (ObjectType == 14 || ObjectType == 15)
245
VECTOR3D Temp = GamePoint - LastCameraPoint;
247
// у планет особое движение... они немного могут двигаться на камеру...
248
VECTOR3D OrientTTT = Temp^(-1);
249
OrientTTT.Normalize();
250
SetLocation(Location + (OrientTTT^(Speed*TimeDelta)) + Temp);
251
LastCameraPoint = GamePoint;
253
// вращения планет и их частей
254
if (ObjectType == 14)
256
switch (ObjectCreationType)
258
// планета с астероидным кольцом
260
DrawObjectList[0].Rotation.y += 0.5f*TimeDelta;
262
DrawObjectList[1].Rotation.y += 0.7f*TimeDelta;
263
DrawObjectList[2].Rotation.y += 0.8f*TimeDelta;
264
DrawObjectList[3].Rotation.y += 0.9f*TimeDelta;
266
// полу разрушенная планета
268
Rotation.y += 0.5f*TimeDelta;
269
if (Rotation.y >= 360.0f) Rotation.y -= 360.0f;
271
// планета с атмосферой
273
DrawObjectList[0].Rotation.y += 0.5f*TimeDelta;
275
DrawObjectList[1].Rotation.y -= 0.7*TimeDelta;
279
DrawObjectList[0].Rotation.y += 1.0f*TimeDelta;
281
// планета пришельцев, с подсветкой
283
DrawObjectList[0].Rotation.y += 0.5f*TimeDelta;
285
// планета пришельцев
287
DrawObjectList[0].Rotation.y += 0.5f*TimeDelta;
291
for (int i=0; i<DrawObjectQuantity; i++)
293
if (DrawObjectList[i].Rotation.x >= 360.0f) DrawObjectList[i].Rotation.x -= 360.0f;
294
if (DrawObjectList[i].Rotation.x <= -360.0f) DrawObjectList[i].Rotation.x += 360.0f;
295
if (DrawObjectList[i].Rotation.y >= 360.0f) DrawObjectList[i].Rotation.y -= 360.0f;
296
if (DrawObjectList[i].Rotation.y <= -360.0f) DrawObjectList[i].Rotation.y += 360.0f;
303
SetLocation(Location + (Orientation^(Speed*TimeDelta)));
308
if (Velocity.x + Velocity.y + Velocity.z != 0.0f)
310
SetLocation(Location + (Velocity^TimeDelta));
311
Velocity -= Velocity^(0.5f*TimeDelta);
316
// объект в порядке - удалять не нужно