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 "GroundObject.h"
30
#include "../../Game.h"
33
//-----------------------------------------------------------------------------
34
// Конструктор, инициализация всех переменных
35
//-----------------------------------------------------------------------------
36
CGroundObject::CGroundObject(void)
39
ObjectStatus = 1; // чужой
41
// колес или траков нет
44
WheelRotateQuantity = 0;
45
WheelRotateObjectsNum = 0;
46
WheelRotateSpeed = 0.0f;
47
MaxWheelRotateAngle = 20.0f;
49
TrackRotationDirection = 1;
51
TargetHorizObjectQuantity = 0;
52
TargetHorizObject = 0;
53
TargetHorizObjectCurrentAngle = 0.0f;
54
TargetHorizObjectNeedAngle = 0.0f;
55
TargetVertObjectQuantity = 0;
57
TargetVertObjectMaxAngle = 80.0f;
58
TargetVertObjectMinAngle = 0.0f;
59
TargetVertObjectCurrentAngle = 0.0f;
60
TargetVertObjectNeedAngle = 0.0f;
62
BarrelObjectQuantity = 0;
66
// и никуда не нужно поворачивать
67
NeedRotate = VECTOR3D(0.0f, 0.0f, 0.0f);
68
RotationSpeed = VECTOR3D(1.0f, 1.0f, 1.0f);
71
MaxSpeed = Speed = NeedSpeed = 0.0f;
73
// ускорение, пока нет двигателей - его нет...
74
MaxAcceler = MaxSpeedRotate = Acceler = 0.0f;
75
// даем максимальное ускорение
82
WeaponTargeting = false;
85
// оружие пока не установлено
91
WeaponGroupCurrentFireNum = -1;
92
WeaponGroupCurrentFireDelay = 0.0f;
94
BaseBound = VECTOR3D(0.0f,0.0f,0.0f);
95
MiddleBound = VECTOR3D(0.0f,0.0f,0.0f);
97
DoNotCalculateRotation = false;
99
// подключаем к своему списку
101
AttachGroundObject(this);
107
//-----------------------------------------------------------------------------
109
//-----------------------------------------------------------------------------
110
CGroundObject::~CGroundObject(void)
112
if (WheelObjectsNum != 0){delete [] WheelObjectsNum; WheelObjectsNum = 0;};
113
if (WheelRotateObjectsNum != 0){delete [] WheelRotateObjectsNum; WheelRotateObjectsNum = 0;};
114
if (WeaponBound != 0){delete [] WeaponBound; WeaponBound = 0;};
116
if (TargetHorizObject != 0){delete [] TargetHorizObject; TargetHorizObject = 0;};
117
if (TargetVertObject != 0){delete [] TargetVertObject; TargetVertObject = 0;};
119
if (BarrelObject != 0){delete [] BarrelObject; BarrelObject = 0;};
121
DetachGroundObject(this);
133
//-----------------------------------------------------------------------------
134
// Установка положения объекта
135
//-----------------------------------------------------------------------------
136
void CGroundObject::SetLocation(VECTOR3D NewLocation)
138
// вызываем родительскую функцию
139
::CObject3D::SetLocation(NewLocation);
141
// если оружие вообще есть
143
for (int i=0; i<WeaponQuantity; i++)
145
if (Weapon[i] != 0) Weapon[i]->SetLocation(NewLocation + WeaponLocation[i]);
152
//-----------------------------------------------------------------------------
153
// Установка углов поворота объекта
154
//-----------------------------------------------------------------------------
155
void CGroundObject::SetRotation(VECTOR3D NewRotation)
157
// вызываем родительскую функцию
158
::CObject3D::SetRotation(NewRotation);
161
VECTOR3D RotationBase = Rotation;
162
VECTOR3D BaseBoundTMP = BaseBound;
163
RotatePoint(&BaseBoundTMP, RotationBase);
165
VECTOR3D RotationMiddle = Rotation;
166
VECTOR3D MiddleBoundTMP = MiddleBound;
167
if (TargetHorizObject != 0)
169
RotationMiddle = DrawObjectList[TargetHorizObject[0]].Rotation + Rotation;
171
RotatePoint(&MiddleBoundTMP, RotationMiddle);
173
VECTOR3D RotationWeapon = Rotation;
174
if (TargetVertObject != 0)
176
RotationWeapon = DrawObjectList[TargetVertObject[0]].Rotation + Rotation;
181
for (int i=0; i<WeaponQuantity; i++)
184
VECTOR3D WeaponBoundTMP = WeaponBound[i];
185
RotatePoint(&WeaponBoundTMP, RotationWeapon);
187
WeaponLocation[i] = BaseBoundTMP + MiddleBoundTMP + WeaponBoundTMP;
190
// особый случай, испускаем без вращающихся частей (антиматерия, ион)
191
if (TargetHorizObject == 0 && TargetVertObject == 0)
192
if (!DoNotCalculateRotation) // и если нужно считать...
194
RotationWeapon = VECTOR3D(TargetVertObjectNeedAngle, TargetHorizObjectNeedAngle, 0.0f)+Rotation;
196
Weapon[i]->SetRotation(Weapon[i]->Rotation^(-1.0f));
197
Weapon[i]->SetRotation(RotationWeapon);
199
Weapon[i]->SetLocation(Location + WeaponLocation[i]);
211
//-----------------------------------------------------------------------------
212
// Обновление данных объектa Object3D
213
//-----------------------------------------------------------------------------
214
bool CGroundObject::Update(float Time)
216
// вызываем родительскую функцию
217
// если там передали удалить - выходим
218
if (!::CObject3D::Update(Time)) return false;
219
// быстро вызвали еще раз... время не изменилось, или почти не изменилось
220
if (TimeDelta == 0.0f) return true;
226
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
228
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
229
if (StartTimeSheet != 0)
230
if (!StartTimeSheet->InUse)
232
StartTimeSheet->InUse = true;
234
NeedSpeed = StartTimeSheet->Speed;
235
NeedAcceler = StartTimeSheet->Acceler;
236
NeedRotate = StartTimeSheet->Rotation;
237
RotationSpeed = StartTimeSheet->RotationAcceler;
238
WeaponTargeting = StartTimeSheet->Targeting;
241
for (int i=0; i<WeaponQuantity; i++)
244
WeaponSetFire[i] = StartTimeSheet->Fire;
260
// если нужно наводить на цель
264
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
265
// наводим на цель, если есть возможность
266
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
268
// находимся в начальном состоянии поворота ствола
269
int WeapNum = 204; // номер самого простого из пиратского оружия
270
VECTOR3D FirePos(0.0f,0.0f,0.0f);
275
WeapNum = Weapon[0]->ObjectCreationType;
276
//FirePos = WeaponLocation[0];
280
for (int i=0; i<WeaponQuantity; i++)
283
FirePos += WeaponLocation[i];
286
FirePos = FirePos^(1.0f/Count);
288
VECTOR3D NeedAngle(TargetVertObjectNeedAngle,TargetHorizObjectNeedAngle,0);
289
if (GetTurretOnTargetOrientateion(ObjectStatus, Location+FirePos, Rotation,
290
CurrentRotationMat, &NeedAngle, WeapNum))
293
TargetHorizObjectNeedAngle = NeedAngle.y;
294
TargetVertObjectNeedAngle = NeedAngle.x;
298
// врагов нет, нужно просто поднять ствол
299
TargetVertObjectNeedAngle = TargetVertObjectMaxAngle*0.5f;
304
// устанавливаем в начальное положение
305
TargetHorizObjectNeedAngle = 0.0f;
306
TargetVertObjectNeedAngle = 0.0f;
311
// собственно повороты элементов модели на углы
313
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
314
// поворот башни по горизонтале
315
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
316
if (TargetHorizObject != 0)
317
if (TargetHorizObjectNeedAngle != TargetHorizObjectCurrentAngle)
319
if (fabsf(TargetHorizObjectNeedAngle-TargetHorizObjectCurrentAngle) > 180.0f)
321
if (TargetHorizObjectCurrentAngle - TargetHorizObjectNeedAngle > 180.0f) TargetHorizObjectCurrentAngle -= 360.0f;
322
if (TargetHorizObjectNeedAngle - TargetHorizObjectCurrentAngle > 180.0f) TargetHorizObjectCurrentAngle += 360.0f;
325
// находим угол, на который нужно повернуть
326
float NeedRotate = TargetHorizObjectCurrentAngle;
328
if (TargetHorizObjectNeedAngle>TargetHorizObjectCurrentAngle)
330
NeedRotate += 80.0f*TimeDelta/GameNPCTargetingSpeedPenalty;
331
if (NeedRotate > TargetHorizObjectNeedAngle) NeedRotate = TargetHorizObjectNeedAngle;
335
NeedRotate -= 80.0f*TimeDelta/GameNPCTargetingSpeedPenalty;
336
if (NeedRotate < TargetHorizObjectNeedAngle) NeedRotate = TargetHorizObjectNeedAngle;
339
// устанавливаем текущий поворот
340
TargetHorizObjectCurrentAngle = NeedRotate;
342
// поворачиваем все объекты
343
for (int i=0; i<TargetHorizObjectQuantity; i++)
346
VECTOR3D tmp = DrawObjectList[TargetHorizObject[i]].Location-DrawObjectList[TargetHorizObject[0]].Location;
348
RotatePointInv(&tmp, DrawObjectList[TargetHorizObject[i]].Rotation^(-1.0f));
350
SetObjectRotation(VECTOR3D(DrawObjectList[TargetHorizObject[i]].Rotation.x,
352
DrawObjectList[TargetHorizObject[i]].Rotation.z), TargetHorizObject[i]);
354
RotatePoint(&tmp, DrawObjectList[TargetHorizObject[i]].Rotation);
356
SetObjectLocation(tmp+DrawObjectList[TargetHorizObject[0]].Location, TargetHorizObject[i]);
364
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
365
// поворот стволов по вертикали
366
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
367
if (TargetVertObject != 0)
368
if (TargetVertObjectNeedAngle != TargetVertObjectCurrentAngle)
371
// находим угол, на который нужно повернуть
372
float NeedRotate = TargetVertObjectCurrentAngle;
373
if (TargetVertObjectNeedAngle>TargetVertObjectCurrentAngle)
375
NeedRotate += 80.0f*TimeDelta/GameNPCTargetingSpeedPenalty;
376
if (NeedRotate > TargetVertObjectNeedAngle) NeedRotate = TargetVertObjectNeedAngle;
377
if (NeedRotate > TargetVertObjectMaxAngle) NeedRotate = TargetVertObjectMaxAngle;
381
NeedRotate -= 80.0f*TimeDelta/GameNPCTargetingSpeedPenalty;
382
if (NeedRotate < TargetVertObjectNeedAngle) NeedRotate = TargetVertObjectNeedAngle;
383
if (NeedRotate < TargetVertObjectMinAngle) NeedRotate = TargetVertObjectMinAngle;
386
// устанавливаем текущий поворот
387
TargetVertObjectCurrentAngle = NeedRotate;
389
// поворачиваем все объекты
390
for (int i=0; i<TargetVertObjectQuantity; i++)
393
VECTOR3D tmp = DrawObjectList[TargetVertObject[i]].Location-DrawObjectList[TargetVertObject[0]].Location;
395
RotatePointInv(&tmp, DrawObjectList[TargetVertObject[i]].Rotation^(-1.0f));
397
SetObjectRotation(VECTOR3D(-NeedRotate,
398
DrawObjectList[TargetVertObject[i]].Rotation.y,
399
DrawObjectList[TargetVertObject[i]].Rotation.z), TargetVertObject[i]);
401
RotatePoint(&tmp, DrawObjectList[TargetVertObject[i]].Rotation);
403
SetObjectLocation(tmp+DrawObjectList[TargetVertObject[0]].Location, TargetVertObject[i]);
412
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
413
// находим точку стрельбы и учитываем направление
414
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
415
VECTOR3D RotationBase = Rotation;
416
VECTOR3D BaseBoundTMP = BaseBound;
417
RotatePoint(&BaseBoundTMP, RotationBase);
419
VECTOR3D RotationMiddle = Rotation;
420
VECTOR3D MiddleBoundTMP = MiddleBound;
421
if (TargetHorizObject != 0)
423
RotationMiddle = DrawObjectList[TargetHorizObject[0]].Rotation + Rotation;
425
RotatePoint(&MiddleBoundTMP, RotationMiddle);
427
VECTOR3D RotationWeapon = Rotation;
428
if (TargetVertObject != 0)
430
RotationWeapon = DrawObjectList[TargetVertObject[0]].Rotation + Rotation;
435
for (int i=0; i<WeaponQuantity; i++)
438
VECTOR3D WeaponBoundTMP = WeaponBound[i];
439
RotatePoint(&WeaponBoundTMP, RotationWeapon);
441
WeaponLocation[i] = BaseBoundTMP + MiddleBoundTMP + WeaponBoundTMP;
443
// особый случай, испускаем без вращающихся частей (антиматерия, ион)
444
if (TargetHorizObject == 0 && TargetVertObject == 0)
445
if (!DoNotCalculateRotation) // и если нужно считать...
447
RotationWeapon = Rotation - VECTOR3D(TargetVertObjectNeedAngle, TargetHorizObjectNeedAngle, 0.0f);
451
Weapon[i]->SetRotation(Weapon[i]->Rotation^(-1.0f));
452
Weapon[i]->SetRotation(RotationWeapon);
454
Weapon[i]->SetLocation(Location + WeaponLocation[i]);
462
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
463
// смотрим, есть ли команда открыть огонь
464
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
467
// если залп или игрок (игроку регулируем сами)
468
if (WeaponFireType == 1)
470
for (int i=0; i<WeaponQuantity; i++)
472
if (WeaponSetFire[i])
473
Weapon[i]->WeaponFire(Time);
475
else// переменный огонь
476
if (WeaponFireType == 2)
480
float PrimTime = 0.0f;
484
WeaponGroupCurrentFireDelay -= TimeDelta;
486
// находим кол-во оружия
487
for (int i=0; i<WeaponQuantity; i++)
491
PrimTime += Weapon[i]->NextFireTime;
492
if (FirstWeapon > i) FirstWeapon = i;
493
if (LastWeapon < i) LastWeapon = i;
495
// если еще не было начальной установки
496
if (WeaponGroupCurrentFireNum == -1) WeaponGroupCurrentFireNum = FirstWeapon;
500
for (int i=0; i<WeaponQuantity; i++)
502
if (WeaponSetFire[i])
504
if (WeaponGroupCurrentFireNum == i &&
505
WeaponGroupCurrentFireDelay <= 0.0f)
507
Weapon[i]->WeaponFire(Time);
509
WeaponGroupCurrentFireDelay = (PrimTime/PrimCount)*((1.0f+GameNPCWeaponPenalty)/2.0f);
510
WeaponGroupCurrentFireNum ++;
511
if (WeaponGroupCurrentFireNum > LastWeapon) WeaponGroupCurrentFireNum = FirstWeapon;
513
// если такого оружия нет, берем что есть
514
if (Weapon[WeaponGroupCurrentFireNum] == 0)
519
WeaponGroupCurrentFireNum ++;
520
if (WeaponGroupCurrentFireNum > LastWeapon) WeaponGroupCurrentFireNum = FirstWeapon;
521
if (Weapon[WeaponGroupCurrentFireNum] != 0) exit = true;
529
else// переменный огонь2 (залп ракет или чего-то еще)
530
if (WeaponFireType == 3)
534
float PrimTime = 0.0f;
538
WeaponGroupCurrentFireDelay -= TimeDelta;
540
// находим кол-во оружия
541
for (int i=0; i<WeaponQuantity; i++)
545
PrimTime += Weapon[i]->NextFireTime;
546
if (FirstWeapon > i) FirstWeapon = i;
547
if (LastWeapon < i) LastWeapon = i;
549
// если еще не было начальной установки
550
if (WeaponGroupCurrentFireNum == -1) WeaponGroupCurrentFireNum = FirstWeapon;
554
for (int i=0; i<WeaponQuantity; i++)
556
if (WeaponSetFire[i])
558
if (WeaponGroupCurrentFireNum == i &&
559
WeaponGroupCurrentFireDelay <= 0.0f)
561
Weapon[i]->WeaponFire(Time);
563
WeaponGroupCurrentFireDelay = PrimTime/(PrimCount*PrimCount);
564
WeaponGroupCurrentFireNum ++;
565
if (WeaponGroupCurrentFireNum > LastWeapon) WeaponGroupCurrentFireNum = FirstWeapon;
567
// если такого оружия нет, берем что есть
568
if (Weapon[WeaponGroupCurrentFireNum] == 0)
573
WeaponGroupCurrentFireNum ++;
574
if (WeaponGroupCurrentFireNum > LastWeapon) WeaponGroupCurrentFireNum = FirstWeapon;
575
if (Weapon[WeaponGroupCurrentFireNum] != 0) exit = true;
593
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
594
// вращение стволов пулемета
595
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
596
if (BarrelObjectQuantity != 0)
597
if (BarrelObject != 0)
599
for (int i=0; i<BarrelObjectQuantity; i++)
601
DrawObjectList[BarrelObject[i]].NeedGeometryAnimation = true;
602
DrawObjectList[BarrelObject[i]].GeometryAnimation += VECTOR3D(0.0f,0.0f,500.0f*TimeDelta);
603
if (DrawObjectList[BarrelObject[i]].GeometryAnimation.z > 360.0f) DrawObjectList[BarrelObject[i]].GeometryAnimation.z -= 360.0f;
611
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
612
// вращение колес в транспорте
613
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
614
if (WheelObjectsNum != 0 && (WheelTrackSpeed >= 0.00001f || WheelTrackSpeed <= -0.00001f))
616
// перебираем все и ув. их угол вращения
617
for (int i=0; i<WheelQuantity; i++)
619
DrawObjectList[WheelObjectsNum[i]].Rotation.x += WheelTrackSpeed*TimeDelta;
621
if (DrawObjectList[WheelObjectsNum[i]].Rotation.x > 360.0f) DrawObjectList[WheelObjectsNum[i]].Rotation.x -= 360.0f;
622
if (DrawObjectList[WheelObjectsNum[i]].Rotation.x < -360.0f) DrawObjectList[WheelObjectsNum[i]].Rotation.x += 360.0f;
627
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
628
// тайловая анимация для траков
629
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
630
if (TrackObjectNum != -1 && (WheelTrackSpeed >= 0.00001f || WheelTrackSpeed <= -0.00001f))
632
DrawObjectList[TrackObjectNum].NeedTextureAnimation = true;
633
DrawObjectList[TrackObjectNum].TextureAnimation.x += (WheelTrackSpeed/500.0f)*TimeDelta*TrackRotationDirection;
634
if (DrawObjectList[TrackObjectNum].TextureAnimation.x > 1.0f) DrawObjectList[TrackObjectNum].TextureAnimation.x -= 1.0f;
635
if (DrawObjectList[TrackObjectNum].TextureAnimation.x < -1.0f) DrawObjectList[TrackObjectNum].TextureAnimation.x += 1.0f;
640
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
642
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
643
if (NeedRotate.x != 0.0f || NeedRotate.y != 0.0f || NeedRotate.z != 0.0f)
645
// Находим допустимый поворот по углу
646
VECTOR3D tmpRotate(0.0f, 0.0f, 0.0f);
649
if (NeedRotate.x != 0.0f)
652
if (NeedRotate.x < 0.0f) Sign = -1.0f;
653
// вычисляем скорость поворота по данным двигателя
654
tmpRotate.x = Sign*MaxSpeedRotate*RotationSpeed.x*TimeDelta;
655
// смотрим, если уже повернули - снимаем
657
{if (tmpRotate.x >= NeedRotate.x) {tmpRotate.x = NeedRotate.x; NeedRotate.x = 0.0f;}}
658
else {if (tmpRotate.x <= NeedRotate.x) {tmpRotate.x = NeedRotate.x; NeedRotate.x = 0.0f;}}
660
if (NeedRotate.x != 0.0f) NeedRotate.x -= tmpRotate.x;
664
if (NeedRotate.y != 0.0f)
667
if (NeedRotate.y < 0.0f) Sign = -1.0f;
668
// вычисляем скорость поворота по данным двигателя
669
tmpRotate.y = Sign*MaxSpeedRotate*RotationSpeed.y*TimeDelta;
670
// смотрим, если уже повернули - снимаем
672
{if (tmpRotate.y >= NeedRotate.y) {tmpRotate.y = NeedRotate.y; NeedRotate.y = 0.0f;}}
673
else {if (tmpRotate.y <= NeedRotate.y) {tmpRotate.y = NeedRotate.y; NeedRotate.y = 0.0f;}}
675
if (NeedRotate.y != 0.0f) NeedRotate.y -= tmpRotate.y;
680
if (NeedRotate.z != 0.0f)
683
if (NeedRotate.z < 0.0f) Sign = -1.0f;
684
// вычисляем скорость поворота по данным двигателя
685
tmpRotate.z = Sign*MaxSpeedRotate*RotationSpeed.z*TimeDelta;
686
// смотрим, если уже повернули - снимаем
688
{if (tmpRotate.z >= NeedRotate.z) {tmpRotate.z = NeedRotate.z; NeedRotate.z = 0.0f;}}
689
else {if (tmpRotate.z <= NeedRotate.z) {tmpRotate.z = NeedRotate.z; NeedRotate.z = 0.0f;}}
691
if (NeedRotate.z != 0.0f) NeedRotate.z -= tmpRotate.z;
694
// установка поворота там же сохраняем, какой общий поворот модели
695
SetRotation(tmpRotate);
701
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
702
// поворот колес в транспорте
703
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
704
if (WheelRotateObjectsNum != 0)
706
// перебираем все и ув. их угол вращения
707
for (int i=0; i<WheelRotateQuantity; i++)
709
float NeedRotateY = DrawObjectList[WheelRotateObjectsNum[i]].Rotation.y;
710
if (DrawObjectList[WheelRotateObjectsNum[i]].Rotation.y > NeedRotate.y)
712
NeedRotateY -= 90.0f*TimeDelta;
713
if (NeedRotateY < NeedRotate.y)
714
NeedRotateY = NeedRotate.y;
717
if (DrawObjectList[WheelRotateObjectsNum[i]].Rotation.y < NeedRotate.y)
719
NeedRotateY += 90.0f*TimeDelta;
720
if (NeedRotateY > NeedRotate.y)
721
NeedRotateY = NeedRotate.y;
724
if (NeedRotateY>MaxWheelRotateAngle)
725
NeedRotateY = MaxWheelRotateAngle;
726
if (NeedRotateY<-MaxWheelRotateAngle)
727
NeedRotateY = -MaxWheelRotateAngle;
730
SetObjectRotation(VECTOR3D(DrawObjectList[WheelRotateObjectsNum[i]].Rotation.x,
732
DrawObjectList[WheelRotateObjectsNum[i]].Rotation.z), WheelRotateObjectsNum[i]);
747
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
748
// ускорение-замедление
749
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
751
// если нужно разогнаться, или управление на игроке - и нужно стремиться к нулю
752
if (NeedSpeed != 0.0f)
755
// нужно двигать назад
756
if (NeedSpeed < 0.0f) Sign = -1.0f;
758
// "ровняем" скорость под модель
760
{Clamp(NeedSpeed, 0.0f, MaxSpeed);}
762
{Clamp(NeedSpeed, -MaxSpeed, 0.0f);}
764
// случай, когда нужно затормозить а не менять направление
766
{if (NeedSpeed < Speed) Sign = -1.0f;}
768
{if (NeedSpeed > Speed) Sign = 1.0f;}
771
// даем полный газ, учитывая сколько процентов можем выдать
772
Acceler = Sign*MaxAcceler*NeedAcceler;
774
// считаем текущую скорость
775
Speed = Speed + Acceler*TimeDelta;
777
// смотрим, если уже разогнались - снимаем
779
{if (NeedSpeed <= Speed) {Speed = NeedSpeed; NeedSpeed = 0.0f;}}
780
else {if (NeedSpeed >= Speed) {Speed = NeedSpeed; NeedSpeed = 0.0f;}}
787
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
788
// небольшая девиация-болтание колес, если нужно
789
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
791
for (int i=0; i<DeviationObjQuantity; i++)
795
if (NeedDeviation[i] < 0.0f) Sign = -1.0f;
797
{if (NeedDeviation[i] < CurentDeviationSum[i]) Sign = -1.0f;}
799
{if (NeedDeviation[i] > CurentDeviationSum[i]) Sign = 1.0f;}
801
CurentDeviation[i] = Sign*0.35f*TimeDelta;
805
if (NeedDeviation[i] <= CurentDeviationSum[i]+CurentDeviation[i])
807
CurentDeviation[i] -= CurentDeviationSum[i]+CurentDeviation[i]-NeedDeviation[i];
808
CurentDeviationSum[i] += CurentDeviation[i];
809
NeedDeviation[i] = vw_Randf0*0.1f;
811
else CurentDeviationSum[i] += CurentDeviation[i];
815
if (NeedDeviation[i] >= CurentDeviationSum[i]+CurentDeviation[i])
817
CurentDeviation[i] += CurentDeviationSum[i]+CurentDeviation[i]-NeedDeviation[i];
818
CurentDeviationSum[i] += CurentDeviation[i];
819
NeedDeviation[i] = vw_Randf0*0.1f;
821
else CurentDeviationSum[i] += CurentDeviation[i];
824
VECTOR3D Tmp = Deviation[i]^CurentDeviation[i];
825
SetObjectLocation(DrawObjectList[DeviationObjNum[i]].Location + Tmp, DeviationObjNum[i]);
837
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
838
// считаем вектор движения
839
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
840
//VECTOR3D Velocity = (Orientation^(Speed*TimeDelta))+(VECTOR3D(0.0f,0.0f,10.0f)^TimeDelta);
841
VECTOR3D Velocity = (Orientation^(Speed*TimeDelta));
843
// перемещение объекта, если нужно
844
if (Velocity.x != 0.0f || Velocity.y != 0.0f || Velocity.z != 0.0f )
846
WheelTrackSpeed = Speed*SpeedToRotate;
847
// делаем сдвиг модели в указанную точку
848
SetLocation(Location+Velocity);
855
// объект в порядке - удалять не нужно