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