Exemplo n.º 1
0
/* ----------------------------------------------------------------------------
 * Emits the particles, regardless of the timer.
 * manager: The particle manager to place these particles on.
 */
void particle_generator::emit(particle_manager &manager) {
    size_t final_nr =
        max(
            0,
            (int) number +
            randomi((int) (0 - number_deviation), (int) number_deviation)
        );
        
    for(size_t p = 0; p < final_nr; ++p) {
        particle new_p = base_particle;
        
        new_p.duration =
            max(
                0.0f,
                new_p.duration +
                randomf(-duration_deviation, duration_deviation)
            );
        new_p.time = new_p.duration;
        new_p.friction +=
            randomf(-friction_deviation, friction_deviation);
        new_p.gravity +=
            randomf(-gravity_deviation, gravity_deviation);
        new_p.x +=
            randomf(-x_deviation, x_deviation);
        new_p.y +=
            randomf(-y_deviation, y_deviation);
        new_p.size =
            max(
                0.0f,
                new_p.size +
                randomf(-size_deviation, size_deviation)
            );
        //For speed, let's decide if we should use
        //(speed_x and speed_y) or (speed and angle).
        //We'll use whichever one is not all zeros.
        if(angle != 0 || speed != 0) {
            angle_to_coordinates(
                angle + randomf(-angle_deviation, angle_deviation),
                speed + randomf(-speed_deviation, speed_deviation),
                &new_p.speed_x, &new_p.speed_y
            );
        } else {
            new_p.speed_x +=
                randomf(-speed_x_deviation, speed_x_deviation);
            new_p.speed_y +=
                randomf(-speed_y_deviation, speed_y_deviation);
        }
        
        manager.add(new_p);
    }
}
Exemplo n.º 2
0
/* ----------------------------------------------------------------------------
 * Returns the values of the coordinates, magnitude, and angle,
 * but "cleaned" up.
 * All parameters are mandatory.
 */
void movement_struct::get_clean_info(
    point* coords, float* angle, float* magnitude
) {
    get_raw_info(coords, angle, magnitude);
    *magnitude =
        clamp(*magnitude, joystick_min_deadzone, joystick_max_deadzone);
    *magnitude =
        interpolate_number(
            *magnitude,
            joystick_min_deadzone, joystick_max_deadzone,
            0.0f, 1.0f
        );
    *coords = angle_to_coordinates(*angle, *magnitude);
}