Ejemplo n.º 1
0
  private void update() {
    if (renderer.shouldRestart()) {
      restart();

      renderer.setSpeedX(0.0);
      renderer.setSpeedY(0.0);
      renderer.setMagnusForce(0.0);
      renderer.refreshInformationPanel();

      renderer.resetRestartFlag();
      renderer.stop();
    }
    if (renderer.shouldClearTrajectories()) {
      clearTrajectories();
      renderer.resetClearTrajectoriesFlag();
    }
    if (renderer.hasStarted()) {
      if (!gameOver) {
        synchronized (ballLock) {
          Vector gravitationalForce = new Vector(0.0, -9.81 * ball.getMass());
          Vector frictionForce = Vector.product(-dragCoefficient, ball.getSpeed());
          Vector magnusForceTmp =
              Vector.product(MAGNUS_COEFFICIENT * ball.getFrequency(), ball.getSpeed());
          Vector magnusForce = new Vector(-magnusForceTmp.y, magnusForceTmp.x);

          renderer.setSpeedX(ball.getSpeed().x);
          renderer.setSpeedY(ball.getSpeed().y);
          renderer.setMagnusForce(magnusForce.length());
          renderer.refreshInformationPanel();

          ball.applyForce(Vector.sum(Vector.sum(gravitationalForce, frictionForce), magnusForce));
          ball.update();
          if (ball.getPosition().x <= 0.0) {
            gameOver = true;
          }
          double dy = ball.getPosition().y - ball.getSize().y / 2 - GROUND_Y;
          if (dy <= 0.0) {
            double t = dy / ball.getSpeed().y;
            double dx = t * ball.getSpeed().x;
            Point newPosition = ball.getPosition();
            newPosition.x -= dx;
            newPosition.y -= dy;
            ball.setPosition(newPosition);
            gameOver = true;
          }
          currentTrajectory.addPoint(ball.getPosition());

          renderer.getTrajectoriesTableModel().refreshCell(trajectories.size() - 1, 1);
          renderer.getTrajectoriesTableModel().refreshCell(trajectories.size() - 1, 2);
        }
      }
    } else {
      double initialSpeedX = renderer.getInitialSpeed() * Math.cos(renderer.getInitialDirection());
      double initialSpeedY = renderer.getInitialSpeed() * Math.sin(renderer.getInitialDirection());
      dragCoefficient = renderer.getDragCoefficient();
      synchronized (ballLock) {
        ball.setSpeed(new Vector(initialSpeedX, initialSpeedY));
        ball.setFrequency(renderer.getFrequency());
      }
    }
  }