From ba7281bc1d8b4bc371fdee38683dd4fbe1b4aa26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Ko=C5=BEusznik?= <jan@kozusznik.cz> Date: Wed, 13 Oct 2021 10:35:59 +0200 Subject: [PATCH] lab05-solution-wednesday-900 --- src/main/java/lab/App.java | 13 ++++++------- src/main/java/lab/Cannon.java | 8 ++++++-- src/main/java/lab/GameController.java | 25 +++++++++++++++++++++++-- src/main/java/lab/World.java | 10 ++++++++++ src/main/resources/lab/GameView.fxml | 26 ++++++++++++++++++++++++++ 5 files changed, 71 insertions(+), 11 deletions(-) create mode 100644 src/main/resources/lab/GameView.fxml diff --git a/src/main/java/lab/App.java b/src/main/java/lab/App.java index 7ed50c3..71244db 100644 --- a/src/main/java/lab/App.java +++ b/src/main/java/lab/App.java @@ -1,9 +1,9 @@ package lab; import javafx.application.Application; -import javafx.scene.Group; +import javafx.fxml.FXMLLoader; import javafx.scene.Scene; -import javafx.scene.canvas.Canvas; +import javafx.scene.layout.BorderPane; import javafx.stage.Stage; import javafx.stage.WindowEvent; @@ -17,17 +17,16 @@ public class App extends Application { launch(args); } - private Canvas canvas; private GameController controller; @Override public void start(Stage primaryStage) { try { //Construct a main window with a canvas. + FXMLLoader loader = new FXMLLoader(this.getClass().getResource("GameView.fxml")); + + BorderPane root = loader.load(); - Group root = new Group(); - canvas = new Canvas(800, 600); - root.getChildren().add(canvas); Scene scene = new Scene(root); @@ -35,7 +34,7 @@ public class App extends Application { primaryStage.resizableProperty().set(false); primaryStage.setTitle("Java 1 - 6th laboratory"); primaryStage.show(); - controller = new GameController(canvas); + controller = loader.getController(); controller.startGame(); //Exit program when main window is closed primaryStage.setOnCloseRequest(this::exitProgram); diff --git a/src/main/java/lab/Cannon.java b/src/main/java/lab/Cannon.java index eb3f789..d728a05 100644 --- a/src/main/java/lab/Cannon.java +++ b/src/main/java/lab/Cannon.java @@ -7,7 +7,6 @@ import javafx.scene.transform.Affine; public class Cannon implements DrawableSimulable { - private int direction=-1; private double angle = 0; private Point2D position; private Point2D size; @@ -24,10 +23,11 @@ public class Cannon implements DrawableSimulable { } public void simulate(double timeStep) { - angle = angle + direction*0.8; + /*angle = angle + direction*0.8; if(angle <=-90 || angle >= 0) { direction*=-1; } + {*/ } public void draw(GraphicsContext gc) { @@ -46,4 +46,8 @@ public class Cannon implements DrawableSimulable { public double getAngle() { return (angle * -1) / 180 * Math.PI; } + + public void setAngle(double doubleValue) { + angle = doubleValue; + } } diff --git a/src/main/java/lab/GameController.java b/src/main/java/lab/GameController.java index 889d6a1..66a0e87 100644 --- a/src/main/java/lab/GameController.java +++ b/src/main/java/lab/GameController.java @@ -1,16 +1,24 @@ package lab; import javafx.animation.AnimationTimer; +import javafx.beans.value.ObservableValue; +import javafx.fxml.FXML; import javafx.scene.canvas.Canvas; +import javafx.scene.control.Slider; public class GameController { private World world; + + @FXML + private Slider angleSlider; + + @FXML private Canvas canvas; + private AnimationTimer animationTimer; - public GameController(Canvas canvas) { - this.canvas = canvas; + public GameController() { } public void startGame() { @@ -29,6 +37,8 @@ public class GameController { } } }; + angleSlider.valueProperty().addListener(this::angleChanged); + world.setCannonAngle(angleSlider.getValue()); animationTimer.start(); } @@ -41,6 +51,17 @@ public class GameController { world.draw(canvas); world.simulate(deltaT); } + + @FXML + private void firePressed() { + System.out.println("Fire"); + } + + + private void angleChanged(ObservableValue<? extends Number> observable + , Number oldValue, Number newValue) { + world.setCannonAngle(newValue.doubleValue()); + } } diff --git a/src/main/java/lab/World.java b/src/main/java/lab/World.java index ead7806..6e53001 100644 --- a/src/main/java/lab/World.java +++ b/src/main/java/lab/World.java @@ -89,4 +89,14 @@ public class World { this.height = height; } + public void setCannonAngle(double doubleValue) { + for (DrawableSimulable d: entities) { + if (d instanceof Cannon) { + Cannon cannon = (Cannon) d; + cannon.setAngle(doubleValue); + } + } + + } + } diff --git a/src/main/resources/lab/GameView.fxml b/src/main/resources/lab/GameView.fxml new file mode 100644 index 0000000..373c455 --- /dev/null +++ b/src/main/resources/lab/GameView.fxml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.geometry.Insets?> +<?import javafx.scene.canvas.Canvas?> +<?import javafx.scene.control.Button?> +<?import javafx.scene.control.Slider?> +<?import javafx.scene.layout.BorderPane?> +<?import javafx.scene.layout.HBox?> + +<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="lab.GameController"> + <center> + <Canvas fx:id="canvas" height="400.0" width="600.0" BorderPane.alignment="CENTER" /> + </center> + <bottom> + <HBox alignment="CENTER" BorderPane.alignment="CENTER_LEFT"> + <children> + <Slider fx:id="angleSlider" max="0.0" min="-90.0" showTickLabels="true" showTickMarks="true" value="-45.0" HBox.hgrow="ALWAYS" /> + <Button mnemonicParsing="false" onAction="#firePressed" text="Fire" HBox.hgrow="ALWAYS"> + <HBox.margin> + <Insets bottom="11.0" left="14.0" right="11.0" top="12.0" /> + </HBox.margin></Button> + <Slider HBox.hgrow="ALWAYS" /> + </children> + </HBox> + </bottom> +</BorderPane> -- GitLab