diff --git a/src/main/java/lab/App.java b/src/main/java/lab/App.java index 7ed50c35fc919c24ce2a4005b8b102bb62547418..580c1b6a531be681aab8a9b6c46546c2f075f9ea 100644 --- a/src/main/java/lab/App.java +++ b/src/main/java/lab/App.java @@ -1,9 +1,11 @@ package lab; import javafx.application.Application; +import javafx.fxml.FXMLLoader; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; +import javafx.scene.layout.BorderPane; import javafx.stage.Stage; import javafx.stage.WindowEvent; @@ -17,17 +19,15 @@ 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 +35,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 eb3f7894ff90af890ddf6ff1fda29560ed9e6ae1..e371248cbab9b233a2a480ae3eb166b4c279869f 100644 --- a/src/main/java/lab/Cannon.java +++ b/src/main/java/lab/Cannon.java @@ -24,10 +24,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 +47,8 @@ public class Cannon implements DrawableSimulable { public double getAngle() { return (angle * -1) / 180 * Math.PI; } + + public void setNewAngle(double doubleValue) { + angle = doubleValue; + } } diff --git a/src/main/java/lab/GameController.java b/src/main/java/lab/GameController.java index 889d6a1525bf0e419a03681359103201ee90e569..6d32c10dfc225e5bb8ecb79340cd02c25f51c9b3 100644 --- a/src/main/java/lab/GameController.java +++ b/src/main/java/lab/GameController.java @@ -1,16 +1,27 @@ 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; + + @FXML + private Slider forceSlider; + private AnimationTimer animationTimer; - public GameController(Canvas canvas) { - this.canvas = canvas; + public GameController() { } public void startGame() { @@ -29,6 +40,8 @@ public class GameController { } } }; + angleSlider.valueProperty().addListener(this::angleChanged); + world.setNewCannonAngle(angleSlider.getValue()); animationTimer.start(); } @@ -36,11 +49,24 @@ public class GameController { public void stopGame() { animationTimer.stop(); } + + private void angleChanged(ObservableValue<? extends Number> obj, + Number odlValue, Number newValue) { + + world.setNewCannonAngle(newValue.doubleValue()); + } private void drawScene(double deltaT) { + world.draw(canvas); world.simulate(deltaT); } + @FXML + private void firePressed() + { + System.out.println("Fire force:" + forceSlider.getValue()); + } + } diff --git a/src/main/java/lab/World.java b/src/main/java/lab/World.java index ead7806d7311180d84ebdb855ce31a51a0da13ed..3b8bbc594cdf200f53a833d9d5fed13e23aa926f 100644 --- a/src/main/java/lab/World.java +++ b/src/main/java/lab/World.java @@ -12,13 +12,15 @@ public class World { private double width; private double height; - private DrawableSimulable []entities; + private DrawableSimulable []entities; + + private Cannon cannon; public World(double width, double height) { super(); this.width = width; this.height = height; - Cannon cannon = new Cannon(this, new Point2D(50, 50), new Point2D(100, 20)); + cannon = new Cannon(this, new Point2D(50, 50), new Point2D(100, 20)); entities = new DrawableSimulable[2 + NUMBER_OF_DRAGONS]; entities[0] = cannon; entities[1] = new BulletAnimated(this, cannon, new Point2D(30, 60), new Point2D(0, 0), 40); @@ -89,4 +91,9 @@ public class World { this.height = height; } + public void setNewCannonAngle(double doubleValue) { + cannon.setNewAngle(doubleValue); + + } + } diff --git a/src/main/resources/lab/GameView.fxml b/src/main/resources/lab/GameView.fxml new file mode 100644 index 0000000000000000000000000000000000000000..ecfb8ea4dcbf1c10ccfb5e2f3e55ed7f206fe072 --- /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"> + <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="Button" HBox.hgrow="ALWAYS"> + <HBox.margin> + <Insets bottom="11.0" left="13.0" right="13.0" top="11.0" /> + </HBox.margin> + </Button> + <Slider fx:id="forceSlider" HBox.hgrow="ALWAYS" /> + </children></HBox> + </bottom> +</BorderPane>