-
Notifications
You must be signed in to change notification settings - Fork 0
/
Rocket.cpp
125 lines (109 loc) · 2.85 KB
/
Rocket.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include "Rocket.h"
Rocket::Rocket()
//нужна пустая реализация конструктора
{} //чтобы линковщик не запутался
Rocket::Rocket(int i, char *filename)
{
num = i;
alive = false;//ракета деактивирована
burn = false;
Xpos = 0;
Ypos = 0;
Zpos = 0;
Ydeg = 0;
start_time = GetTickCount();
if (num == myrocket)//первая ракета
{
dbLoadObject(filename,num);//загружаем её из файла,
}
else //так как все ракеты одинаковы, то...
{
dbCloneObject(num, myrocket);
//...остальные копируем с первой
}
dbHideObject(num);//скрываем
dbPositionObject(num, Xpos, Ypos, Zpos);
dbYRotateObject(num, Ydeg);
}
Rocket::~Rocket()//деструктор:
//обнуляем все данные-члены, уничтожаем объект
{
dbDeleteObject(num);
num = 0;
alive = false;//ракета деактивирована
burn = false;
Xpos = 0;
Ypos = 0;
Zpos = 0;
Ydeg = 0;
start_time = 0;
}
void Rocket::Draw(int terrain)//манипуляции над
//ракетой: вычисление и установка местаположения
//и т.д.
{
const float rocketSpeed = 1.1;//скрость перемещения
//ракеты
const int RockToLive = 3000;
if (alive) { //если ракета активизирована,
//то показываем её и
dbShowObject(num);// производим манипуляции над ней
dbMoveObject(num, rocketSpeed);
Xpos = dbObjectPositionX(num);
Ypos = dbObjectPositionY(num);
Zpos = dbObjectPositionZ(num);
float ground = dbGetTerrainGroundHeight(terrain,
Xpos,// переменная, хранящая высоту
Zpos);// поверхности ландшафта
if (ground >= Ypos) {
// произошло столкновение с поверхностью
Die();
}
dbPositionObject(num, Xpos,// перемещаем ракету
Ypos, Zpos);
if ((GetTickCount() - start_time) > RockToLive)
Die();
} else dbHideObject(num);//иначе скрываем её
}
void Rocket::Fire(float x, float y, float z,
float deg)//выстрел - начало жизни ракеты
{
if (!alive) {
alive = true;
PlaySound(RobotShort, x, y, z);
//вызываем "звуковую" функцию
start_time = GetTickCount();//отмечаем время вылета
// отдельная функция создана со взглядом на будущее
// вдруг потом понадобится сделать во время выстрела
// что-то ещё кроме позиционарования
Pos(x, y, z, deg);
}
}
void Rocket::Pos(float x, float y, float z,
float deg)//фунция позиционирования объекта-ракеты
{
Xpos = x;
Ypos = y;
Zpos = z;
Ydeg = deg;
dbPositionObject(num, Xpos, Ypos, Zpos);
//позиционирование в мировых координатах
dbMoveObject(num, 2);//относительное смещение -
dbMoveObjectRight(num, 2);//позиционирование
dbMoveObjectUp(num, 2.5);//в локальных координатах
dbYRotateObject(num, Ydeg);
}
void Rocket::Die()//конец текущей жизни ракеты
{
burn = true;//горение
PlaySound(RocketExplode, Xpos, Ypos, Zpos);
//вызываем "звуковую" функцию
alive = false;
}
void Rocket::PlaySound(int sound, float x, float y,
float z)//проигрывает звук, переданный в качестве
//первого параметра, и перемещает
{// его в позицию так же заданную параметрами
dbPositionSound(sound, x, y, z);//перемещение
dbPlaySound(sound);//собственно, запускает музыку
}