From 64e96a1b8b935598464de5b668f5211399f8b0da Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Tue, 29 Aug 2017 12:14:28 +1200 Subject: [PATCH 01/75] Class for shifting wind. #story[1187] --- .../src/main/java/mock/app/Event.java | 10 +--- .../src/main/java/mock/model/MockRace.java | 5 +- .../{ => wind}/ConstantWindGenerator.java | 4 +- .../model/{ => wind}/RandomWindGenerator.java | 2 +- .../model/wind/ShiftingWindGenerator.java | 51 +++++++++++++++++++ .../mock/model/{ => wind}/WindGenerator.java | 2 +- .../mock/model/ConstantWindGeneratorTest.java | 2 + .../test/java/mock/model/MockRaceTest.java | 5 +- .../mock/model/RandomWindGeneratorTest.java | 1 + 9 files changed, 62 insertions(+), 20 deletions(-) rename racevisionGame/src/main/java/mock/model/{ => wind}/ConstantWindGenerator.java (96%) rename racevisionGame/src/main/java/mock/model/{ => wind}/RandomWindGenerator.java (99%) create mode 100644 racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java rename racevisionGame/src/main/java/mock/model/{ => wind}/WindGenerator.java (96%) diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index 228534c2..f36ac714 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -4,6 +4,8 @@ import mock.dataInput.PolarParser; import mock.exceptions.EventConstructionException; import mock.model.*; import mock.model.commandFactory.CompositeCommand; +import mock.model.wind.RandomWindGenerator; +import mock.model.wind.WindGenerator; import mock.xml.RaceXMLCreator; import network.Messages.LatestMessages; import org.xml.sax.SAXException; @@ -18,16 +20,8 @@ import shared.model.Constants; import javax.xml.bind.JAXBException; import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.TransformerException; import java.io.IOException; -import java.net.UnknownHostException; import java.nio.charset.StandardCharsets; -import java.time.Duration; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.concurrent.TimeUnit; -import java.util.logging.Level; -import java.util.logging.Logger; /** diff --git a/racevisionGame/src/main/java/mock/model/MockRace.java b/racevisionGame/src/main/java/mock/model/MockRace.java index 379123af..ed7b6fd2 100644 --- a/racevisionGame/src/main/java/mock/model/MockRace.java +++ b/racevisionGame/src/main/java/mock/model/MockRace.java @@ -1,9 +1,6 @@ package mock.model; -import javafx.animation.AnimationTimer; -import mock.xml.*; -import network.Messages.BoatLocation; -import network.Messages.BoatStatus; +import mock.model.wind.WindGenerator; import network.Messages.Enums.BoatStatusEnum; import network.Messages.Enums.RaceStatusEnum; import shared.dataInput.BoatDataSource; diff --git a/racevisionGame/src/main/java/mock/model/ConstantWindGenerator.java b/racevisionGame/src/main/java/mock/model/wind/ConstantWindGenerator.java similarity index 96% rename from racevisionGame/src/main/java/mock/model/ConstantWindGenerator.java rename to racevisionGame/src/main/java/mock/model/wind/ConstantWindGenerator.java index ae14daac..6cdfafe9 100644 --- a/racevisionGame/src/main/java/mock/model/ConstantWindGenerator.java +++ b/racevisionGame/src/main/java/mock/model/wind/ConstantWindGenerator.java @@ -1,11 +1,9 @@ -package mock.model; +package mock.model.wind; import shared.model.Bearing; import shared.model.Wind; -import java.util.Random; - /** * This class generates Wind objects for use in a MockRace. * Initialised with a baseline wind speed and direction, and keeps it constant. diff --git a/racevisionGame/src/main/java/mock/model/RandomWindGenerator.java b/racevisionGame/src/main/java/mock/model/wind/RandomWindGenerator.java similarity index 99% rename from racevisionGame/src/main/java/mock/model/RandomWindGenerator.java rename to racevisionGame/src/main/java/mock/model/wind/RandomWindGenerator.java index 4f981b8d..bd7b13c3 100644 --- a/racevisionGame/src/main/java/mock/model/RandomWindGenerator.java +++ b/racevisionGame/src/main/java/mock/model/wind/RandomWindGenerator.java @@ -1,4 +1,4 @@ -package mock.model; +package mock.model.wind; import shared.model.Bearing; diff --git a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java new file mode 100644 index 00000000..4a1c158e --- /dev/null +++ b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java @@ -0,0 +1,51 @@ +package mock.model.wind; + +import shared.model.Bearing; +import shared.model.Wind; + +/** + * Created by jjg64 on 28/08/17. + */ +public class ShiftingWindGenerator implements WindGenerator { + Bearing baselineBearing; + double baseLineSpeed; + double maxBearingVariance = 5; // In degrees + double oscillationPeriod = 3e6; // In milliseconds + + public ShiftingWindGenerator(Bearing baselineBearing, double baseLineSpeed) { + this.baselineBearing = baselineBearing; + this.baseLineSpeed = baseLineSpeed; + } + + @Override + public Wind generateBaselineWind() { + return new Wind(baselineBearing, baseLineSpeed); + } + + @Override + public Wind generateNextWind(Wind currentWind) { + return changeWind(currentWind); + } + + private Wind changeWind(Wind currentWind) { + currentWind = oscillateWind(currentWind); + currentWind = shiftWind(currentWind); + return currentWind; + } + + private Wind oscillateWind(Wind currentWind) { + return currentWind; + } + + private Wind shiftWind(Wind currentWind) { + return currentWind; + } + + public void setMaxBearingVariance(double maxBearingVariance) { + this.maxBearingVariance = maxBearingVariance; + } + + public void setOscillationPeriod(double oscillationPeriod) { + this.oscillationPeriod = oscillationPeriod; + } +} diff --git a/racevisionGame/src/main/java/mock/model/WindGenerator.java b/racevisionGame/src/main/java/mock/model/wind/WindGenerator.java similarity index 96% rename from racevisionGame/src/main/java/mock/model/WindGenerator.java rename to racevisionGame/src/main/java/mock/model/wind/WindGenerator.java index 8285d5d3..52ee2cd6 100644 --- a/racevisionGame/src/main/java/mock/model/WindGenerator.java +++ b/racevisionGame/src/main/java/mock/model/wind/WindGenerator.java @@ -1,4 +1,4 @@ -package mock.model; +package mock.model.wind; import shared.model.Wind; diff --git a/racevisionGame/src/test/java/mock/model/ConstantWindGeneratorTest.java b/racevisionGame/src/test/java/mock/model/ConstantWindGeneratorTest.java index 6f67dc30..f7c69acf 100644 --- a/racevisionGame/src/test/java/mock/model/ConstantWindGeneratorTest.java +++ b/racevisionGame/src/test/java/mock/model/ConstantWindGeneratorTest.java @@ -1,5 +1,7 @@ package mock.model; +import mock.model.wind.ConstantWindGenerator; +import mock.model.wind.WindGenerator; import org.junit.Before; import org.junit.Test; import shared.model.Bearing; diff --git a/racevisionGame/src/test/java/mock/model/MockRaceTest.java b/racevisionGame/src/test/java/mock/model/MockRaceTest.java index 4f3f7705..f53b2970 100644 --- a/racevisionGame/src/test/java/mock/model/MockRaceTest.java +++ b/racevisionGame/src/test/java/mock/model/MockRaceTest.java @@ -1,7 +1,8 @@ package mock.model; import mock.dataInput.PolarParserTest; -import network.Messages.LatestMessages; +import mock.model.wind.ConstantWindGenerator; +import mock.model.wind.WindGenerator; import shared.dataInput.*; import shared.exceptions.InvalidBoatDataException; import shared.exceptions.InvalidRaceDataException; @@ -9,8 +10,6 @@ import shared.exceptions.InvalidRegattaDataException; import shared.model.Bearing; import shared.model.Constants; -import static org.junit.Assert.*; - public class MockRaceTest { //TODO diff --git a/racevisionGame/src/test/java/mock/model/RandomWindGeneratorTest.java b/racevisionGame/src/test/java/mock/model/RandomWindGeneratorTest.java index 76eed977..0f60bcea 100644 --- a/racevisionGame/src/test/java/mock/model/RandomWindGeneratorTest.java +++ b/racevisionGame/src/test/java/mock/model/RandomWindGeneratorTest.java @@ -1,5 +1,6 @@ package mock.model; +import mock.model.wind.RandomWindGenerator; import org.junit.Before; import org.junit.Test; import shared.model.Bearing; From 12e2ae9c0150ad6e3e5de6ca77ff606cb11fcbf8 Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Tue, 29 Aug 2017 13:21:34 +1200 Subject: [PATCH 02/75] Started implementing wind oscillation. #story[1187] --- .../src/main/java/mock/app/Event.java | 17 ++++--- .../model/wind/ShiftingWindGenerator.java | 49 ++++++++++++++----- .../src/main/java/shared/model/Wind.java | 7 +++ 3 files changed, 56 insertions(+), 17 deletions(-) diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index f36ac714..096705bb 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -5,6 +5,7 @@ import mock.exceptions.EventConstructionException; import mock.model.*; import mock.model.commandFactory.CompositeCommand; import mock.model.wind.RandomWindGenerator; +import mock.model.wind.ShiftingWindGenerator; import mock.model.wind.WindGenerator; import mock.xml.RaceXMLCreator; import network.Messages.LatestMessages; @@ -124,13 +125,17 @@ public class Event { this.latestMessages = new LatestMessages(); //Create and start race. - WindGenerator windGenerator = new RandomWindGenerator( +// WindGenerator windGenerator = new RandomWindGenerator( +// Bearing.fromDegrees(225), +// Bearing.fromDegrees(215), +// Bearing.fromDegrees(235), +// 12d, +// 8d, +// 16d ); + WindGenerator windGenerator = new ShiftingWindGenerator( Bearing.fromDegrees(225), - Bearing.fromDegrees(215), - Bearing.fromDegrees(235), - 12d, - 8d, - 16d ); + 12 + ); RaceLogic newRace = new RaceLogic( new MockRace( boatDataSource, diff --git a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java index 4a1c158e..fc3e3dc2 100644 --- a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java +++ b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java @@ -3,18 +3,28 @@ package mock.model.wind; import shared.model.Bearing; import shared.model.Wind; +import java.util.Random; + /** * Created by jjg64 on 28/08/17. */ public class ShiftingWindGenerator implements WindGenerator { Bearing baselineBearing; double baseLineSpeed; - double maxBearingVariance = 5; // In degrees + double speedVariance = 4; + double bearingVariance = 5; // In degrees double oscillationPeriod = 3e6; // In milliseconds + double timeOfLastOscillationReset = 0; + double timeSinceLastChange = 0; + double timeSinceLastShift = 0; // Back / veer + + boolean oscillationLeft = false; + public ShiftingWindGenerator(Bearing baselineBearing, double baseLineSpeed) { this.baselineBearing = baselineBearing; this.baseLineSpeed = baseLineSpeed; + initialiseOscillationDirection(); } @Override @@ -27,22 +37,39 @@ public class ShiftingWindGenerator implements WindGenerator { return changeWind(currentWind); } - private Wind changeWind(Wind currentWind) { - currentWind = oscillateWind(currentWind); - currentWind = shiftWind(currentWind); - return currentWind; + private Wind changeWind(Wind wind) { + Wind newWind = new Wind(wind.getWindDirection(), wind.getWindSpeed()); + oscillateWind(newWind); + shiftWind(newWind); + changeWindSpeed(newWind); + return newWind; + } + + private void oscillateWind(Wind wind) { + double timeSinceLastOscillationReset = System.currentTimeMillis() - timeOfLastOscillationReset; + if (oscillationLeft) { + + } + } + + private void shiftWind(Wind wind) { + } + + private void changeWindSpeed(Wind wind) { + } - private Wind oscillateWind(Wind currentWind) { - return currentWind; + private void initialiseOscillationDirection() { + oscillationLeft = new Random().nextBoolean(); + timeOfLastOscillationReset = System.currentTimeMillis(); } - private Wind shiftWind(Wind currentWind) { - return currentWind; + public void setBearingVariance(double maxBearingVariance) { + this.bearingVariance = maxBearingVariance; } - public void setMaxBearingVariance(double maxBearingVariance) { - this.maxBearingVariance = maxBearingVariance; + public void setSpeedVariance(double speedVariance) { + this.speedVariance = speedVariance; } public void setOscillationPeriod(double oscillationPeriod) { diff --git a/racevisionGame/src/main/java/shared/model/Wind.java b/racevisionGame/src/main/java/shared/model/Wind.java index 08d391c2..531d8473 100644 --- a/racevisionGame/src/main/java/shared/model/Wind.java +++ b/racevisionGame/src/main/java/shared/model/Wind.java @@ -48,4 +48,11 @@ public class Wind { return windSpeed; } + public void setWindSpeed(double windSpeed) { + this.windSpeed = windSpeed; + } + + public void setWindDirection(Bearing windDirection) { + this.windDirection = windDirection; + } } From 1b1b0a45914dcfa5808aeaec23b10744f07dc39d Mon Sep 17 00:00:00 2001 From: cbt24 Date: Tue, 29 Aug 2017 14:38:27 +1200 Subject: [PATCH 03/75] Added floating test cube in title screen initialiser #story[1191] --- .../Controllers/TitleController.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java b/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java index 32e033c8..45ab295d 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java @@ -1,12 +1,18 @@ package visualiser.Controllers; +import javafx.animation.AnimationTimer; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; +import javafx.scene.Group; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.RadioButton; import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.Pane; +import javafx.scene.shape.Box; +import javafx.scene.shape.CullFace; +import javafx.scene.transform.Rotate; import javafx.stage.Modality; import javafx.stage.Stage; import visualiser.app.App; @@ -32,6 +38,8 @@ public class TitleController extends Controller { @FXML RadioButton nightModeRD; + Group group3d; + /** * Method called when the 'host a game' button is pressed. * Opens the next window allowing a user to host their own game. @@ -81,7 +89,31 @@ public class TitleController extends Controller { @Override public void initialize(URL location, ResourceBundle resources) { + System.out.println("Initializing..."); + + Box box = new Box(50,50,50); + box.setTranslateX(100); + box.setTranslateY(100); + box.setCullFace(CullFace.BACK); + + Rotate ry = new Rotate(0, 0,0,0, Rotate.Y_AXIS); + Rotate rx = new Rotate(20, 0, 0, 0, Rotate.X_AXIS); + box.getTransforms().add(ry); + box.getTransforms().add(rx); + + group3d = new Group(box); + + titleWrapper.getChildren().add(0, group3d); + group3d.toFront(); + + AnimationTimer rotation = new AnimationTimer() { + @Override + public void handle(long now) { + ry.setAngle(ry.getAngle() + 0.1); + } + }; + rotation.start(); } /** From d0ba7b93e09187be12f07df2b5a8facc852888fc Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Tue, 29 Aug 2017 14:40:52 +1200 Subject: [PATCH 04/75] Wind oscillates, replaces random wind with shifting wind. #story[1187] --- .../src/main/java/mock/app/Event.java | 2 ++ .../model/wind/ShiftingWindGenerator.java | 33 +++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index d75307cf..c7f7d5ff 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -23,6 +23,8 @@ import javax.xml.bind.JAXBException; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.nio.charset.StandardCharsets; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; /** diff --git a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java index fc3e3dc2..cb94e55c 100644 --- a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java +++ b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java @@ -13,10 +13,11 @@ public class ShiftingWindGenerator implements WindGenerator { double baseLineSpeed; double speedVariance = 4; double bearingVariance = 5; // In degrees - double oscillationPeriod = 3e6; // In milliseconds + double oscillationVariance = 0.25; + double oscillationPeriod = 1e3 * 60 * 1; // In milliseconds double timeOfLastOscillationReset = 0; - double timeSinceLastChange = 0; + double timeOfLastChange = 0; double timeSinceLastShift = 0; // Back / veer boolean oscillationLeft = false; @@ -42,13 +43,39 @@ public class ShiftingWindGenerator implements WindGenerator { oscillateWind(newWind); shiftWind(newWind); changeWindSpeed(newWind); + timeOfLastChange = System.currentTimeMillis(); return newWind; } private void oscillateWind(Wind wind) { double timeSinceLastOscillationReset = System.currentTimeMillis() - timeOfLastOscillationReset; + double timeSinceLastChange = System.currentTimeMillis() - timeOfLastChange; + double newBearing = wind.getWindDirection().degrees(); + double degreeChange = timeSinceLastChange * 2 * bearingVariance / oscillationPeriod; + degreeChange = (1 - oscillationVariance) * degreeChange + (2 * oscillationVariance) * degreeChange * Math.random(); + + if (timeSinceLastOscillationReset >= oscillationPeriod) { + timeOfLastOscillationReset = System.currentTimeMillis(); + oscillationLeft = !oscillationLeft; + } if (oscillationLeft) { - + newBearing -= degreeChange; + if (newBearing < baselineBearing.degrees() - bearingVariance) { + System.out.println(timeSinceLastOscillationReset); + oscillationLeft = !oscillationLeft; + timeOfLastOscillationReset = System.currentTimeMillis(); + } else { + wind.setWindDirection(Bearing.fromDegrees(newBearing % 360)); + } + } else { + newBearing += degreeChange; + if (newBearing > baselineBearing.degrees() + bearingVariance) { + System.out.println(timeSinceLastOscillationReset); + oscillationLeft = !oscillationLeft; + timeOfLastOscillationReset = System.currentTimeMillis(); + } else { + wind.setWindDirection(Bearing.fromDegrees(newBearing % 360)); + } } } From c63403d1de6b5c51ff061c3b9798e55acc55e0f7 Mon Sep 17 00:00:00 2001 From: David Wu Date: Tue, 29 Aug 2017 15:11:09 +1200 Subject: [PATCH 05/75] Created new lobby menu. Working on animated background for menu. --- .../Controllers/HostController.java | 39 +++++- .../visualiser/model/SpriteAnimation.java | 53 ++++++++ .../resources/visualiser/scenes/hostgame.fxml | 82 ++++++------ .../resources/visualiser/scenes/main.fxml | 2 +- .../resources/visualiser/scenes/title.fxml | 120 +++++++++--------- 5 files changed, 189 insertions(+), 107 deletions(-) create mode 100644 racevisionGame/src/main/java/visualiser/model/SpriteAnimation.java diff --git a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java index 1609e700..9c994f77 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java @@ -1,8 +1,14 @@ package visualiser.Controllers; +import javafx.animation.Animation; +import javafx.application.Platform; import javafx.fxml.FXML; +import javafx.geometry.Rectangle2D; import javafx.scene.control.TextField; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; import javafx.scene.layout.AnchorPane; +import javafx.util.Duration; import mock.app.Event; import org.xml.sax.SAXException; import mock.exceptions.EventConstructionException; @@ -10,6 +16,7 @@ import shared.exceptions.InvalidBoatDataException; import shared.exceptions.InvalidRaceDataException; import shared.exceptions.InvalidRegattaDataException; import shared.exceptions.XMLReaderException; +import visualiser.model.SpriteAnimation; import javax.xml.bind.JAXBException; import javax.xml.parsers.ParserConfigurationException; @@ -25,12 +32,22 @@ import java.util.logging.Logger; */ public class HostController extends Controller { + private static final int COLUMNS = 4; + private static final int COUNT = 10; + private static final int OFFSET_X = 18; + private static final int OFFSET_Y = 25; + private static final int WIDTH = 374; + private static final int HEIGHT = 243; - @FXML - TextField gameNameField; + +// @FXML +// TextField gameNameField; +// +// @FXML +// TextField hostNameField; @FXML - TextField hostNameField; + private ImageView imageView; @FXML AnchorPane hostWrapper; @@ -81,12 +98,20 @@ public class HostController extends Controller { * Hosts a game. */ public void hostGame(){ + + Platform.runLater(() -> { + imageView.setImage(new Image("https://media.tenor.com/images/3059eba221c9537eff1cf84ff4eabffc/tenor.gif")); + imageView.setViewport(new Rectangle2D(OFFSET_X, OFFSET_Y, WIDTH, HEIGHT)); + final Animation animation = new SpriteAnimation(imageView, Duration.millis(250), COUNT, COLUMNS, OFFSET_X, OFFSET_Y, WIDTH, HEIGHT); + animation.setCycleCount(Animation.INDEFINITE); + animation.play(); + }); hostWrapper.setVisible(true); } - public void menuBtnPressed(){ - hostWrapper.setVisible(false); - parent.enterTitle(); - } +// public void menuBtnPressed(){ +// hostWrapper.setVisible(false); +// parent.enterTitle(); +// } } diff --git a/racevisionGame/src/main/java/visualiser/model/SpriteAnimation.java b/racevisionGame/src/main/java/visualiser/model/SpriteAnimation.java new file mode 100644 index 00000000..6714c72a --- /dev/null +++ b/racevisionGame/src/main/java/visualiser/model/SpriteAnimation.java @@ -0,0 +1,53 @@ +package visualiser.model; + +import javafx.animation.Interpolator; +import javafx.animation.Transition; +import javafx.geometry.Rectangle2D; +import javafx.scene.image.ImageView; +import javafx.util.Duration; + + + + +/** + * Created by zwu18 on 29/08/17. + */ +public class SpriteAnimation extends Transition { + + private final ImageView imageView; + private final int count; + private final int columns; + private final int offsetX; + private final int offsetY; + private final int width; + private final int height; + + private int lastIndex; + + public SpriteAnimation( + ImageView imageView, + Duration duration, + int count, int columns, + int offsetX, int offsetY, + int width, int height) { + this.imageView = imageView; + this.count = count; + this.columns = columns; + this.offsetX = offsetX; + this.offsetY = offsetY; + this.width = width; + this.height = height; + setCycleDuration(duration); + setInterpolator(Interpolator.LINEAR); + } + + protected void interpolate(double k) { + final int index = Math.min((int) Math.floor(k * count), count - 1); + if (index != lastIndex) { + final int x = (index % columns) * width + offsetX; + final int y = (index / columns) * height + offsetY; + imageView.setViewport(new Rectangle2D(x, y, width, height)); + lastIndex = index; + } + } +} diff --git a/racevisionGame/src/main/resources/visualiser/scenes/hostgame.fxml b/racevisionGame/src/main/resources/visualiser/scenes/hostgame.fxml index ced36627..ab14abaf 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/hostgame.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/hostgame.fxml @@ -1,40 +1,44 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From b0f7c5e73475f18a13e085c7aa726b15b26d4b2d Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Tue, 29 Aug 2017 15:53:41 +1200 Subject: [PATCH 06/75] Wind speed changes depending on where the wind direction is. #story[1187] --- .../model/wind/ShiftingWindGenerator.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java index cb94e55c..f9e5a4be 100644 --- a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java +++ b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java @@ -11,7 +11,7 @@ import java.util.Random; public class ShiftingWindGenerator implements WindGenerator { Bearing baselineBearing; double baseLineSpeed; - double speedVariance = 4; + double speedVariance = 2; double bearingVariance = 5; // In degrees double oscillationVariance = 0.25; double oscillationPeriod = 1e3 * 60 * 1; // In milliseconds @@ -20,7 +20,7 @@ public class ShiftingWindGenerator implements WindGenerator { double timeOfLastChange = 0; double timeSinceLastShift = 0; // Back / veer - boolean oscillationLeft = false; + boolean anticlockwise = false; public ShiftingWindGenerator(Bearing baselineBearing, double baseLineSpeed) { this.baselineBearing = baselineBearing; @@ -56,13 +56,13 @@ public class ShiftingWindGenerator implements WindGenerator { if (timeSinceLastOscillationReset >= oscillationPeriod) { timeOfLastOscillationReset = System.currentTimeMillis(); - oscillationLeft = !oscillationLeft; + anticlockwise = !anticlockwise; } - if (oscillationLeft) { + if (anticlockwise) { newBearing -= degreeChange; if (newBearing < baselineBearing.degrees() - bearingVariance) { System.out.println(timeSinceLastOscillationReset); - oscillationLeft = !oscillationLeft; + anticlockwise = !anticlockwise; timeOfLastOscillationReset = System.currentTimeMillis(); } else { wind.setWindDirection(Bearing.fromDegrees(newBearing % 360)); @@ -71,7 +71,7 @@ public class ShiftingWindGenerator implements WindGenerator { newBearing += degreeChange; if (newBearing > baselineBearing.degrees() + bearingVariance) { System.out.println(timeSinceLastOscillationReset); - oscillationLeft = !oscillationLeft; + anticlockwise = !anticlockwise; timeOfLastOscillationReset = System.currentTimeMillis(); } else { wind.setWindDirection(Bearing.fromDegrees(newBearing % 360)); @@ -83,11 +83,14 @@ public class ShiftingWindGenerator implements WindGenerator { } private void changeWindSpeed(Wind wind) { - + double deg = wind.getWindDirection().degrees(); + double offset = deg - baselineBearing.degrees(); + double newSpeed = offset / bearingVariance * speedVariance + baseLineSpeed; + wind.setWindSpeed(newSpeed); } private void initialiseOscillationDirection() { - oscillationLeft = new Random().nextBoolean(); + anticlockwise = new Random().nextBoolean(); timeOfLastOscillationReset = System.currentTimeMillis(); } From 0621e1bdb125d180b264032b0a1eab47fc0c9529 Mon Sep 17 00:00:00 2001 From: David Wu Date: Tue, 29 Aug 2017 19:02:02 +1200 Subject: [PATCH 07/75] Finished up lobby menu. Set split pane to not change size on resize. Disabled divider on split pane. Added quit button and start button (start only prints to terminal for now). Panes are now wrapped in an anchor pane to fix resizing issues. TODO: Will be working on making a nicer background animation. --- .../Controllers/HostController.java | 67 +++++++++---------- .../src/main/java/visualiser/app/App.java | 6 +- .../visualiser/model/SpriteAnimation.java | 53 --------------- 3 files changed, 36 insertions(+), 90 deletions(-) delete mode 100644 racevisionGame/src/main/java/visualiser/model/SpriteAnimation.java diff --git a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java index 9c994f77..8998a02c 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java @@ -1,28 +1,18 @@ package visualiser.Controllers; -import javafx.animation.Animation; -import javafx.application.Platform; import javafx.fxml.FXML; -import javafx.geometry.Rectangle2D; -import javafx.scene.control.TextField; -import javafx.scene.image.Image; +import javafx.scene.control.Alert; +import javafx.scene.control.ButtonType; +import javafx.scene.control.SplitPane; import javafx.scene.image.ImageView; import javafx.scene.layout.AnchorPane; -import javafx.util.Duration; import mock.app.Event; -import org.xml.sax.SAXException; import mock.exceptions.EventConstructionException; -import shared.exceptions.InvalidBoatDataException; -import shared.exceptions.InvalidRaceDataException; -import shared.exceptions.InvalidRegattaDataException; -import shared.exceptions.XMLReaderException; -import visualiser.model.SpriteAnimation; - -import javax.xml.bind.JAXBException; -import javax.xml.parsers.ParserConfigurationException; + import java.io.IOException; import java.net.Socket; import java.net.URL; +import java.util.Optional; import java.util.ResourceBundle; import java.util.logging.Level; import java.util.logging.Logger; @@ -32,13 +22,6 @@ import java.util.logging.Logger; */ public class HostController extends Controller { - private static final int COLUMNS = 4; - private static final int COUNT = 10; - private static final int OFFSET_X = 18; - private static final int OFFSET_Y = 25; - private static final int WIDTH = 374; - private static final int HEIGHT = 243; - // @FXML // TextField gameNameField; @@ -52,6 +35,15 @@ public class HostController extends Controller { @FXML AnchorPane hostWrapper; + @FXML + AnchorPane imagePane; + + @FXML + SplitPane splitPane; + + @FXML + AnchorPane specPane; + private Event game; @@ -98,20 +90,27 @@ public class HostController extends Controller { * Hosts a game. */ public void hostGame(){ - - Platform.runLater(() -> { - imageView.setImage(new Image("https://media.tenor.com/images/3059eba221c9537eff1cf84ff4eabffc/tenor.gif")); - imageView.setViewport(new Rectangle2D(OFFSET_X, OFFSET_Y, WIDTH, HEIGHT)); - final Animation animation = new SpriteAnimation(imageView, Duration.millis(250), COUNT, COLUMNS, OFFSET_X, OFFSET_Y, WIDTH, HEIGHT); - animation.setCycleCount(Animation.INDEFINITE); - animation.play(); - }); + splitPane.setResizableWithParent(specPane, false); + splitPane.lookupAll(".split-pane-divider").stream().forEach(div -> div.setMouseTransparent(true)); + imageView.fitWidthProperty().bind(imagePane.widthProperty()); + imageView.fitHeightProperty().bind(imagePane.heightProperty()); hostWrapper.setVisible(true); } -// public void menuBtnPressed(){ -// hostWrapper.setVisible(false); -// parent.enterTitle(); -// } + public void menuBtnPressed(){ + Alert alert = new Alert(Alert.AlertType.CONFIRMATION); + alert.setTitle("Quitting race"); + alert.setContentText("Do you wish to quit the race?"); + alert.setHeaderText("You are about to quit the race"); + Optional result = alert.showAndWait(); + if(result.get() == ButtonType.OK){ + hostWrapper.setVisible(false); + parent.enterTitle(); + } + } + + public void startBtnPressed(){ + System.out.println("Should start the race. This button is only visible for the host"); + } } diff --git a/racevisionGame/src/main/java/visualiser/app/App.java b/racevisionGame/src/main/java/visualiser/app/App.java index eeae5a5d..31dcae24 100644 --- a/racevisionGame/src/main/java/visualiser/app/App.java +++ b/racevisionGame/src/main/java/visualiser/app/App.java @@ -96,15 +96,15 @@ public class App extends Application { ); updateMessage("Preparing ingredients . . ."); - Thread.sleep(1000); + Thread.sleep(200); for (int i = 0; i < burgerFilling.size(); i++) { - Thread.sleep(800); + Thread.sleep(100); updateProgress(i + 1, burgerFilling.size()); String nextFilling = burgerFilling.get(i); addedFilling.add(nextFilling); updateMessage("Adding the " + nextFilling + " . . ."); } - Thread.sleep(400); + Thread.sleep(100); updateMessage("Burger's done!"); return addedFilling; diff --git a/racevisionGame/src/main/java/visualiser/model/SpriteAnimation.java b/racevisionGame/src/main/java/visualiser/model/SpriteAnimation.java deleted file mode 100644 index 6714c72a..00000000 --- a/racevisionGame/src/main/java/visualiser/model/SpriteAnimation.java +++ /dev/null @@ -1,53 +0,0 @@ -package visualiser.model; - -import javafx.animation.Interpolator; -import javafx.animation.Transition; -import javafx.geometry.Rectangle2D; -import javafx.scene.image.ImageView; -import javafx.util.Duration; - - - - -/** - * Created by zwu18 on 29/08/17. - */ -public class SpriteAnimation extends Transition { - - private final ImageView imageView; - private final int count; - private final int columns; - private final int offsetX; - private final int offsetY; - private final int width; - private final int height; - - private int lastIndex; - - public SpriteAnimation( - ImageView imageView, - Duration duration, - int count, int columns, - int offsetX, int offsetY, - int width, int height) { - this.imageView = imageView; - this.count = count; - this.columns = columns; - this.offsetX = offsetX; - this.offsetY = offsetY; - this.width = width; - this.height = height; - setCycleDuration(duration); - setInterpolator(Interpolator.LINEAR); - } - - protected void interpolate(double k) { - final int index = Math.min((int) Math.floor(k * count), count - 1); - if (index != lastIndex) { - final int x = (index % columns) * width + offsetX; - final int y = (index / columns) * height + offsetY; - imageView.setViewport(new Rectangle2D(x, y, width, height)); - lastIndex = index; - } - } -} From 892320db5f8fffeca9e915bc218733cec7fbd014 Mon Sep 17 00:00:00 2001 From: David Wu Date: Tue, 29 Aug 2017 19:03:34 +1200 Subject: [PATCH 08/75] Added javadoc and extra files to push --- .../Controllers/HostController.java | 6 + .../resources/visualiser/images/lobby.gif | Bin 0 -> 18442 bytes .../visualiser/scenes/hostlobby.fxml | 180 ++++++++++++++++++ 3 files changed, 186 insertions(+) create mode 100644 racevisionGame/src/main/resources/visualiser/images/lobby.gif create mode 100644 racevisionGame/src/main/resources/visualiser/scenes/hostlobby.fxml diff --git a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java index 8998a02c..22c76426 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java @@ -97,6 +97,9 @@ public class HostController extends Controller { hostWrapper.setVisible(true); } + /** + * Menu button pressed. Prompt alert then return to menu + */ public void menuBtnPressed(){ Alert alert = new Alert(Alert.AlertType.CONFIRMATION); alert.setTitle("Quitting race"); @@ -109,6 +112,9 @@ public class HostController extends Controller { } } + /** + * Start button pressed. Currently only prints out start + */ public void startBtnPressed(){ System.out.println("Should start the race. This button is only visible for the host"); } diff --git a/racevisionGame/src/main/resources/visualiser/images/lobby.gif b/racevisionGame/src/main/resources/visualiser/images/lobby.gif new file mode 100644 index 0000000000000000000000000000000000000000..c70d8df6b2b68dc25980f28c9348189f8c8f31fa GIT binary patch literal 18442 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 literal 0 HcmV?d00001 diff --git a/racevisionGame/src/main/resources/visualiser/scenes/hostlobby.fxml b/racevisionGame/src/main/resources/visualiser/scenes/hostlobby.fxml new file mode 100644 index 00000000..3576c139 --- /dev/null +++ b/racevisionGame/src/main/resources/visualiser/scenes/hostlobby.fxml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 7df181c759e751f1d3eb3f5c953b2fd5475cf0b7 Mon Sep 17 00:00:00 2001 From: David Wu Date: Tue, 29 Aug 2017 19:08:22 +1200 Subject: [PATCH 09/75] Minor changes to new lobby fxml. #story[1188] --- .../resources/visualiser/scenes/hostlobby.fxml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/racevisionGame/src/main/resources/visualiser/scenes/hostlobby.fxml b/racevisionGame/src/main/resources/visualiser/scenes/hostlobby.fxml index 3576c139..aed6664b 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/hostlobby.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/hostlobby.fxml @@ -55,7 +55,7 @@ -