/* ---------------------------------------------------------------------------- * 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); } }
/* ---------------------------------------------------------------------------- * 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); }