Dasher::Dasher() { Assert(std::fabs(ServerParam::instance().dashAngleStep() - 45.0) < FLOAT_EPS); for (int i = 0; i < 8; ++i) { DASH_DIR[i] = GetNormalizeAngleDeg(ServerParam::instance().dashAngleStep() * i); DIR_RATE[i] = GetDashDirRate(DASH_DIR[i]); } for (int i = 0; i < 8; ++i) { ANTI_DIR_IDX[i] = GetDashDirIdx(DASH_DIR[i] + 180.0); } }
/** * 通过传入dash的参数,计算dash后球员的位置和速度 * Calculate player position and velocity after a dash action. Conflicts or forbidden areas are not * considered. * \param dash_power. * \param dash_dir. * \param player_state state of the player who is dashing. * \param player_pos will be set to player position after dash. * \param player_vel will be set to player velocity after dash. */ void ActionEffector::ComputeInfoAfterDash(const double dash_power, double dash_dir, const PlayerState &player_state, Vector &player_pos, Vector &player_vel) { double dir_rate = GetDashDirRate(dash_dir); if (dash_power < 0.0) { dash_dir += 180.0; } double eff_dash_power = fabs(dash_power) * player_state.GetEffort() * player_state.GetDashPowerRate() * dir_rate; Vector accel = Polar2Vector(eff_dash_power, GetNormalizeAngleDeg(player_state.GetBodyDir() + dash_dir)); player_vel = player_state.GetVel() + accel; player_pos = player_state.GetPos() + player_vel; player_vel *= player_state.GetPlayerDecay(); }