Starshatter_Open
Open source Starshatter engine
Main Page
Classes
Files
File List
File Members
All
Classes
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
LandingGear.cpp
Go to the documentation of this file.
1
/* Project Starshatter 4.5
2
Destroyer Studios LLC
3
Copyright © 1997-2004. All Rights Reserved.
4
5
SUBSYSTEM: Stars.exe
6
FILE: LandingGear.cpp
7
AUTHOR: John DiCamillo
8
9
10
OVERVIEW
11
========
12
LandingGear System class
13
*/
14
15
#include "
MemDebug.h
"
16
#include "
LandingGear.h
"
17
#include "
Ship.h
"
18
#include "
Sim.h
"
19
#include "
AudioConfig.h
"
20
21
#include "
DataLoader.h
"
22
#include "
Physical.h
"
23
#include "
Scene.h
"
24
#include "
Sound.h
"
25
#include "
Game.h
"
26
27
static
Sound
* gear_transit_sound = 0;
28
29
// +----------------------------------------------------------------------+
30
31
LandingGear::LandingGear
()
32
:
System
(MISC_SYSTEM, 0,
"Landing Gear"
, 1, 1, 1, 1),
33
state(GEAR_UP), transit(0), ngear(0), clearance(0)
34
{
35
name
=
Game::GetText
(
"sys.landing-gear"
);
36
abrv
=
Game::GetText
(
"sys.landing-gear.abrv"
);
37
38
for
(
int
i = 0; i <
MAX_GEAR
; i++) {
39
models
[i] = 0;
40
gear
[i] = 0;
41
}
42
}
43
44
// +----------------------------------------------------------------------+
45
46
LandingGear::LandingGear
(
const
LandingGear
& g)
47
:
System
(g), state(GEAR_UP), transit(0), ngear(g.ngear), clearance(0)
48
{
49
Mount
(g);
50
SetAbbreviation
(g.
Abbreviation
());
51
int
i;
52
53
for
(i = 0; i <
ngear
; i++) {
54
models
[i] = 0;
55
gear
[i] =
new
(__FILE__,__LINE__)
Solid
;
56
start
[i] = g.
start
[i];
57
end
[i] = g.
end
[i];
58
59
gear
[i]->
UseModel
(g.
models
[i]);
60
61
if
(
clearance
>
end
[i].y)
62
clearance
=
end
[i].
y
;
63
}
64
65
while
(i <
MAX_GEAR
) {
66
models
[i] = 0;
67
gear
[i] = 0;
68
i++;
69
}
70
71
clearance
+=
mount_rel
.
y
;
72
}
73
74
// +--------------------------------------------------------------------+
75
76
LandingGear::~LandingGear
()
77
{
78
for
(
int
i = 0; i <
MAX_GEAR
; i++) {
79
delete
models
[i];
80
81
if
(
gear
[i]) {
82
Solid
* g =
gear
[i];
83
84
if
(g->
GetScene
())
85
g->
GetScene
()->
DelGraphic
(g);
86
delete
g;
87
}
88
}
89
}
90
91
// +--------------------------------------------------------------------+
92
93
void
94
LandingGear::Initialize
()
95
{
96
if
(!gear_transit_sound) {
97
DataLoader
* loader =
DataLoader::GetLoader
();
98
loader->
SetDataPath
(
"Sounds/"
);
99
loader->
LoadSound
(
"GearTransit.wav"
, gear_transit_sound);
100
}
101
}
102
103
// +--------------------------------------------------------------------+
104
105
void
106
LandingGear::Close
()
107
{
108
delete
gear_transit_sound;
109
gear_transit_sound = 0;
110
}
111
112
// +--------------------------------------------------------------------+
113
114
int
115
LandingGear::AddGear
(
Model
* m,
const
Point
& s,
const
Point
& e)
116
{
117
if
(
ngear
<
MAX_GEAR
) {
118
models
[
ngear
] = m;
119
start
[
ngear
] = s;
120
end
[
ngear
] = e;
121
122
ngear
++;
123
}
124
125
return
ngear
;
126
}
127
128
// +--------------------------------------------------------------------+
129
130
void
131
LandingGear::SetState
(
GEAR_STATE
s)
132
{
133
if
(
state
!= s) {
134
state
= s;
135
136
if
(
ship
&&
ship
==
Sim::GetSim
()->GetPlayerShip()) {
137
if
(
state
==
GEAR_LOWER
||
state
==
GEAR_RAISE
) {
138
if
(gear_transit_sound) {
139
Sound
* sound = gear_transit_sound->
Duplicate
();
140
sound->
SetVolume
(
AudioConfig::EfxVolume
());
141
sound->
Play
();
142
}
143
}
144
}
145
}
146
}
147
148
// +--------------------------------------------------------------------+
149
150
void
151
LandingGear::ExecFrame
(
double
seconds)
152
{
153
System::ExecFrame
(seconds);
154
155
switch
(
state
) {
156
case
GEAR_UP
:
157
transit
= 0;
158
break
;
159
160
case
GEAR_DOWN
:
161
transit
= 1;
162
break
;
163
164
case
GEAR_LOWER
:
165
if
(
transit
< 1) {
166
transit
+= seconds;
167
168
Scene
* s = 0;
169
if
(
ship
&&
ship
->
Rep
())
170
s =
ship
->
Rep
()->
GetScene
();
171
172
if
(s) {
173
for
(
int
i = 0; i <
ngear
; i++) {
174
if
(
gear
[i] && !
gear
[i]->GetScene()) {
175
s->
AddGraphic
(
gear
[i]);
176
}
177
}
178
}
179
}
180
else
{
181
transit
= 1;
182
state
=
GEAR_DOWN
;
183
}
184
break
;
185
186
case
GEAR_RAISE
:
187
if
(
transit
> 0) {
188
transit
-= seconds;
189
}
190
else
{
191
transit
= 0;
192
state
=
GEAR_UP
;
193
194
for
(
int
i = 0; i <
ngear
; i++) {
195
if
(
gear
[i]) {
196
Scene
* s =
gear
[i]->
GetScene
();
197
if
(s) s->
DelGraphic
(
gear
[i]);
198
}
199
}
200
}
201
break
;
202
}
203
}
204
205
// +--------------------------------------------------------------------+
206
207
void
208
LandingGear::Orient
(
const
Physical
* rep)
209
{
210
System::Orient
(rep);
211
212
const
Matrix
& orientation = rep->
Cam
().
Orientation
();
213
Point
ship_loc = rep->
Location
();
214
215
for
(
int
i = 0; i <
ngear
; i++) {
216
Point
gloc;
217
if
(
transit
< 1) gloc =
start
[i] + (
end
[i]-
start
[i])*
transit
;
218
else
gloc =
end
[i];
219
220
Point
projector = (gloc * orientation) + ship_loc;
221
if
(
gear
[i]) {
222
gear
[i]->
MoveTo
(projector);
223
gear
[i]->
SetOrientation
(orientation);
224
}
225
}
226
}
227
228
// +--------------------------------------------------------------------+
229
230
Solid
*
231
LandingGear::GetGear
(
int
index)
232
{
233
if
(index >= 0 && index <
ngear
) {
234
Solid
* g =
gear
[index];
235
return
g;
236
}
237
238
return
0;
239
}
240
241
// +--------------------------------------------------------------------+
242
243
Point
244
LandingGear::GetGearStop
(
int
index)
245
{
246
if
(index >= 0 && index <
ngear
) {
247
Solid
* g =
gear
[index];
248
249
if
(g)
250
return
g->
Location
();
251
}
252
253
return
Point
();
254
}
255
256
// +--------------------------------------------------------------------+
257
258
double
259
LandingGear::GetTouchDown
()
260
{
261
double
down = 0;
262
263
if
(
ship
) {
264
down =
ship
->
Location
().
y
;
265
266
if
(
state
!=
GEAR_UP
) {
267
for
(
int
i = 0; i <
ngear
; i++) {
268
if
(
gear
[i]) {
269
Point
stop =
gear
[i]->
Location
();
270
271
if
(stop.
y
< down)
272
down = stop.
y
;
273
}
274
}
275
}
276
}
277
278
return
down;
279
}
Stars45
LandingGear.cpp
Generated on Tue Jun 5 2012 20:46:55 for Starshatter_Open by
1.8.1