forked from devpack/mayhem
-
Notifications
You must be signed in to change notification settings - Fork 2
/
physics.cpp
executable file
·112 lines (101 loc) · 4.41 KB
/
physics.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
#include "physics.h"
#include "allegro_compatibility.h"
physics_constants::physics_constants(float g, float xfrott, float yfrott,
float coeffax, float coeffvx,
float coeffay, float coeffvy,
float coeffimpact) {
iG = ftofix(g);
iXfrott = ftofix(xfrott);
iYfrott = ftofix(yfrott);
iCoeffax = ftofix(coeffax);
iCoeffay = ftofix(coeffay);
iCoeffvx = ftofix(coeffvx);
iCoeffvy = ftofix(coeffvy);
iCoeffimpact = ftofix(coeffimpact);
}
void calcul_pos(const physics_constants &physics, int nbvaisseau,
struct vaisseau_data *vaisseau,
struct platform_data platforms[], int nbplatforms, double dt) {
while (nbvaisseau--) {
vaisseau->rebound = false;
if (!vaisseau->explode)
if (!vaisseau->landed) {
vaisseau->ax =
fixmul(vaisseau->thrust,
fixsin(itofix(vaisseau->angle))); // ax = thrust * sin�
vaisseau->ay = fixadd(
physics.iG,
fixmul(
vaisseau->thrust,
-fixcos(itofix(vaisseau->angle)))); // ay = g + thrust * (-cos�)
// gestion impact
if (vaisseau->impactx || vaisseau->impacty) {
vaisseau->ax =
fixadd(vaisseau->ax,
fixmul(physics.iCoeffimpact, itofix(vaisseau->impactx)));
vaisseau->ay =
fixadd(vaisseau->ay,
fixmul(physics.iCoeffimpact, itofix(vaisseau->impacty)));
vaisseau->impactx = vaisseau->impacty = 0;
}
vaisseau->vx =
fixadd(vaisseau->vx, fixmul(physics.iCoeffax, vaisseau->ax) *
(dt / 0.025)); // vx += coeffa * ax
vaisseau->vy =
fixadd(vaisseau->vy, fixmul(physics.iCoeffay, vaisseau->ay) *
(dt / 0.025)); // vy += coeffa * ay
vaisseau->vx =
fixmul(vaisseau->vx, physics.iXfrott); // on freine de xfrott
vaisseau->vy =
fixmul(vaisseau->vy, physics.iYfrott); // on freine de yfrott
vaisseau->xposprecise = fixadd(vaisseau->xposprecise,
fixmul(physics.iCoeffvx, vaisseau->vx) *
(dt / 0.025)); // xpos += coeffv * vx
vaisseau->yposprecise = fixadd(vaisseau->yposprecise,
fixmul(physics.iCoeffvy, vaisseau->vy) *
(dt / 0.025)); // ypos += coeffv * vy
} else {
vaisseau->ax = itofix(0); // on
vaisseau->ay = itofix(0); // est
vaisseau->vx = itofix(0); // pose
vaisseau->vy = itofix(0); // !!!
}
// transfer to screen coordinates
vaisseau->xpos = fixtoi(vaisseau->xposprecise);
vaisseau->ypos = fixtoi(vaisseau->yposprecise);
int i;
for (i = 0; i < nbplatforms; i++) {
vaisseau->rebound |= test_landed(vaisseau, &platforms[i]);
}
vaisseau++;
}
}
//----------------------------------------------------------------------------//
// TEST SI POSE SUR PLATEFORME //
// updates ship speed if posed
// returns TRUE if rebound (or landed)
//----------------------------------------------------------------------------//
bool test_landed(struct vaisseau_data *vaisseau, struct platform_data *plt) {
int xmin = plt->xmin - 9; // centrage
int xmax = plt->xmax - 23; // centrage
int yflat = plt->yflat - 29; // centrage
if ((xmin <= vaisseau->xpos) && (vaisseau->xpos <= xmax) &&
((vaisseau->ypos == yflat) || ((vaisseau->ypos - 1) == yflat) ||
((vaisseau->ypos - 2) == yflat) || ((vaisseau->ypos - 3) == yflat)) &&
(vaisseau->vy > 0) &&
(vaisseau->angle <= 20 || vaisseau->angle >= 340)) {
vaisseau->vy = -fixdiv(vaisseau->vy, ftofix(1.2));
vaisseau->vx = fixdiv(vaisseau->vx, ftofix(1.1));
vaisseau->angle = 0;
vaisseau->angle_precise = 0;
vaisseau->ypos = yflat;
vaisseau->yposprecise = itofix(yflat);
float vvx = fixtof(vaisseau->vx);
float vvy = fixtof(vaisseau->vy);
if ((-1.0 <= vvx) && (vvx < 1.0) && (-1.0 < vvy) && (vvy < 1.0)) {
vaisseau->landed = true;
}
return true;
}
return false;
}