/** * @brief Changes the direction of the movement vector, keeping the same speed. * * x_speed and y_speed are recomputed so that the total speed is unchanged. * Warning: if x_speed and y_speed are both equal to zero, this function * stops the program on an error message. * * @param angle the new movement direction in radians */ void StraightMovement::set_angle(double angle) { if (!is_stopped()) { double speed = get_speed(); set_x_speed(speed * std::cos(angle)); set_y_speed(-speed * std::sin(angle)); } this->angle = angle; notify_movement_changed(); }
/** * @brief Sets the speed to zero. */ void StraightMovement::stop() { double old_angle = this->angle; set_x_speed(0); set_y_speed(0); x_move = 0; y_move = 0; this->angle = old_angle; notify_movement_changed(); }
/** * @brief Sets the speed to zero. */ void StraightMovement::stop() { double old_angle = this->angle; set_x_speed(0); set_y_speed(0); x_move = 0; y_move = 0; this->angle = old_angle; if (get_entity() != NULL) { get_entity()->notify_movement_changed(); } }
/** * @brief Changes the speed, keeping the same direction of the movement. * * x_speed and y_speed are recomputed so that the movement direction is unchanged. * * @param speed the new speed */ void StraightMovement::set_speed(double speed) { if (x_speed == 0 && y_speed == 0) { x_speed = 1; } // compute the new speed vector double old_angle = this->angle; set_x_speed(speed * std::cos(old_angle)); set_y_speed(-speed * std::sin(old_angle)); this->angle = old_angle; notify_movement_changed(); }