diff --git a/src/main/java/seng302/model/ClientYacht.java b/src/main/java/seng302/model/ClientYacht.java index 5cedbfba..4a37360b 100644 --- a/src/main/java/seng302/model/ClientYacht.java +++ b/src/main/java/seng302/model/ClientYacht.java @@ -19,6 +19,7 @@ import jdk.nashorn.internal.objects.annotations.Function; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import seng302.model.token.TokenType; +import seng302.visualiser.fxObjects.assets_3D.BoatObject; /** * Yacht class for the racing boat.

Class created to store more variables (eg. boat statuses) @@ -66,6 +67,8 @@ public class ClientYacht extends Observable { private Integer boatStatus; private Double currentVelocity; + private BoatObject boatObject; + private List locationListeners = new ArrayList<>(); private List markRoundingListeners = new ArrayList<>(); private List powerUpListeners = new ArrayList<>(); @@ -314,4 +317,12 @@ public class ClientYacht extends Observable { public Double getCurrentVelocity() { return currentVelocity; } + + public void setBoatObject(BoatObject newBoatObject) { + this.boatObject = newBoatObject; + } + + public BoatObject getBoatObject() { + return this.boatObject; + } } diff --git a/src/main/java/seng302/visualiser/GameView3D.java b/src/main/java/seng302/visualiser/GameView3D.java index 6af253c9..419df72f 100644 --- a/src/main/java/seng302/visualiser/GameView3D.java +++ b/src/main/java/seng302/visualiser/GameView3D.java @@ -30,6 +30,11 @@ import seng302.model.token.Token; import seng302.model.token.TokenType; import seng302.utilities.GeoUtility; import seng302.utilities.Sounds; +import seng302.visualiser.cameras.ChaseCamera; +import seng302.visualiser.cameras.IsometricCamera; +import seng302.visualiser.cameras.RaceCamera; +import seng302.visualiser.cameras.TopDownCamera; +import seng302.visualiser.controllers.ViewManager; import seng302.visualiser.fxObjects.MarkArrowFactory; import seng302.visualiser.fxObjects.assets_3D.BoatObject; import seng302.visualiser.fxObjects.assets_3D.Marker3D; @@ -52,6 +57,8 @@ public class GameView3D { private SubScene view; // ParallelCamera camera; private PerspectiveCamera camera; + private PerspectiveCamera camera2; + private PerspectiveCamera camera3; private Group gameObjects; private double bufferSize = 0; @@ -88,13 +95,21 @@ public class GameView3D { } public GameView3D () { - camera = new PerspectiveCamera(true); - camera.getTransforms().addAll( - new Translate(DEFAULT_CAMERA_X,DEFAULT_CAMERA_Y, DEFAULT_CAMERA_DEPTH) - ); + camera = new IsometricCamera(DEFAULT_CAMERA_X, DEFAULT_CAMERA_Y, DEFAULT_CAMERA_DEPTH); camera.setFarClip(600); camera.setNearClip(0.1); camera.setFieldOfView(FOV); + + camera2 = new TopDownCamera(); + camera2.setFarClip(600); + camera2.setNearClip(0.1); + camera2.setFieldOfView(FOV); + + camera3 = new ChaseCamera(); + camera3.setFarClip(600); + camera3.setNearClip(0.1); + camera3.setFieldOfView(FOV); + gameObjects = new Group(); root3D = new Group(camera, gameObjects); view = new SubScene( @@ -406,35 +421,46 @@ public class GameView3D { public void cameraMovement(KeyEvent event) { switch (event.getCode()) { case NUMPAD8: - camera.getTransforms().addAll(new Rotate(0.5, new Point3D(1,0,0))); + view.getCamera().getTransforms().addAll(new Rotate(0.5, new Point3D(1, 0, 0))); break; case NUMPAD2: - camera.getTransforms().addAll(new Rotate(-0.5, new Point3D(1,0,0))); + view.getCamera().getTransforms().addAll(new Rotate(-0.5, new Point3D(1, 0, 0))); break; case NUMPAD4: - camera.getTransforms().addAll(new Rotate(-0.5, new Point3D(0,1,0))); + view.getCamera().getTransforms().addAll(new Rotate(-0.5, new Point3D(0, 1, 0))); break; case NUMPAD6: - camera.getTransforms().addAll(new Rotate(0.5, new Point3D(0,1,0))); + view.getCamera().getTransforms().addAll(new Rotate(0.5, new Point3D(0, 1, 0))); break; case Z: - camera.getTransforms().addAll(new Translate(0, 0, 1.5)); + ((RaceCamera) view.getCamera()).zoomIn(); break; case X: - camera.getTransforms().addAll(new Translate(0, 0, -1.5)); + ((RaceCamera) view.getCamera()).zoomOut(); break; case W: - camera.getTransforms().addAll(new Translate(0, -1, 0)); + view.getCamera().getTransforms().addAll(new Translate(0, -1, 0)); break; case S: - camera.getTransforms().addAll(new Translate(0, 1, 0)); + view.getCamera().getTransforms().addAll(new Translate(0, 1, 0)); break; case A: - camera.getTransforms().addAll(new Translate(-1, 0, 0)); + view.getCamera().getTransforms().addAll(new Translate(-1, 0, 0)); break; case D: - camera.getTransforms().addAll(new Translate(1, 0, 0)); + view.getCamera().getTransforms().addAll(new Translate(1, 0, 0)); break; + case F1: + if (view.getCamera().equals(camera)) { + view.setCamera(camera2); + if (view.getCamera() instanceof TopDownCamera) { + ((RaceCamera) view.getCamera()).zoomIn(); + } + } else if (view.getCamera().equals(camera2)) { + view.setCamera(camera3); + } else { + view.setCamera(camera); + } } } @@ -471,6 +497,11 @@ public class GameView3D { Point2D p2d = findScaledXY(lat, lon); bo.moveTo(p2d.getX(), p2d.getY(), heading, velocity, sailIn, windDir); }); + + if (clientYacht.getSourceId().equals( + ViewManager.getInstance().getGameClient().getServerThread().getClientId())) { + ((ChaseCamera) camera3).setPlayerBoat(newBoat); + } } Platform.runLater(() -> { gameObjects.getChildren().addAll(wakes); diff --git a/src/main/java/seng302/visualiser/cameras/ChaseCamera.java b/src/main/java/seng302/visualiser/cameras/ChaseCamera.java new file mode 100644 index 00000000..1d0a0648 --- /dev/null +++ b/src/main/java/seng302/visualiser/cameras/ChaseCamera.java @@ -0,0 +1,89 @@ +package seng302.visualiser.cameras; + +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.collections.ObservableList; +import javafx.geometry.Point3D; +import javafx.scene.PerspectiveCamera; +import javafx.scene.transform.Rotate; +import javafx.scene.transform.Transform; +import javafx.scene.transform.Translate; +import seng302.visualiser.fxObjects.assets_3D.BoatObject; + + +public class ChaseCamera extends PerspectiveCamera implements RaceCamera { + + private ObservableList transforms; + private BoatObject playerBoat; + + public ChaseCamera() { + super(true); + transforms = this.getTransforms(); + } + + public void setPlayerBoat(BoatObject playerBoat) { + this.playerBoat = playerBoat; + + this.playerBoat.layoutXProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Number oldValue, + Number newValue) { + updateCameraX((Double) oldValue, (Double) newValue); + } + }); + this.playerBoat.layoutYProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Number oldValue, + Number newValue) { + updateCameraY((Double) oldValue, (Double) newValue); + } + }); + } + + + private void updateCameraX(Double oldXValue, Double newXValue) { + if (transforms.size() == 0) { // boat is placed and then moved at start, + transforms.addAll( + new Translate(playerBoat.getLayoutX() - 30, playerBoat.getLayoutY() - 30, -125), + new Rotate(80, new Point3D(0, 0, 1)) + ); + } else { + transforms.addAll(new Translate(newXValue - oldXValue, 0, 0)); + } + } + + private void updateCameraY(Double oldYValue, Double newYValue) { + transforms.addAll(new Translate(0, (newYValue - oldYValue), 0)); + } + + @Override + public void zoomIn() { + transforms.addAll(new Translate(0, 0, 1.5)); + } + + @Override + public void zoomOut() { + transforms.addAll(new Translate(0, 0, -1.5)); + } + + + /* + These have been left intentionally empty for now. it would be cool to be able to pan around the boat and have the camera move around the boat though. + */ + + @Override + public void panLeft() { + } + + @Override + public void panRight() { + } + + @Override + public void panUp() { + } + + @Override + public void panDown() { + } +} diff --git a/src/main/java/seng302/visualiser/cameras/IsometricCamera.java b/src/main/java/seng302/visualiser/cameras/IsometricCamera.java new file mode 100644 index 00000000..a4abeac4 --- /dev/null +++ b/src/main/java/seng302/visualiser/cameras/IsometricCamera.java @@ -0,0 +1,47 @@ +package seng302.visualiser.cameras; + +import javafx.collections.ObservableList; +import javafx.scene.PerspectiveCamera; +import javafx.scene.transform.Transform; +import javafx.scene.transform.Translate; + +public class IsometricCamera extends PerspectiveCamera implements RaceCamera { + + ObservableList transforms; + + public IsometricCamera(Double cameraStartX, Double cameraStartY, Double cameraDepth) { + super(true); + transforms = this.getTransforms(); + transforms.addAll(new Translate(cameraStartX, cameraStartY, cameraDepth)); + } + + @Override + public void zoomIn() { + transforms.addAll(new Translate(0, 0, 1.5)); + } + + @Override + public void zoomOut() { + transforms.addAll(new Translate(0, 0, -1.5)); + } + + @Override + public void panLeft() { + transforms.addAll(new Translate(-1, 0, 0)); + } + + @Override + public void panRight() { + transforms.addAll(new Translate(1, 0, 0)); + } + + @Override + public void panUp() { + transforms.addAll(new Translate(0, -1, 0)); + } + + @Override + public void panDown() { + transforms.addAll(new Translate(0, 1, 0)); + } +} diff --git a/src/main/java/seng302/visualiser/cameras/RaceCamera.java b/src/main/java/seng302/visualiser/cameras/RaceCamera.java new file mode 100644 index 00000000..7416ae4a --- /dev/null +++ b/src/main/java/seng302/visualiser/cameras/RaceCamera.java @@ -0,0 +1,18 @@ +package seng302.visualiser.cameras; + + +public interface RaceCamera { + + void zoomIn(); + + void zoomOut(); + + void panLeft(); + + void panRight(); + + void panUp(); + + void panDown(); + +} diff --git a/src/main/java/seng302/visualiser/cameras/TopDownCamera.java b/src/main/java/seng302/visualiser/cameras/TopDownCamera.java new file mode 100644 index 00000000..624ae478 --- /dev/null +++ b/src/main/java/seng302/visualiser/cameras/TopDownCamera.java @@ -0,0 +1,48 @@ +package seng302.visualiser.cameras; + + +import javafx.collections.ObservableList; +import javafx.scene.PerspectiveCamera; +import javafx.scene.transform.Transform; +import javafx.scene.transform.Translate; + +public class TopDownCamera extends PerspectiveCamera implements RaceCamera { + + ObservableList transforms; + + public TopDownCamera() { + super(true); + transforms = this.getTransforms(); + transforms.add(new Translate(0, 0, -125)); + } + + @Override + public void zoomIn() { + transforms.addAll(new Translate(0, 0, 1.5)); + } + + @Override + public void zoomOut() { + transforms.addAll(new Translate(0, 0, -1.5)); + } + + @Override + public void panLeft() { + transforms.addAll(new Translate(-1, 0, 0)); + } + + @Override + public void panRight() { + transforms.addAll(new Translate(1, 0, 0)); + } + + @Override + public void panUp() { + transforms.addAll(new Translate(0, -1, 0)); + } + + @Override + public void panDown() { + transforms.addAll(new Translate(0, 1, 0)); + } +} diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java index 9747b892..9b74aa69 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java @@ -2,7 +2,7 @@ package seng302.visualiser.fxObjects.assets_3D; /** * Enum for boat meshes. Enum values should be of the form : - * ENUM_VALUE (hull file, mast file, X offset of mast CoR from origin, sail file, X offset of sail CoR from origin) + * ENUM_VALUE (hull file, mast file, Y offset of mast CoR from origin, sail file, Y offset of sail CoR from origin) * Files must be valid .stl files. */ public enum BoatMeshType { diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelFactory.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelFactory.java index 8d7ecadf..6df7bf78 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelFactory.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelFactory.java @@ -78,7 +78,6 @@ public class ModelFactory { public static BoatModel boatGameView(BoatMeshType boatType, Color primaryColour) { Group boatAssets = getUnmodifiedBoatModel(boatType, primaryColour); boatAssets.getTransforms().setAll( - new Rotate(-90, new Point3D(0,0,1)), new Scale(0.3, 0.3, 0.3) ); return new BoatModel(boatAssets, null, boatType); diff --git a/src/main/resources/PP.png b/src/main/resources/PP.png index 1cc88a95..6db4eb3d 100644 Binary files a/src/main/resources/PP.png and b/src/main/resources/PP.png differ