void NPC::refresh_move_interval(void) { if(get_move_speed() >= 25) { double x_interval, y_interval, s_interval; double time_speed = get_move_speed(); // 每毫秒移动多少像素 double frames_speed = time_speed/interval; // 每帧移动像素 // x_interval = (1000.0 / interval) * ceil(grid_width / round(frames_speed)); // x向移动一格所需毫秒 // y_interval = (1000.0 / interval) * ceil(grid_height / round(frames_speed)); // y向移动一格所需毫秒 // s_interval = (1000.0 / interval) * ceil(grid_s / round(frames_speed)); // 斜向移动一格所需毫秒 x_interval = (1000.0 / interval) * (10 / frames_speed); // x向移动一格所需毫秒 y_interval = (1000.0 / interval) * (grid_height / frames_speed); // y向移动一格所需毫秒 s_interval = (1000.0 / interval) * (grid_s / frames_speed); // 斜向移动一格所需毫秒 if (x_interval/1000 < 0 || x_interval * 1000 <= 0) { MSG_USER_TRACE("ERROR_9 error speed:%d x_interval:%ld", get_move_speed(), x_interval); return ; } if (y_interval/1000 < 0 || y_interval * 1000 <= 0) { MSG_USER_TRACE("ERROR_9 error speed:%d y_interval:%ld", get_move_speed(), y_interval); return ; } if (s_interval/1000 < 0 || s_interval * 1000 <= 0) { MSG_USER_TRACE("ERROR_9 error speed:%d s_interval:%ld", get_move_speed(), s_interval); return ; } move_interval[0].set(x_interval/1000, x_interval * 1000); move_interval[1].set(y_interval/1000, y_interval * 1000); move_interval[2].set(s_interval/1000, s_interval * 1000); } else { move_interval[0] = Time_Value::zero; move_interval[1] = Time_Value::zero; move_interval[2] = Time_Value::zero; } }
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; } }
void MummyDragon::move(Map *map) { Monster::move(map); switch(m_action) { case Still: set_action(Move); break; case Move: if (m_is_flying) { set_speed(0, m_fly_speed); if (m_fly_timer.check(m_fly_time) || m_y < m_top || m_y > m_bottom) { m_fly_timer.reset(); m_is_flying = false; } } else { if (get_left() < m_left || get_right() > m_right) { swap_move_dir(); if (m_turn_counter.expired(get_attribute("num_turns"))) { m_fly_time = 600; if (m_y < m_top + 100) { m_fly_speed = get_attribute("fly_speed"); } else { m_fly_speed = -get_attribute("fly_speed"); } m_is_flying = true; } else { m_attack_timer.enable(true); } } if (m_dir == Right) { set_speed(get_move_speed(map), 0); } else { set_speed(-get_move_speed(map), 0); } } animate_move(); if (m_attack_timer.expired(get_attribute("attack_timer"))) { m_attack_timer.enable(false); set_attack(); } break; case Attack: fire(); break; case Hit: m_fly_time = get_attribute("fly_time_after_hit"); m_fly_speed = -get_attribute("fly_speed"); m_is_flying = true; break; default: break; } unsigned n = m_bullets.size(); for (unsigned i = 0; i < n; i++) { m_bullets[i]->move(map); } }