- An attempt at chase cam smoothing. needs work.

tags : #story[1273]
This commit is contained in:
Alistair McIntyre
2017-09-25 14:39:09 +13:00
parent a19e191684
commit e66abb4340
2 changed files with 46 additions and 3 deletions
@@ -65,6 +65,7 @@ public class ClientYacht extends Observable {
private ReadOnlyLongWrapper timeTillNextProperty = new ReadOnlyLongWrapper(); private ReadOnlyLongWrapper timeTillNextProperty = new ReadOnlyLongWrapper();
private ReadOnlyLongWrapper timeSinceLastMarkProperty = new ReadOnlyLongWrapper(); private ReadOnlyLongWrapper timeSinceLastMarkProperty = new ReadOnlyLongWrapper();
private ReadOnlyIntegerWrapper placingProperty = new ReadOnlyIntegerWrapper(); private ReadOnlyIntegerWrapper placingProperty = new ReadOnlyIntegerWrapper();
private ReadOnlyDoubleWrapper headingProperty = new ReadOnlyDoubleWrapper();
private Color colour; private Color colour;
public ClientYacht(String boatType, Integer sourceId, String hullID, String shortName, public ClientYacht(String boatType, Integer sourceId, String hullID, String shortName,
@@ -224,6 +225,7 @@ public class ClientYacht extends Observable {
public void setHeading(Double heading) { public void setHeading(Double heading) {
this.heading = heading; this.heading = heading;
setHeadingProperty();
} }
@Override @Override
@@ -256,6 +258,7 @@ public class ClientYacht extends Observable {
public void updateLocation(double lat, double lng, double heading, double velocity) { public void updateLocation(double lat, double lng, double heading, double velocity) {
setLocation(lat, lng); setLocation(lat, lng);
this.heading = heading; this.heading = heading;
setHeadingProperty();
this.currentVelocity = velocity; this.currentVelocity = velocity;
updateVelocityProperty(velocity); updateVelocityProperty(velocity);
for (YachtLocationListener yll : locationListeners) { for (YachtLocationListener yll : locationListeners) {
@@ -263,6 +266,15 @@ public class ClientYacht extends Observable {
} }
} }
private void setHeadingProperty() {
Double oldHeading = getHeadingProperty().get();
Double currHeading = heading;
while (oldHeading.equals(currHeading)) {
oldHeading++;
headingProperty.set(oldHeading);
}
}
public void addLocationListener(YachtLocationListener listener) { public void addLocationListener(YachtLocationListener listener) {
locationListeners.add(listener); locationListeners.add(listener);
} }
@@ -299,4 +311,10 @@ public class ClientYacht extends Observable {
public BoatObject getBoatObject() { public BoatObject getBoatObject() {
return this.boatObject; return this.boatObject;
} }
public ReadOnlyDoubleWrapper getHeadingProperty() {
return headingProperty;
}
} }
@@ -17,16 +17,27 @@ public class ChaseCamera extends PerspectiveCamera implements RaceCamera {
private ObservableList<Transform> transforms; private ObservableList<Transform> transforms;
private BoatObject playerBoat; private BoatObject playerBoat;
private ClientYacht playerYacht; private ClientYacht playerYacht;
private Double zoomFactor;
public ChaseCamera() { public ChaseCamera() {
super(true); super(true);
transforms = this.getTransforms(); transforms = this.getTransforms();
this.zoomFactor = -75.0;
} }
public void setPlayerBoat(BoatObject playerBoat, ClientYacht playerYacht) { public void setPlayerBoat(BoatObject playerBoat, ClientYacht playerYacht) {
this.playerBoat = playerBoat; this.playerBoat = playerBoat;
this.playerYacht = playerYacht; this.playerYacht = playerYacht;
this.playerYacht.getHeadingProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue,
Number newValue) {
repositionCamera();
}
});
this.playerBoat.layoutXProperty().addListener(new ChangeListener<Number>() { this.playerBoat.layoutXProperty().addListener(new ChangeListener<Number>() {
@Override @Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, public void changed(ObservableValue<? extends Number> observable, Number oldValue,
@@ -49,18 +60,32 @@ public class ChaseCamera extends PerspectiveCamera implements RaceCamera {
new Translate(playerBoat.getLayoutX(), playerBoat.getLayoutY(), 0), new Translate(playerBoat.getLayoutX(), playerBoat.getLayoutY(), 0),
new Rotate(playerYacht.getHeading(), new Point3D(0, 0, 1)), new Rotate(playerYacht.getHeading(), new Point3D(0, 0, 1)),
new Rotate(60, new Point3D(1, 0, 0)), new Rotate(60, new Point3D(1, 0, 0)),
new Translate(0, 0, -75) new Translate(0, 0, zoomFactor)
);
}
private void repositionCamera(Double newHeading) {
transforms.clear();
transforms.addAll(
new Translate(playerBoat.getLayoutX(), playerBoat.getLayoutY(), 0),
new Rotate(newHeading, new Point3D(0, 0, 1)),
new Rotate(60, new Point3D(1, 0, 0)),
new Translate(0, 0, zoomFactor)
); );
} }
@Override @Override
public void zoomIn() { public void zoomIn() {
transforms.addAll(new Translate(0, 0, 1.5)); //transforms.addAll(new Translate(0, 0, 1.5));
this.zoomFactor += 5;
repositionCamera();
} }
@Override @Override
public void zoomOut() { public void zoomOut() {
transforms.addAll(new Translate(0, 0, -1.5)); //transforms.addAll(new Translate(0, 0, -1.5));
this.zoomFactor -= 5;
repositionCamera();
} }