mirror of
https://github.com/michaelrausch/Party-Parrots-At-Sea.git
synced 2026-05-09 14:28:43 +00:00
Merge remote-tracking branch 'origin/1273_Changing_Cameras' into 1281_Server_Discovery_Internet
This commit is contained in:
@@ -19,6 +19,7 @@ import jdk.nashorn.internal.objects.annotations.Function;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import seng302.model.token.TokenType;
|
import seng302.model.token.TokenType;
|
||||||
|
import seng302.visualiser.fxObjects.assets_3D.BoatObject;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Yacht class for the racing boat. <p> Class created to store more variables (eg. boat statuses)
|
* Yacht class for the racing boat. <p> Class created to store more variables (eg. boat statuses)
|
||||||
@@ -66,6 +67,8 @@ public class ClientYacht extends Observable {
|
|||||||
private Integer boatStatus;
|
private Integer boatStatus;
|
||||||
private Double currentVelocity;
|
private Double currentVelocity;
|
||||||
|
|
||||||
|
private BoatObject boatObject;
|
||||||
|
|
||||||
private List<YachtLocationListener> locationListeners = new ArrayList<>();
|
private List<YachtLocationListener> locationListeners = new ArrayList<>();
|
||||||
private List<MarkRoundingListener> markRoundingListeners = new ArrayList<>();
|
private List<MarkRoundingListener> markRoundingListeners = new ArrayList<>();
|
||||||
private List<PowerUpListener> powerUpListeners = new ArrayList<>();
|
private List<PowerUpListener> powerUpListeners = new ArrayList<>();
|
||||||
@@ -314,4 +317,12 @@ public class ClientYacht extends Observable {
|
|||||||
public Double getCurrentVelocity() {
|
public Double getCurrentVelocity() {
|
||||||
return currentVelocity;
|
return currentVelocity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setBoatObject(BoatObject newBoatObject) {
|
||||||
|
this.boatObject = newBoatObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BoatObject getBoatObject() {
|
||||||
|
return this.boatObject;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,11 @@ import seng302.model.token.Token;
|
|||||||
import seng302.model.token.TokenType;
|
import seng302.model.token.TokenType;
|
||||||
import seng302.utilities.GeoUtility;
|
import seng302.utilities.GeoUtility;
|
||||||
import seng302.utilities.Sounds;
|
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.MarkArrowFactory;
|
||||||
import seng302.visualiser.fxObjects.assets_3D.BoatObject;
|
import seng302.visualiser.fxObjects.assets_3D.BoatObject;
|
||||||
import seng302.visualiser.fxObjects.assets_3D.Marker3D;
|
import seng302.visualiser.fxObjects.assets_3D.Marker3D;
|
||||||
@@ -52,6 +57,8 @@ public class GameView3D {
|
|||||||
private SubScene view;
|
private SubScene view;
|
||||||
// ParallelCamera camera;
|
// ParallelCamera camera;
|
||||||
private PerspectiveCamera camera;
|
private PerspectiveCamera camera;
|
||||||
|
private PerspectiveCamera camera2;
|
||||||
|
private PerspectiveCamera camera3;
|
||||||
private Group gameObjects;
|
private Group gameObjects;
|
||||||
|
|
||||||
private double bufferSize = 0;
|
private double bufferSize = 0;
|
||||||
@@ -88,13 +95,21 @@ public class GameView3D {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public GameView3D () {
|
public GameView3D () {
|
||||||
camera = new PerspectiveCamera(true);
|
camera = new IsometricCamera(DEFAULT_CAMERA_X, DEFAULT_CAMERA_Y, DEFAULT_CAMERA_DEPTH);
|
||||||
camera.getTransforms().addAll(
|
|
||||||
new Translate(DEFAULT_CAMERA_X,DEFAULT_CAMERA_Y, DEFAULT_CAMERA_DEPTH)
|
|
||||||
);
|
|
||||||
camera.setFarClip(600);
|
camera.setFarClip(600);
|
||||||
camera.setNearClip(0.1);
|
camera.setNearClip(0.1);
|
||||||
camera.setFieldOfView(FOV);
|
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();
|
gameObjects = new Group();
|
||||||
root3D = new Group(camera, gameObjects);
|
root3D = new Group(camera, gameObjects);
|
||||||
view = new SubScene(
|
view = new SubScene(
|
||||||
@@ -406,35 +421,46 @@ public class GameView3D {
|
|||||||
public void cameraMovement(KeyEvent event) {
|
public void cameraMovement(KeyEvent event) {
|
||||||
switch (event.getCode()) {
|
switch (event.getCode()) {
|
||||||
case NUMPAD8:
|
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;
|
break;
|
||||||
case NUMPAD2:
|
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;
|
break;
|
||||||
case NUMPAD4:
|
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;
|
break;
|
||||||
case NUMPAD6:
|
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;
|
break;
|
||||||
case Z:
|
case Z:
|
||||||
camera.getTransforms().addAll(new Translate(0, 0, 1.5));
|
((RaceCamera) view.getCamera()).zoomIn();
|
||||||
break;
|
break;
|
||||||
case X:
|
case X:
|
||||||
camera.getTransforms().addAll(new Translate(0, 0, -1.5));
|
((RaceCamera) view.getCamera()).zoomOut();
|
||||||
break;
|
break;
|
||||||
case W:
|
case W:
|
||||||
camera.getTransforms().addAll(new Translate(0, -1, 0));
|
view.getCamera().getTransforms().addAll(new Translate(0, -1, 0));
|
||||||
break;
|
break;
|
||||||
case S:
|
case S:
|
||||||
camera.getTransforms().addAll(new Translate(0, 1, 0));
|
view.getCamera().getTransforms().addAll(new Translate(0, 1, 0));
|
||||||
break;
|
break;
|
||||||
case A:
|
case A:
|
||||||
camera.getTransforms().addAll(new Translate(-1, 0, 0));
|
view.getCamera().getTransforms().addAll(new Translate(-1, 0, 0));
|
||||||
break;
|
break;
|
||||||
case D:
|
case D:
|
||||||
camera.getTransforms().addAll(new Translate(1, 0, 0));
|
view.getCamera().getTransforms().addAll(new Translate(1, 0, 0));
|
||||||
break;
|
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);
|
Point2D p2d = findScaledXY(lat, lon);
|
||||||
bo.moveTo(p2d.getX(), p2d.getY(), heading, velocity, sailIn, windDir);
|
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(() -> {
|
Platform.runLater(() -> {
|
||||||
gameObjects.getChildren().addAll(wakes);
|
gameObjects.getChildren().addAll(wakes);
|
||||||
|
|||||||
@@ -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<Transform> 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<Number>() {
|
||||||
|
@Override
|
||||||
|
public void changed(ObservableValue<? extends Number> observable, Number oldValue,
|
||||||
|
Number newValue) {
|
||||||
|
updateCameraX((Double) oldValue, (Double) newValue);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.playerBoat.layoutYProperty().addListener(new ChangeListener<Number>() {
|
||||||
|
@Override
|
||||||
|
public void changed(ObservableValue<? extends Number> 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() {
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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<Transform> 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));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package seng302.visualiser.cameras;
|
||||||
|
|
||||||
|
|
||||||
|
public interface RaceCamera {
|
||||||
|
|
||||||
|
void zoomIn();
|
||||||
|
|
||||||
|
void zoomOut();
|
||||||
|
|
||||||
|
void panLeft();
|
||||||
|
|
||||||
|
void panRight();
|
||||||
|
|
||||||
|
void panUp();
|
||||||
|
|
||||||
|
void panDown();
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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<Transform> 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));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@ package seng302.visualiser.fxObjects.assets_3D;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Enum for boat meshes. Enum values should be of the form :
|
* 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.
|
* Files must be valid .stl files.
|
||||||
*/
|
*/
|
||||||
public enum BoatMeshType {
|
public enum BoatMeshType {
|
||||||
|
|||||||
@@ -78,7 +78,6 @@ public class ModelFactory {
|
|||||||
public static BoatModel boatGameView(BoatMeshType boatType, Color primaryColour) {
|
public static BoatModel boatGameView(BoatMeshType boatType, Color primaryColour) {
|
||||||
Group boatAssets = getUnmodifiedBoatModel(boatType, primaryColour);
|
Group boatAssets = getUnmodifiedBoatModel(boatType, primaryColour);
|
||||||
boatAssets.getTransforms().setAll(
|
boatAssets.getTransforms().setAll(
|
||||||
new Rotate(-90, new Point3D(0,0,1)),
|
|
||||||
new Scale(0.3, 0.3, 0.3)
|
new Scale(0.3, 0.3, 0.3)
|
||||||
);
|
);
|
||||||
return new BoatModel(boatAssets, null, boatType);
|
return new BoatModel(boatAssets, null, boatType);
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 92 KiB |
Reference in New Issue
Block a user