Merge remote-tracking branch 'origin/1273_Changing_Cameras' into 1281_Server_Discovery_Internet

This commit is contained in:
Michael Rausch
2017-09-25 00:18:35 +13:00
9 changed files with 259 additions and 16 deletions
@@ -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