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