private static void start() {
   CollisionEffect.kill();
   level.reset();
   double xSpeed = CalcHelp.gaussianDouble(3.5, 1);
   double ySpeed = CalcHelp.randomDouble(-1, 1);
   level.getBall().setVelocity(new Vector2d(xSpeed, ySpeed));
   level.getBall().setLaunched(true);
 }
  /**
   * Starts the effect.
   *
   * @param currentLevel the level the effect is taking place on
   */
  public static void start(Level currentLevel) {
    started = true;
    CollisionEffect.currentLevel = currentLevel;
    Point2d shift = currentLevel.getShift();
    Ball ball = currentLevel.getBall();
    Body intersected = currentLevel.getIntersectingBody();
    particles = Particle.generateParticles(ball, intersected);
    shakeValues = new double[6];
    double speed = ball.getVelocity().magnitude();

    if (speed < .25) speed = .25;
    if (speed > 2.5) speed = 2.5;

    double shakeFactor = 3 * speed / currentLevel.getFollowFactor();
    if (currentLevel.getFollowFactor() == 0.0) shakeFactor = .25 * speed;
    // 1st value is multiplicative factor
    int sign1 = -1;
    if (ball.getCenter().x() + shift.x() < 0) {
      sign1 = 1;
    } else if (ball.getCenter().x() + shift.x() > 0) {
      sign1 = CalcHelp.randomSign();
    }
    shakeValues[0] = CalcHelp.randomDouble(35, 40) * shakeFactor * sign1;

    int sign2 = -1;
    if (ball.getCenter().y() + shift.y() < 0) {
      sign2 = 1;
    } else if (ball.getCenter().y() + shift.y() > 0) {
      sign2 = CalcHelp.randomSign();
    }
    shakeValues[3] = CalcHelp.randomDouble(35, 40) * shakeFactor * sign2;

    // 2nd value is sinusoidal factor
    shakeValues[1] = CalcHelp.randomDouble(45, 50);
    shakeValues[4] = CalcHelp.randomDouble(45, 50);

    // 3rd value is exponential factor
    shakeValues[2] = CalcHelp.randomDouble(-.0035, -.0045);
    shakeValues[5] = CalcHelp.randomDouble(-.0035, -.0045);

    startTime = System.currentTimeMillis();
    ball.setLaunched(false);
  }