diff --git a/racevisionGame/pom.xml b/racevisionGame/pom.xml index 41157414..16afe756 100644 --- a/racevisionGame/pom.xml +++ b/racevisionGame/pom.xml @@ -54,6 +54,11 @@ 9.0 + + InteractiveMesh + STLImporter + 0_4_1 + @@ -72,7 +77,11 @@ http://download.osgeo.org/webdav/geotools/ - + + interactivemesh + Interactive Mesh + http://umbrasheep.com:8888/repository/internal/ + diff --git a/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java b/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java new file mode 100644 index 00000000..7bff7325 --- /dev/null +++ b/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java @@ -0,0 +1,209 @@ +package visualiser.Controllers; + +import javafx.animation.AnimationTimer; +import javafx.application.Platform; +import javafx.fxml.FXML; +import javafx.scene.control.*; +import javafx.scene.image.ImageView; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.Pane; +import mock.app.Event; +import network.Messages.Enums.RaceStatusEnum; +import network.Messages.Enums.RequestToJoinEnum; +import visualiser.gameController.ControllerClient; +import visualiser.model.View3D; +import visualiser.model.VisualiserRaceEvent; +import visualiser.model.VisualiserRaceState; + +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; + +/** + * Controller for Hosting a game. + */ +public class InGameLobby extends Controller { + + +// @FXML +// TextField gameNameField; +// +// @FXML +// TextField hostNameField; + + @FXML + private ImageView imageView; + + @FXML + AnchorPane gameLobbyWrapper; + + @FXML + AnchorPane imagePane; + + @FXML + SplitPane splitPane; + + @FXML + AnchorPane specPane; + + @FXML + GridPane playerContainer; + + @FXML + private Pane playerPane; + + @FXML + private Pane playerPane4; + + @FXML + private Button startButton; + + @FXML + private Label countdownLable; + + private Event game; + + private View3D fancyStuff; + + private VisualiserRaceEvent visualiserRaceEvent; + + private boolean isHost; + + private ControllerClient controllerClient; + + @Override + public void initialize(URL location, ResourceBundle resources) { + fancyStuff = new View3D(); + playerPane4.getChildren().add(fancyStuff); + + //centering the 3d object + fancyStuff.layoutXProperty().bind(playerPane4.widthProperty().subtract(fancyStuff.widthProperty()).divide(2)); + fancyStuff.layoutYProperty().bind(playerPane4.heightProperty().subtract(fancyStuff.heightProperty()).divide(2)); + //playerContainer.add(fancyStuff, 0,0); + + fancyStuff.spinBox(); + } + + /** + * Starts the race. + */ + private void startRace() { + initialiseRaceClock(this.visualiserRaceEvent.getVisualiserRaceState()); + //Starts the race countdown timer. + countdownTimer(); + } + + /** + * Initialises the race clock/timer labels for the start time, current time, and remaining time. + * @param visualiserRace The race to get data from. + */ + private void initialiseRaceClock(VisualiserRaceState visualiserRace) { + //Remaining time. + initialiseRaceClockDuration(visualiserRace); + + } + + + /** + * Initialises the race duration label. + * @param visualiserRace The race to get data from. + */ + private void initialiseRaceClockDuration(VisualiserRaceState visualiserRace) { + + visualiserRace.getRaceClock().durationProperty().addListener((observable, oldValue, newValue) -> { + Platform.runLater(() -> { + countdownLable.setText(newValue); + }); + }); + + } + /** + * Countdown timer until race starts. + */ + private void countdownTimer() { + new AnimationTimer() { + @Override + public void handle(long arg0) { + + //Get the current race status. + RaceStatusEnum raceStatus = visualiserRaceEvent.getVisualiserRaceState().getRaceStatusEnum(); + + + //If the race has reached the preparatory phase, or has started... + if (raceStatus == RaceStatusEnum.PREPARATORY || raceStatus == RaceStatusEnum.STARTED) { + //Stop this timer. + stop(); + + //Hide this, and display the race controller. + gameLobbyWrapper.setVisible(false); + + parent.beginRace(visualiserRaceEvent, controllerClient, isHost); + + } + } + }.start(); + } + + /** + * Hosts a game. + */ + public void enterGameLobby(Socket socket, boolean isHost){ + 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()); + this.isHost = isHost; + this.controllerClient = visualiserRaceEvent.getControllerClient(); + + if (!isHost){ + startButton.setVisible(false); + } + + try { + + this.visualiserRaceEvent = new VisualiserRaceEvent(socket, RequestToJoinEnum.PARTICIPANT); + gameLobbyWrapper.setVisible(true); + startRace(); + + } catch (IOException e) { + //TODO should probably let this propagate, so that we only enter this scene if everything works + Logger.getGlobal().log(Level.WARNING, "Could not connect to server.", e); + } + } + + /** + * Menu button pressed. Prompt alert then return to menu + */ + 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){ + gameLobbyWrapper.setVisible(false); + parent.enterTitle(); + } + } + + /** + * 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"); + } + + public void joinSpecPressed(){ + System.out.println("Spectator list pressed. Joining spectators"); + } + + public void joinRacePressed(){ + System.out.println("Empty race user pane pressed. Joining racers"); + } + +} diff --git a/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java b/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java index 184965c0..a820e226 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java @@ -29,7 +29,7 @@ import java.util.ResourceBundle; public class LobbyController extends Controller { @FXML - AnchorPane lobbyWrapper; + private AnchorPane lobbyWrapper; @FXML private TableView lobbyTable; @FXML diff --git a/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java b/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java index 32e033c8..5617e3da 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java @@ -81,7 +81,6 @@ public class TitleController extends Controller { @Override public void initialize(URL location, ResourceBundle resources) { - } /** 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/BoatDisplay3D.java b/racevisionGame/src/main/java/visualiser/model/BoatDisplay3D.java new file mode 100644 index 00000000..9314f5cd --- /dev/null +++ b/racevisionGame/src/main/java/visualiser/model/BoatDisplay3D.java @@ -0,0 +1,18 @@ +package visualiser.model; + +import com.interactivemesh.jfx.importer.Importer; +import javafx.scene.layout.Pane; + +/** + * Created by fwy13 on 29/08/17. + */ +public class BoatDisplay3D extends Pane { + + + public BoatDisplay3D(String filePath){ + super(); +// Shape3D +// this.getChildren().add(); + } + +} diff --git a/racevisionGame/src/main/java/visualiser/model/View3D.java b/racevisionGame/src/main/java/visualiser/model/View3D.java new file mode 100644 index 00000000..f6937755 --- /dev/null +++ b/racevisionGame/src/main/java/visualiser/model/View3D.java @@ -0,0 +1,49 @@ +package visualiser.model; + +import javafx.animation.AnimationTimer; +import javafx.scene.Group; +import javafx.scene.PerspectiveCamera; +import javafx.scene.SubScene; +import javafx.scene.layout.Pane; +import javafx.scene.shape.Box; +import javafx.scene.shape.CullFace; +import javafx.scene.transform.Rotate; + +/** + * Created by connortaylorbrown on 30/08/17. + */ +public class View3D extends Pane { + SubScene scene; + PerspectiveCamera camera; + Box box; + + public View3D() { + scene = new SubScene(this, 500, 500); + camera = new PerspectiveCamera(); + scene.setCamera(camera); + } + + public void spinBox() { + camera.getTransforms().add(new Rotate(-20, Rotate.X_AXIS)); + + 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); + box.getTransforms().add(ry); + + this.getChildren().add(camera); + this.getChildren().add(box); + + AnimationTimer rotation = new AnimationTimer() { + @Override + public void handle(long now) { + ry.setAngle(ry.getAngle() + 0.1); + } + }; + + rotation.start(); + } +} 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 00000000..c70d8df6 Binary files /dev/null and b/racevisionGame/src/main/resources/visualiser/images/lobby.gif differ 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 @@ - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/racevisionGame/src/main/resources/visualiser/scenes/main.fxml b/racevisionGame/src/main/resources/visualiser/scenes/main.fxml index 074a9b31..7aff44c0 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/main.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/main.fxml @@ -7,7 +7,7 @@ - + diff --git a/racevisionGame/src/main/resources/visualiser/scenes/title.fxml b/racevisionGame/src/main/resources/visualiser/scenes/title.fxml index f448a226..255381af 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/title.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/title.fxml @@ -1,61 +1,61 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +