Merge remote-tracking branch 'origin/develop' into develop

This commit is contained in:
Alistair McIntyre
2017-09-28 14:34:39 +13:00
25 changed files with 620 additions and 124 deletions
+14
View File
@@ -13,6 +13,9 @@ import org.slf4j.LoggerFactory;
import seng302.discoveryServer.DiscoveryServer;
import seng302.visualiser.controllers.ViewManager;
import java.util.Timer;
import java.util.TimerTask;
public class App extends Application {
private static Logger logger = LoggerFactory.getLogger(App.class);
@@ -92,6 +95,17 @@ public class App extends Application {
}
public static void main(String[] args) throws Exception {
/*
* Do not trust Java to do garbage collection
*/
new Timer().schedule(new TimerTask() {
@Override
public void run() {
System.gc();
}
}, 0, 1200);
try {
parseArgs(args);
} catch (ParseException e) {
@@ -158,7 +158,13 @@ public abstract class Message {
* @return The current buffer as a byte array
*/
public byte[] getBuffer(){
return buffer.array();
byte[] bytes = buffer.array();
// buffer.reset();
// buffer.clear();
// buffer = null;
return bytes;
}
/**
@@ -35,7 +35,7 @@ public class MapMaker {
private int index = 0;
private XMLGenerator xmlGenerator = new XMLGenerator();
private List<String> maps = new ArrayList<>(Arrays.asList("default.xml", "horseshoe.xml"));
private List<String> maps = new ArrayList<>(Arrays.asList("default.xml", "horseshoe.xml", "loop.xml"));
public static MapMaker getInstance() {
if (instance == null) {
@@ -2,17 +2,33 @@ package seng302.visualiser.controllers;
import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXDialog;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import javafx.application.Platform;
import javafx.collections.ListChangeListener;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.geometry.Point3D;
import javafx.scene.Group;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.Scale;
import javafx.scene.transform.Translate;
import seng302.discoveryServer.DiscoveryServerClient;
import seng302.gameServer.GameStages;
import seng302.gameServer.GameState;
@@ -27,13 +43,10 @@ import seng302.utilities.Sounds;
import seng302.visualiser.MapPreview;
import seng302.visualiser.controllers.cells.PlayerCell;
import seng302.visualiser.controllers.dialogs.BoatCustomizeController;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import seng302.visualiser.controllers.dialogs.PopupDialogController;
import seng302.visualiser.controllers.dialogs.TokenInfoDialogController;
import seng302.visualiser.fxObjects.assets_3D.ModelFactory;
import seng302.visualiser.fxObjects.assets_3D.ModelType;
public class LobbyController implements Initializable {
@@ -57,10 +70,13 @@ public class LobbyController implements Initializable {
private AnchorPane serverMap;
@FXML
private Label roomLabel;
@FXML
private Pane speedTokenPane, handlingTokenPane, windWalkerTokenPane, bumperTokenPane, randomTokenPane;
//---------FXML END---------//
private RaceState raceState;
private JFXDialog customizationDialog;
private JFXDialog tokenInfoDialog;
public Color playersColor;
private Map<Integer, ClientYacht> playerBoats;
private Double mapWidth = INITIAL_MAP_WIDTH, mapHeight = INITIAL_MAP_HEIGHT;
@@ -128,6 +144,107 @@ public class LobbyController implements Initializable {
beginRaceButton.setOnMouseEntered(e -> Sounds.playHoverSound());
initMapPreview();
initTokenPreviews();
}
/**
* Initialises the tokens in the side panel
*/
private void initTokenPreviews() {
Group speedToken = ModelFactory.importModel(ModelType.VELOCITY_PICKUP).getAssets();
Group handlingToken = ModelFactory.importModel(ModelType.HANDLING_PICKUP).getAssets();
Group windWalkerToken = ModelFactory.importModel(ModelType.WIND_WALKER_PICKUP).getAssets();
Group bumperToken = ModelFactory.importModel(ModelType.BUMPER_PICKUP).getAssets();
Group randomToken = ModelFactory.importModel(ModelType.RANDOM_PICKUP).getAssets();
HashMap<Pane, Group> tokenPanes = new HashMap<>();
tokenPanes.put(speedTokenPane, speedToken);
tokenPanes.put(handlingTokenPane, handlingToken);
tokenPanes.put(windWalkerTokenPane, windWalkerToken);
tokenPanes.put(bumperTokenPane, bumperToken);
tokenPanes.put(randomTokenPane, randomToken);
Scale hoverScale = new Scale(1.2, 1.2, 1.2);
tokenPanes.entrySet().forEach((entry) -> {
Pane thisPane = entry.getKey();
Group thisToken = entry.getValue();
thisToken.getTransforms().addAll(
new Translate(40, 50, 0),
new Scale(13, 13, 13));
thisPane.setOnMouseEntered(event -> {
thisToken.getTransforms().add(hoverScale);
});
thisPane.setOnMouseExited(event -> {
thisToken.getTransforms().remove(hoverScale);
});
thisPane.setOnMouseReleased(event -> {
tokenInfoDialog = makeTokenDialog(thisPane);
tokenInfoDialog.show();
});
thisPane.getChildren().add(thisToken);
});
//Hacky rotations for wind and random to level it in the plane
windWalkerToken.getTransforms().addAll(
new Rotate(-70, new Point3D(1, 0, 0)),
new Translate(0, 2,0)
);
randomToken.getTransforms().addAll(
new Rotate(-90, new Point3D(1, 0, 0)),
new Translate(0, 0,1)
);
}
private JFXDialog makeTokenDialog(Pane inducingPane) {
String header = "...";
String body = "Nothing to see here";
ModelType modelType = ModelType.RANDOM_PICKUP;
if (inducingPane == speedTokenPane) {
header = "Speed Boost";
body = "Increases your max velocity";
modelType = ModelType.VELOCITY_PICKUP;
} else if (inducingPane == handlingTokenPane) {
header = "Handling Boost";
body = "Increases your turing rate";
modelType = ModelType.HANDLING_PICKUP;
} else if (inducingPane == windWalkerTokenPane) {
header = "Wind Walker";
body = "The wind now rotates with you, giving you your optimal speed in all directions";
modelType = ModelType.WIND_WALKER_PICKUP;
} else if (inducingPane == bumperTokenPane) {
header = "Bumper";
body = "While this is active, upon hitting another boat, you will power it down for a short time";
modelType = ModelType.BUMPER_PICKUP;
} else if (inducingPane == randomTokenPane) {
header = "Random";
body = "A 50% chance of becoming any other token and a 50% chance of slowing your boat for a time";
modelType = ModelType.RANDOM_PICKUP;
}
FXMLLoader dialog = new FXMLLoader(
getClass().getResource("/views/dialogs/TokenInfoDialog.fxml"));
JFXDialog tokenInfoDialog = null;
try {
tokenInfoDialog = new JFXDialog(serverListMainStackPane, dialog.load(),
JFXDialog.DialogTransition.CENTER);
} catch (IOException e) {
e.printStackTrace();
}
TokenInfoDialogController controller = dialog.getController();
controller.setParentController(this);
controller.setHeader(header);
controller.setContent(body);
controller.setToken(modelType);
return tokenInfoDialog;
}
private JFXDialog createCustomizeDialog() {
@@ -252,6 +369,10 @@ public class LobbyController implements Initializable {
customizationDialog.close();
}
public void closeTokenInfoDialog() {
tokenInfoDialog.close();
}
public void setRoomCode(String roomCode) {
roomLabel.setText("Room: " + roomCode);
}
@@ -1,24 +1,12 @@
package seng302.visualiser.controllers;
import com.jfoenix.controls.JFXDecorator;
import com.jfoenix.controls.JFXSnackbar;
import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.SceneAntialiasing;
import javafx.scene.image.Image;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import seng302.gameServer.ServerAdvertiser;
import seng302.utilities.Sounds;
import seng302.visualiser.GameClient;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
/**
* Created by Kusal on 26-Sep-17.
@@ -37,7 +25,7 @@ public class SplashScreenController implements Initializable{
class SplashScreen extends Thread {
public void run(){
try {
Thread.sleep(2000);
Thread.sleep(3000);
Platform.runLater(new Runnable() {
@Override
public void run() {
@@ -302,7 +302,7 @@ public class ViewManager {
Stage stage = new Stage();
initialStartView(stage);
} catch (Exception e) {
e.printStackTrace();
logger.warn("Could not go to start view");
}
}
@@ -27,7 +27,7 @@ public class KeyBindingDialogController implements Initializable {
@FXML
private Label closeLabel;
@FXML
private JFXButton zoomInbtn;
private JFXButton zoomInBtn;
@FXML
private JFXButton zoomOutBtn;
@FXML
@@ -43,6 +43,8 @@ public class KeyBindingDialogController implements Initializable {
@FXML
private JFXButton resetBtn;
@FXML
private JFXButton confirmBtn;
@FXML
private Label upwindLabel;
@FXML
private Label downwindLabel;
@@ -70,7 +72,7 @@ public class KeyBindingDialogController implements Initializable {
gameKeyBind = GameKeyBind.getInstance();
buttons = new ArrayList<>();
Collections.addAll(buttons,
zoomInbtn, zoomOutBtn, vmgBtn, sailInOutBtn, tackGybeBtn, upwindBtn, downwindBtn,
zoomInBtn, zoomOutBtn, vmgBtn, sailInOutBtn, tackGybeBtn, upwindBtn, downwindBtn,
viewButton, rightButton, leftButton, forwardButton, backwardButton);
bindButtonWithAction();
loadKeyBind();
@@ -91,6 +93,7 @@ public class KeyBindingDialogController implements Initializable {
});
closeLabel.setOnMouseClicked(event -> ViewManager.getInstance().closeKeyBindingDialog());
confirmBtn.setOnMouseClicked(event -> ViewManager.getInstance().closeKeyBindingDialog());
}
/**
@@ -0,0 +1,90 @@
package seng302.visualiser.controllers.dialogs;
import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXTextArea;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.geometry.Point3D;
import javafx.scene.Group;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.Scale;
import javafx.scene.transform.Translate;
import seng302.utilities.Sounds;
import seng302.visualiser.controllers.LobbyController;
import seng302.visualiser.fxObjects.assets_3D.ModelFactory;
import seng302.visualiser.fxObjects.assets_3D.ModelType;
/**
* Created by wmu16 on 28/09/17.
*/
public class TokenInfoDialogController implements Initializable {
@FXML
private Label headerLabel;
@FXML
private TextArea contentText;
@FXML
private Pane tokenPane;
@FXML
private Button optionButton;
private LobbyController lobbyController;
@Override
public void initialize(URL location, ResourceBundle resources) {
optionButton.setOnMouseReleased(event -> {
Sounds.playButtonClick();
lobbyController.closeTokenInfoDialog();
});
contentText.setEditable(false);
}
public void setContent(String content) {
contentText.setText(content);
}
public void setHeader(String header) {
this.headerLabel.setText(header);
}
public void setToken(ModelType token) {
tokenPane.getChildren().clear();
Group tokenObject = ModelFactory.importModel(token).getAssets();
tokenObject.getTransforms().addAll(
new Translate(138 / 2, 138 / 2, 0),
new Scale(20, 20, 20));
if (token == ModelType.WIND_WALKER_PICKUP) {
tokenObject.getTransforms().addAll(
new Rotate(-70, new Point3D(1, 0, 0)),
new Translate(0, 2, 0)
);
} else if (token == ModelType.RANDOM_PICKUP) {
tokenObject.getTransforms().addAll(
new Rotate(-90, new Point3D(1, 0, 0)),
new Translate(0, 0, 1)
);
}
tokenPane.getChildren().add(tokenObject);
}
public void setParentController(LobbyController lobbyController) {
this.lobbyController = lobbyController;
}
}
@@ -13,7 +13,8 @@ public enum BoatMeshType {
PIRATE_SHIP("pirateship_hull.stl", "pirateship_mast.stl", -0.5415, "pirateship_mainsail.stl",
-0.5415, "pirateship_frontsail.stl", true, 1.2, 1.6, 1.2),
DUCKY("ducky_hull.stl", "ducky_mast.stl", -2.18539, "ducky_sail.stl", -2.18539, "ducky_eyes.stl", false, 1.2, 1.1, 1.4),
PARROT("parrot_hull.stl", null, 0, "parrot_sail.stl", 0, "parrot_features.stl", true, 1, 1, 1);
PARROT("parrot_hull.stl", null, 0, "parrot_sail.stl", 0, "parrot_features.stl", true, 1, 1, 1),
WAKA("waka_hull.stl", "waka_mast.stl", 0, "waka_sail.stl", 0, null, true, 1.7, 0.5, 1.5);
final String hullFile, mastFile, sailFile, jibFile;
final double mastOffset, sailOffset;
@@ -21,7 +22,7 @@ public enum BoatMeshType {
public final double accelerationMultiplier;
public final double turnStep;
final boolean fixedSail;
final static BoatMeshType[] boatTypes = new BoatMeshType[]{DINGHY, CATAMARAN, PIRATE_SHIP, DUCKY, PARROT};
final static BoatMeshType[] boatTypes = new BoatMeshType[]{DINGHY, CATAMARAN, PIRATE_SHIP, DUCKY, PARROT, WAKA};
BoatMeshType(String hullFile, String mastFile, double mastOffset, String sailFile,
double sailOffset, String jibFile, boolean fixedSail, double maxSpeedMultiplier, double accelerationMultiplier, double turnStep) {
@@ -80,30 +80,6 @@ public class ModelFactory {
return bo;
}
public static BoatModel boatRotatingView(BoatMeshType boatType, Color primaryColour) {
Group boatAssets = getUnmodifiedBoatModel(boatType, primaryColour);
boatAssets.getTransforms().addAll(
new Scale(40, 40, 40),
new Rotate(90, new Point3D(0,0,1)),
new Rotate(90, new Point3D(0, 1, 0))
);
final Rotate animationRotate = new Rotate(0, new Point3D(1,1,1));
boatAssets.getTransforms().add(animationRotate);
return new BoatModel(boatAssets, new AnimationTimer() {
private double rotation = 0;
private Rotate rotate = animationRotate;
@Override
public void handle(long now) {
rotation += 0.5;
rotate.setAngle(rotation);
}
}, boatType);
}
public static BoatModel boatGameView(BoatMeshType boatType, Color primaryColour) {
Group boatAssets = getUnmodifiedBoatModel(boatType, primaryColour);
boatAssets.getTransforms().setAll(
@@ -117,23 +93,26 @@ public class ModelFactory {
Group boatAssets = new Group();
MeshView hull = importBoatSTL(boatType.hullFile);
hull.setMaterial(new PhongMaterial(primaryColour));
MeshView sail = importBoatSTL(boatType.sailFile);
sail.setMaterial(
new PhongMaterial(boatType == BoatMeshType.PARROT ? Color.BLACK : Color.WHITE)
);
boatAssets.getChildren().addAll(hull, sail);
boatAssets.getChildren().add(hull);
if (boatType.mastFile != null) {
MeshView mast = importBoatSTL(boatType.mastFile);
mast.setMaterial(new PhongMaterial(primaryColour));
boatAssets.getChildren().add(mast);
} else {
boatAssets.getChildren().add(new Group());
}
MeshView sail = importBoatSTL(boatType.sailFile);
sail.setMaterial(
new PhongMaterial(boatType == BoatMeshType.PARROT ? Color.DARKGRAY : Color.WHITE)
);
boatAssets.getChildren().add(sail);
if (boatType.jibFile != null) {
MeshView jib = importBoatSTL(boatType.jibFile);
sail.setMaterial(
new PhongMaterial(boatType == BoatMeshType.PARROT ? Color.DARKGRAY : Color.WHITE)
jib.setMaterial(
new PhongMaterial(boatType == BoatMeshType.PARROT ? Color.BLACK : Color.WHITE)
);
boatAssets.getChildren().add(jib);
}