private void restart() { currentTrajectory = new Trajectory(ColorGenerator.getInstance().next()); gameOver = false; ball.setPosition(new Point(INITIAL_BALL_POSITION)); currentTrajectory.addPoint(ball.getPosition()); synchronized (trajectoriesLock) { trajectories.add(currentTrajectory); } renderer.getTrajectoriesTableModel().addElement(currentTrajectory); }
private void clearTrajectories() { synchronized (trajectoriesLock) { trajectories.clear(); } renderer.getTrajectoriesTableModel().removeAllElements(); currentTrajectory = new Trajectory(ColorGenerator.getInstance().current()); if (!gameOver) { currentTrajectory.addPoint(ball.getPosition()); synchronized (trajectoriesLock) { trajectories.add(currentTrajectory); } renderer.getTrajectoriesTableModel().addElement(currentTrajectory); } }
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()); } } }