Completed working boat selection screen.

When a user selects a different boat, it is sent to all other clients and updates accordingly. Boats are all shown with their correct models in game.

#story[1274]
This commit is contained in:
Kusal Ekanayake
2017-09-20 20:46:23 +12:00
parent 7d8a6afa5f
commit 307e79ecfc
12 changed files with 114 additions and 17 deletions
@@ -424,4 +424,8 @@ public class ServerYacht {
public void setBoatType(String boatType) { public void setBoatType(String boatType) {
this.boatType = boatType; this.boatType = boatType;
} }
public String getBoatType() {
return boatType;
}
} }
@@ -146,11 +146,9 @@ public class XMLParser {
XMLParser.getNodeAttributeString(currentBoat, "BoatName"), XMLParser.getNodeAttributeString(currentBoat, "BoatName"),
XMLParser.getNodeAttributeString(currentBoat, "Country")); XMLParser.getNodeAttributeString(currentBoat, "Country"));
yacht.setColour(Color.web(getNodeAttributeString(currentBoat, "Color"))); yacht.setColour(Color.web(getNodeAttributeString(currentBoat, "Color")));
if (yacht.getBoatType().equals("Yacht")) {
competingBoats.put(yacht.getSourceId(), yacht); competingBoats.put(yacht.getSourceId(), yacht);
} }
} }
}
return competingBoats; return competingBoats;
} }
@@ -30,6 +30,7 @@ import seng302.model.token.Token;
import seng302.utilities.GeoUtility; import seng302.utilities.GeoUtility;
import seng302.utilities.Sounds; import seng302.utilities.Sounds;
import seng302.visualiser.fxObjects.MarkArrowFactory; import seng302.visualiser.fxObjects.MarkArrowFactory;
import seng302.visualiser.fxObjects.assets_3D.BoatMeshType;
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;
import seng302.visualiser.fxObjects.assets_3D.ModelFactory; import seng302.visualiser.fxObjects.assets_3D.ModelFactory;
@@ -459,7 +460,7 @@ public class GameView3D {
final List<Group> wakes = new ArrayList<>(); final List<Group> wakes = new ArrayList<>();
for (ClientYacht clientYacht : yachts) { for (ClientYacht clientYacht : yachts) {
Color colour = clientYacht.getColour(); Color colour = clientYacht.getColour();
newBoat = new BoatObject(); newBoat = new BoatObject(BoatMeshType.getBoatMeshType(clientYacht.getBoatType()));
newBoat.setFill(colour); newBoat.setFill(colour);
boatObjects.put(clientYacht, newBoat); boatObjects.put(clientYacht, newBoat);
wakesGroup.getChildren().add(newBoat.getWake()); wakesGroup.getChildren().add(newBoat.getWake());
@@ -130,7 +130,8 @@ public class LobbyController implements Initializable {
controller.setPlayerName(this.playerBoats controller.setPlayerName(this.playerBoats
.get(ViewManager.getInstance().getGameClient().getServerThread().getClientId()) .get(ViewManager.getInstance().getGameClient().getServerThread().getClientId())
.getBoatName()); .getBoatName());
controller.setCurrentBoat(BoatMeshType.DINGHY); controller.setCurrentBoat(this.playerBoats.get(ViewManager.getInstance().getGameClient().getServerThread().getClientId())
.getBoatType());
return customizationDialog; return customizationDialog;
} }
@@ -204,7 +205,7 @@ public class LobbyController implements Initializable {
FXMLLoader loader = new FXMLLoader( FXMLLoader loader = new FXMLLoader(
getClass().getResource("/views/cells/PlayerCell.fxml")); getClass().getResource("/views/cells/PlayerCell.fxml"));
loader.setController(new PlayerCell(playerId, yacht.getBoatName(), yacht.getColour())); loader.setController(new PlayerCell(playerId, yacht.getBoatName(), yacht.getColour(), yacht.getBoatType()));
try { try {
pane = loader.load(); pane = loader.load();
@@ -278,6 +278,8 @@ public class ViewManager {
stage.setMinHeight(500); stage.setMinHeight(500);
stage.setMinWidth(800); stage.setMinWidth(800);
stage.setTitle("Party Parrots At Sea");
stage.getIcons().add(new Image(getClass().getResourceAsStream("/PP.png")));
stage.setOnCloseRequest(e -> closeAll()); stage.setOnCloseRequest(e -> closeAll());
stage.setScene(scene); stage.setScene(scene);
stage.show(); stage.show();
@@ -24,11 +24,13 @@ public class PlayerCell {
private String name; private String name;
private Color boatColor; private Color boatColor;
private Integer playerId; private Integer playerId;
private BoatMeshType boatype;
public PlayerCell(Integer playerId, String playerName, Color color) { public PlayerCell(Integer playerId, String playerName, Color color, String boatType) {
this.playerId = playerId; this.playerId = playerId;
this.name = playerName; this.name = playerName;
this.boatColor = color; this.boatColor = color;
this.boatype = BoatMeshType.getBoatMeshType(boatType);
} }
public void initialize() { public void initialize() {
@@ -37,7 +39,7 @@ public class PlayerCell {
// Add Rotating Boat to Player Cell with players color on it. // Add Rotating Boat to Player Cell with players color on it.
Group group = new Group(); Group group = new Group();
boatPane.getChildren().add(group); boatPane.getChildren().add(group);
BoatModel bo = ModelFactory.boatIconView(BoatMeshType.PIRATE_SHIP, this.boatColor); BoatModel bo = ModelFactory.boatIconView(this.boatype, this.boatColor);
group.getChildren().add(bo.getAssets()); group.getChildren().add(bo.getAssets());
} }
@@ -11,6 +11,7 @@ import javafx.fxml.FXML;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
import javafx.geometry.Insets; import javafx.geometry.Insets;
import javafx.scene.Group; import javafx.scene.Group;
import javafx.scene.PointLight;
import javafx.scene.layout.Background; import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill; import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.CornerRadii; import javafx.scene.layout.CornerRadii;
@@ -111,21 +112,35 @@ public class BoatCustomizeController implements Initializable{
this.lobbyController = lobbyController; this.lobbyController = lobbyController;
} }
public void setCurrentBoat(BoatMeshType boatType) { public void setCurrentBoat(String boatType) {
Group group = new Group(); Group group = new Group();
this.currentBoat = boatType; this.currentBoat = BoatMeshType.getBoatMeshType(boatType);
System.out.println(boatType.toString()); System.out.println(boatType.toString());
boatPane.setBackground(new Background(new BackgroundFill(Color.SKYBLUE, CornerRadii.EMPTY, Insets.EMPTY))); boatPane.setBackground(new Background(new BackgroundFill(Color.SKYBLUE, CornerRadii.EMPTY, Insets.EMPTY)));
boatPane.getChildren().add(group); boatPane.getChildren().add(group);
BoatModel bo = ModelFactory.boatCustomiseView(boatType, colorPicker.getValue()); BoatModel bo = ModelFactory.boatCustomiseView(currentBoat, colorPicker.getValue());
group.getChildren().add(bo.getAssets()); group.getChildren().add(bo.getAssets());
group.getChildren().add(new PointLight());
} }
public void nextBoat(ActionEvent actionEvent) { public void nextBoat(ActionEvent actionEvent) {
boatPane.getChildren().clear(); boatPane.getChildren().clear();
Group group = new Group();
boatPane.getChildren().add(group);
currentBoat = BoatMeshType.getNextBoatType(currentBoat);
BoatModel bo = ModelFactory.boatCustomiseView(currentBoat, colorPicker.getValue());
group.getChildren().add(bo.getAssets());
group.getChildren().add(new PointLight());
} }
public void prevBoat(ActionEvent actionEvent) { public void prevBoat(ActionEvent actionEvent) {
boatPane.getChildren().clear();
Group group = new Group();
boatPane.getChildren().add(group);
currentBoat = BoatMeshType.getPrevBoatType(currentBoat);
BoatModel bo = ModelFactory.boatCustomiseView(currentBoat, colorPicker.getValue());
group.getChildren().add(bo.getAssets());
group.getChildren().add(new PointLight());
} }
private void RefreshBoat() { private void RefreshBoat() {
@@ -16,6 +16,7 @@ public enum BoatMeshType {
final String hullFile, mastFile, sailFile, jibFile; final String hullFile, mastFile, sailFile, jibFile;
final double mastOffset, sailOffset; final double mastOffset, sailOffset;
final boolean fixedSail; final boolean fixedSail;
final static BoatMeshType[] boatTypes = new BoatMeshType[]{DINGHY, CAT_ATE_A_MERINGUE, PIRATE_SHIP};
BoatMeshType(String hullFile, String mastFile, double mastOffset, String sailFile, BoatMeshType(String hullFile, String mastFile, double mastOffset, String sailFile,
double sailOffset, String jibFile, boolean fixedSail) { double sailOffset, String jibFile, boolean fixedSail) {
@@ -27,4 +28,41 @@ public enum BoatMeshType {
this.jibFile = jibFile; this.jibFile = jibFile;
this.fixedSail = fixedSail; this.fixedSail = fixedSail;
} }
public static BoatMeshType getBoatMeshType(String boatType) {
switch (boatType){
case "DINGHY":
return DINGHY;
case "CAT_ATE_A_MERINGUE":
return CAT_ATE_A_MERINGUE;
case "PIRATE_SHIP":
return PIRATE_SHIP;
default:
return DINGHY;
}
}
//TODO kre39 make something not terrible to cycle through boat types
public static BoatMeshType getNextBoatType(BoatMeshType boatType) {
for (int i = 0; i < boatTypes.length; i++) {
if (i == boatTypes.length -1) {
return boatTypes[0];
} else if (boatType == boatTypes[i]) {
return boatTypes[i+1];
}
}
return boatType;
}
public static BoatMeshType getPrevBoatType(BoatMeshType boatType) {
for (int i = 0; i < boatTypes.length; i++) {
if (i == 0 && boatType == boatTypes[i]) {
return boatTypes[boatTypes.length -1];
} else if (boatType == boatTypes[i]) {
return boatTypes[i-1];
}
}
return boatType;
}
} }
@@ -11,7 +11,7 @@ import javafx.scene.transform.Rotate;
/** /**
* BoatGroup is a javafx group that by default contains a graphical objects for representing a 2 * BoatGroup is a javafx group that by default contains a graphical objects for representing a 2
* dimensional boat. It contains a single polygon for the boat, a group of lines to show it's path, * dimensional boat. It contains a single polygon for the boat, a group of lines to show it's path,
* a wake object and two text labels to annotate the boat teams name and the boats velocity. The * a wake object and two text labels to annotate the boat teams name and the boatTypes velocity. The
* boat will update it's position onscreen everytime UpdatePosition is called unless the window is * boat will update it's position onscreen everytime UpdatePosition is called unless the window is
* minimized in which case it attempts to store animations and apply them when the window is * minimized in which case it attempts to store animations and apply them when the window is
* maximised. * maximised.
@@ -35,8 +35,8 @@ public class BoatObject extends Group {
/** /**
* Creates a BoatGroup with the default triangular boat polygon. * Creates a BoatGroup with the default triangular boat polygon.
*/ */
public BoatObject() { public BoatObject(BoatMeshType boatMeshType) {
boatAssets = ModelFactory.boatGameView(BoatMeshType.PIRATE_SHIP, colour); boatAssets = ModelFactory.boatGameView(boatMeshType, colour);
boatAssets.hideSail(); boatAssets.hideSail();
boatAssets.getAssets().getTransforms().addAll( boatAssets.getAssets().getTransforms().addAll(
rotation rotation
@@ -7,6 +7,7 @@ import javafx.geometry.Point3D;
import javafx.scene.AmbientLight; import javafx.scene.AmbientLight;
import javafx.scene.CacheHint; import javafx.scene.CacheHint;
import javafx.scene.Group; import javafx.scene.Group;
import javafx.scene.PointLight;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial; import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.Circle; import javafx.scene.shape.Circle;
@@ -18,7 +19,7 @@ import javafx.scene.transform.Translate;
/** /**
* Factory class for creating 3D models of boats. * Factory class for creating 3D models of boatTypes.
*/ */
public class ModelFactory { public class ModelFactory {
@@ -57,7 +58,7 @@ public class ModelFactory {
boatAssets.getTransforms().addAll( boatAssets.getTransforms().addAll(
new Scale(8.0, 8.0, 8.0), new Scale(8.0, 8.0, 8.0),
new Rotate(-70, new Point3D(1,0,0)), new Rotate(-70, new Point3D(1,0,0)),
new Translate(16,50, 0), new Translate(16,50, 1),
animationRotate animationRotate
); );
@@ -12,7 +12,7 @@
</BoatShapes> </BoatShapes>
<Boats> <Boats>
<#list boats as boat> <#list boats as boat>
<Boat Type="Yacht" SourceID="${boat.sourceId}" ShapeID="4" HullNum="${boat.hullID}" StoweName="${boat.shortName}" ShortName="${boat.shortName}" <Boat Type="${boat.boatType}" SourceID="${boat.sourceId}" ShapeID="4" HullNum="${boat.hullID}" StoweName="${boat.shortName}" ShortName="${boat.shortName}"
BoatName="${boat.boatName}" Country="${boat.country}" Color="${boat.boatColor}"> BoatName="${boat.boatName}" Country="${boat.country}" Color="${boat.boatColor}">
<GPSposition Z="0" Y="3.7" X="0" /> <GPSposition Z="0" Y="3.7" X="0" />
<MastTop Z="0" Y="6.2" X="0" /> <MastTop Z="0" Y="6.2" X="0" />
@@ -0,0 +1,35 @@
package seng302.utilities;
import org.junit.Assert;
import org.junit.Test;
import seng302.visualiser.fxObjects.assets_3D.BoatMeshType;
/**
* Basic tests for the next and previous methods
* Created by kre39 on 20/09/17.
*/
public class BoatMeshTypeTest {
@Test
public void testNextBoatMeshType() {
BoatMeshType currentBoat = BoatMeshType.DINGHY;
BoatMeshType nextBoat = BoatMeshType.getNextBoatType(currentBoat);
Assert.assertEquals(BoatMeshType.CAT_ATE_A_MERINGUE, nextBoat);
}
@Test
public void testPreviousBoatMeshType() {
BoatMeshType currentBoat = BoatMeshType.CAT_ATE_A_MERINGUE;
BoatMeshType prevBoat = BoatMeshType.getPrevBoatType(currentBoat);
Assert.assertEquals(BoatMeshType.DINGHY, prevBoat);
}
@Test
public void testGetBoatMeshType() {
BoatMeshType currentBoat = BoatMeshType.getBoatMeshType("DINGHY");
Assert.assertEquals(BoatMeshType.DINGHY, currentBoat);
BoatMeshType wrongBoat = BoatMeshType.getBoatMeshType("NOT A REAL BOAT");
Assert.assertEquals(BoatMeshType.DINGHY, wrongBoat);
}
}