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