void Hovering::move(Map *map) { switch(m_action) { case Still: set_action(Move); break; case Move: face_reference(get_attribute("turn_width")); animate_move(); if (m_dir == Right) { if (m_x < m_x1) { set_vx(get_attribute("move_speed")); } else { set_vx(0); } } else { if (m_x > m_x0) { set_vx(-get_attribute("move_speed")); } else { set_vx(0); } } if (m_attack_timer.expired(get_attribute("attack_timer"))) { int dist = get_attribute("attack_distance"); int x = m_xref - get_front(); int y = m_yref - get_y(); if (x * x + y * y < dist * dist) { fire(); } } Body::move(map); break; case Hit: case HitPerish: set_vy(0); process_hit(); Monster::move(map); break; default: break; } // Move bullets unsigned n = m_bullets.size(); for (unsigned i = 0; i < n; i++) { m_bullets[i]->move(map); } }
void Monster::move(Map *map) { switch(m_action) { case Still: set_vx(0); break; case Move: Body::move(map); if (get_fall()) { set_action(Fall); } break; case Fall: Body::move(map); if (!get_fall()) { m_hit_ground = true; set_vx(0); set_action(Still); } break; case Jump: Body::move(map); if (get_fall()) { set_action(Fall); } break; case Hit: case HitPerish: process_hit(); Body::move(map); break; default: break; } }
void Waver::move(Map *map) { switch(m_action) { case Still: set_action(Move); break; case Move: face_reference(get_attribute("turn_width")); animate_move(); if (m_dir == Right) { set_vx(get_move_speed(map)); } else { set_vx(-get_move_speed(map)); } m_wave_index += get_attribute("frequency"); if (m_wave_index >= c_num_steps) { m_wave_index = m_wave_index - c_num_steps; } set_vy(get_attribute("amplitude") * m_wave_y[m_wave_index] / 16); Body::move(map); break; case Hit: case HitPerish: set_ay(0); set_vy(0); process_hit(); Monster::move(map); break; default: break; } }