From 50f1eb2a0de2d5549850c9285ff0d620210b0e34 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Ko=C5=BEusznik?= <jan@kozusznik.cz>
Date: Mon, 11 Oct 2021 15:54:55 +0200
Subject: [PATCH] lab05-solution: Monday 14:15

---
 src/main/java/lab/App.java             | 15 ++++++++-------
 src/main/java/lab/BulletAnimated.java  | 11 +++++------
 src/main/java/lab/GameController.java  | 18 +++++++++++++++---
 src/main/java/lab/World.java           | 10 ++++++++++
 src/main/resources/lab/GameWindow.fxml | 22 ++++++++++++++++++++++
 5 files changed, 60 insertions(+), 16 deletions(-)
 create mode 100644 src/main/resources/lab/GameWindow.fxml

diff --git a/src/main/java/lab/App.java b/src/main/java/lab/App.java
index 7ed50c3..e875a5f 100644
--- a/src/main/java/lab/App.java
+++ b/src/main/java/lab/App.java
@@ -1,9 +1,12 @@
 package lab;
 
 import javafx.application.Application;
+import javafx.fxml.FXMLLoader;
 import javafx.scene.Group;
+import javafx.scene.Parent;
 import javafx.scene.Scene;
 import javafx.scene.canvas.Canvas;
+import javafx.scene.layout.BorderPane;
 import javafx.stage.Stage;
 import javafx.stage.WindowEvent;
 
@@ -25,17 +28,15 @@ 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);
-			Scene scene = new Scene(root);
-			
+			FXMLLoader loader = new FXMLLoader(App.class.getResource("GameWindow.fxml"));
+			BorderPane root = loader.load();
 			
+			Scene scene = new Scene(root);
 			primaryStage.setScene(scene);
 			primaryStage.resizableProperty().set(false);
-			primaryStage.setTitle("Java 1 - 6th laboratory");
+			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 bfe0a20..9cde911 100644
--- a/src/main/java/lab/BulletAnimated.java
+++ b/src/main/java/lab/BulletAnimated.java
@@ -15,7 +15,7 @@ public class BulletAnimated  implements DrawableSimulable, Collisionable{
 	private double mass = 2;
 	private double strenghtOfCannon = 2;
 	private double cannonLength = 100;
-	private boolean accelerate = true;
+	private boolean accelerate = false;
 	private boolean hitToGround = false;
 
 	private double crossSectionalArea;
@@ -70,9 +70,7 @@ public class BulletAnimated  implements DrawableSimulable, Collisionable{
 				hitToGround = true;
 				position = new Point2D(position.getX(), size / 2);
 			}
-		} else {
-			reload();
-		}
+		} 
 		
 		
 	}
@@ -86,10 +84,11 @@ public class BulletAnimated  implements DrawableSimulable, Collisionable{
 	}
 	
 	public void hitBy(Collisionable other) {
-		reload();
+		reload(strenghtOfCannon);
 	}
 	
-	public void reload() {
+	public void reload(double force) {
+		strenghtOfCannon = force;
 		position = start;
 		speed = initialSpeed;
 		hitToGround = false;
diff --git a/src/main/java/lab/GameController.java b/src/main/java/lab/GameController.java
index 889d6a1..39d4a14 100644
--- a/src/main/java/lab/GameController.java
+++ b/src/main/java/lab/GameController.java
@@ -1,16 +1,23 @@
 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;
-	private Canvas canvas;
+	
+	@FXML
+	Canvas canvas;
+	
+	@FXML
+	Slider forceSlider;
+	
 	private AnimationTimer animationTimer;
 	
-	public GameController(Canvas canvas) {
-		this.canvas = canvas;
+	public GameController() {
 	}
 	
 	public void startGame() {
@@ -41,6 +48,11 @@ public class GameController {
 		world.draw(canvas);
 		world.simulate(deltaT);
 	}
+	
+	public void onFire() {
+		world.fireBullet(forceSlider.getValue());
+		
+	}
 
 	
 }
diff --git a/src/main/java/lab/World.java b/src/main/java/lab/World.java
index ead7806..50e4d6c 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 fireBullet(double force) {
+		for(DrawableSimulable entity: entities) {
+			if (entity instanceof BulletAnimated) {
+				BulletAnimated bullet = (BulletAnimated) entity;
+				bullet.reload(force);
+				break;
+			}
+		}
+	}
+
 }
diff --git a/src/main/resources/lab/GameWindow.fxml b/src/main/resources/lab/GameWindow.fxml
new file mode 100644
index 0000000..d95ba5a
--- /dev/null
+++ b/src/main/resources/lab/GameWindow.fxml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?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="600.0" width="800.0" BorderPane.alignment="CENTER" />
+   </center>
+   <bottom>
+      <HBox BorderPane.alignment="CENTER">
+         <children>
+            <Slider HBox.hgrow="ALWAYS" />
+            <Button mnemonicParsing="false" onAction="#onFire" prefHeight="25.0" text="Fire" HBox.hgrow="ALWAYS" />
+            <Slider fx:id="forceSlider" max="5.0" min="1.0" HBox.hgrow="ALWAYS" />
+         </children>
+      </HBox>
+   </bottom>
+</BorderPane>
-- 
GitLab