From 4653405234a3331e207feb4b6d67b17d7d0a1f74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Ko=C5=BEusznik?= <jan@kozusznik.cz> Date: Fri, 20 Oct 2023 18:54:16 +0200 Subject: [PATCH] solution --- src/main/java/lab/App.java | 14 +++++++---- src/main/java/lab/BulletAnimated.java | 5 ++-- src/main/java/lab/GameController.java | 26 ++++++++++++++++---- src/main/resources/lab/GameView.fxml | 35 +++++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 12 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 fc4398c..2f51278 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,7 +19,7 @@ public class App extends Application { launch(args); } - private Canvas canvas; + private GameController controller; @Override public void start(Stage primaryStage) { @@ -25,9 +27,9 @@ public class App extends Application { //Construct a main window with a canvas. - Group root = new Group(); - canvas = new Canvas(800, 600); - root.getChildren().add(canvas); + FXMLLoader loader = new FXMLLoader(getClass().getResource("GameView.fxml")); + BorderPane root = loader.load(); + Scene scene = new Scene(root); @@ -35,7 +37,9 @@ public class App extends Application { primaryStage.resizableProperty().set(false); primaryStage.setTitle("Java 1 - 5th 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/BulletAnimated.java b/src/main/java/lab/BulletAnimated.java index 0340e67..aadde2b 100644 --- a/src/main/java/lab/BulletAnimated.java +++ b/src/main/java/lab/BulletAnimated.java @@ -73,14 +73,14 @@ public class BulletAnimated implements DrawableSimulable, Collisionable{ position = new Point2D(position.getX(), size / 2); } } else { - fire(); + reload(); } } public Rectangle2D getBoundingBox() { return new Rectangle2D(position.getX(), position.getY() - size, size, size); - } + }; public boolean overlaps(Dragon dragon) { return getBoundingBox().intersects(dragon.getBoundingBox()); @@ -94,6 +94,7 @@ public class BulletAnimated implements DrawableSimulable, Collisionable{ position = start; speed = initialSpeed; hitToGround = false; + accelerate = false; } public void setCanonPower(double value) { diff --git a/src/main/java/lab/GameController.java b/src/main/java/lab/GameController.java index b36a006..8bcf769 100644 --- a/src/main/java/lab/GameController.java +++ b/src/main/java/lab/GameController.java @@ -1,20 +1,34 @@ package lab; import javafx.animation.AnimationTimer; +import javafx.fxml.FXML; import javafx.scene.canvas.Canvas; +import javafx.scene.control.Slider; public class GameController { private World world; + + @FXML private Canvas canvas; + + @FXML + private Slider angleSl; + + @FXML + private Slider powerSl; + private AnimationTimer animationTimer; - public GameController(Canvas canvas) { - this.canvas = canvas; + public GameController() { } public void startGame() { - this.world = new World(canvas.getWidth(), canvas.getHeight()); + this.world = new World(canvas.getWidth(), canvas.getHeight()); + + angleSl.valueProperty().addListener( (o, oldValue, newValue) -> this.world.setCannonAngle(newValue.doubleValue())); + powerSl.valueProperty().addListener( (o, oldValue, newValue) -> this.world.setCannonPower(newValue.doubleValue())); + //Draw scene on a separate thread to avoid blocking UI. animationTimer = new DrawingThread(canvas, world); animationTimer.start(); @@ -22,7 +36,6 @@ public class GameController { world.setCannonAngle(-45d); world.setCannonPower(100.); - world.fireBullet(); } @@ -30,5 +43,8 @@ public class GameController { animationTimer.stop(); } - + @FXML + private void firePressed() { + world.fireBullet(); + } } diff --git a/src/main/resources/lab/GameView.fxml b/src/main/resources/lab/GameView.fxml new file mode 100644 index 0000000..b5f7298 --- /dev/null +++ b/src/main/resources/lab/GameView.fxml @@ -0,0 +1,35 @@ +<?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/21" 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 BorderPane.alignment="CENTER"> + <children> + <Slider fx:id="angleSl" max="0.0" min="-90.0" showTickLabels="true" showTickMarks="true" value="-45.0" HBox.hgrow="ALWAYS"> + <HBox.margin> + <Insets bottom="13.0" left="13.0" right="13.0" top="13.0" /> + </HBox.margin> + </Slider> + <Button mnemonicParsing="false" onAction="#firePressed" text="Fire" HBox.hgrow="ALWAYS"> + <HBox.margin> + <Insets bottom="13.0" left="13.0" right="13.0" top="13.0" /> + </HBox.margin> + </Button> + <Slider fx:id="powerSl" max="300.0" min="10.0" showTickLabels="true" showTickMarks="true" value="100.0" HBox.hgrow="ALWAYS"> + <HBox.margin> + <Insets bottom="13.0" left="13.0" right="13.0" top="13.0" /> + </HBox.margin> + </Slider> + </children> + </HBox> + </bottom> +</BorderPane> -- GitLab