1
2 #include "missile.h"
3
4 #include "resources.h"
5
6 #include "game.h"
7
8
9 float Missile::m_scale = 0.04;
10
Missile(vec2 start_pos,vec2 dest,float radius)11 Missile::Missile(vec2 start_pos,vec2 dest,float radius) :
12 m_start_pos(start_pos),m_pos(m_start_pos),m_start_time(g_timer->now()),
13 m_dest_pos(dest), m_alive(true), m_exploding(false), m_radius(radius),
14 m_explosion_start(0.0),
15 m_explosion_circle(Circle(vec2(0.0,0.0),0.0))
16
17 {
18 m_velocity = 0.25;
19 m_vector = normalized(dest - start_pos);
20 m_angle = acos( dot( normalized(vec2(+1.0,0.0)),m_vector ) );
21 m_model = &g_resources.mesh_missile;
22 m_angle += M_PI;
23 m_explosion_duration = 0.4;
24 m_len = length(m_dest_pos - m_start_pos);
25 }
26
update(float t)27 void Missile::update(float t)
28 {
29 float tdiff = t - m_start_time;
30
31 if (m_alive) {
32 m_pos = m_start_pos + m_vector * (tdiff * m_velocity);
33 float len = length(m_pos - m_start_pos);
34 if (len>=m_len) {
35 explode();
36 }
37 }
38
39 if (m_exploding) {
40 float explosion_time_0_1 = (g_timer->now() - m_explosion_start) / m_explosion_duration;
41
42 m_explosion_circle = Circle(m_dest_pos, m_radius * explosion_time_0_1);
43
44 if (g_timer->now() > (m_explosion_start + m_explosion_duration)) {
45 m_exploding = false;
46 }
47 }
48 }
49
draw(void)50 void Missile::draw(void)
51 {
52 if (!m_alive) return;
53
54 glPushMatrix();
55
56 glColor4f(0,0,0,1.0);
57 glBlendFunc(GL_ZERO,GL_ONE_MINUS_SRC_ALPHA );
58 glEnable(GL_BLEND);
59
60 // missile
61 glTranslatef(m_pos[0],m_pos[1],0.0);
62 glScalef(m_scale,m_scale,1.0);
63 glRotatef(m_angle * 180.0/M_PI,0,0,1);
64
65 (*m_model)->draw();
66
67 glDisable(GL_BLEND);
68
69 glPopMatrix();
70 }
71
draw_path(void)72 void Missile::draw_path(void)
73 {
74 if (!m_alive) return;
75
76 draw_aa_line(Line(m_dest_pos,m_pos),2.0,vec4(1.0,1.0,1.0,1.0),16.0);
77 }
78
draw_dest(void)79 void Missile::draw_dest(void)
80 {
81 if (!m_alive) return;
82
83 glLoadIdentity();
84 glColor4f(1,1,1,1);
85 glTranslatef(m_dest_pos[0],m_dest_pos[1],0.0);
86 draw_textured_quad(m_radius*2.01, g_resources.texture_missile_mark,true);
87 glLoadIdentity();
88 }
89
alive(void)90 bool Missile::alive(void)
91 {
92 return m_alive;
93 }
94
exploding(void)95 bool Missile::exploding(void)
96 {
97 return m_exploding;
98 }
99
explode(void)100 void Missile::explode(void)
101 {
102 m_exploding = true;
103 m_alive = false;
104 m_explosion_start = g_timer->now();
105
106 if (g_current_game)
107 g_current_game->add_effect(new FX_Missile_Explosion(m_pos), 0);
108 }
109
110