Skip to content
Snippets Groups Projects
Verified Commit 46534052 authored by Jan Kožusznik's avatar Jan Kožusznik
Browse files

solution

parent cf4ad40e
No related merge requests found
package lab; package lab;
import javafx.application.Application; import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Group; import javafx.scene.Group;
import javafx.scene.Scene; import javafx.scene.Scene;
import javafx.scene.canvas.Canvas; import javafx.scene.canvas.Canvas;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage; import javafx.stage.Stage;
import javafx.stage.WindowEvent; import javafx.stage.WindowEvent;
...@@ -17,7 +19,7 @@ public class App extends Application { ...@@ -17,7 +19,7 @@ public class App extends Application {
launch(args); launch(args);
} }
private Canvas canvas;
private GameController controller; private GameController controller;
@Override @Override
public void start(Stage primaryStage) { public void start(Stage primaryStage) {
...@@ -25,9 +27,9 @@ public class App extends Application { ...@@ -25,9 +27,9 @@ public class App extends Application {
//Construct a main window with a canvas. //Construct a main window with a canvas.
Group root = new Group(); FXMLLoader loader = new FXMLLoader(getClass().getResource("GameView.fxml"));
canvas = new Canvas(800, 600); BorderPane root = loader.load();
root.getChildren().add(canvas);
Scene scene = new Scene(root); Scene scene = new Scene(root);
...@@ -35,7 +37,9 @@ public class App extends Application { ...@@ -35,7 +37,9 @@ public class App extends Application {
primaryStage.resizableProperty().set(false); primaryStage.resizableProperty().set(false);
primaryStage.setTitle("Java 1 - 5th laboratory"); primaryStage.setTitle("Java 1 - 5th laboratory");
primaryStage.show(); primaryStage.show();
controller = new GameController(canvas);
controller = loader.getController();
controller.startGame(); controller.startGame();
//Exit program when main window is closed //Exit program when main window is closed
primaryStage.setOnCloseRequest(this::exitProgram); primaryStage.setOnCloseRequest(this::exitProgram);
......
...@@ -73,14 +73,14 @@ public class BulletAnimated implements DrawableSimulable, Collisionable{ ...@@ -73,14 +73,14 @@ public class BulletAnimated implements DrawableSimulable, Collisionable{
position = new Point2D(position.getX(), size / 2); position = new Point2D(position.getX(), size / 2);
} }
} else { } else {
fire(); reload();
} }
} }
public Rectangle2D getBoundingBox() { public Rectangle2D getBoundingBox() {
return new Rectangle2D(position.getX(), position.getY() - size, size, size); return new Rectangle2D(position.getX(), position.getY() - size, size, size);
} };
public boolean overlaps(Dragon dragon) { public boolean overlaps(Dragon dragon) {
return getBoundingBox().intersects(dragon.getBoundingBox()); return getBoundingBox().intersects(dragon.getBoundingBox());
...@@ -94,6 +94,7 @@ public class BulletAnimated implements DrawableSimulable, Collisionable{ ...@@ -94,6 +94,7 @@ public class BulletAnimated implements DrawableSimulable, Collisionable{
position = start; position = start;
speed = initialSpeed; speed = initialSpeed;
hitToGround = false; hitToGround = false;
accelerate = false;
} }
public void setCanonPower(double value) { public void setCanonPower(double value) {
......
package lab; package lab;
import javafx.animation.AnimationTimer; import javafx.animation.AnimationTimer;
import javafx.fxml.FXML;
import javafx.scene.canvas.Canvas; import javafx.scene.canvas.Canvas;
import javafx.scene.control.Slider;
public class GameController { public class GameController {
private World world; private World world;
@FXML
private Canvas canvas; private Canvas canvas;
@FXML
private Slider angleSl;
@FXML
private Slider powerSl;
private AnimationTimer animationTimer; private AnimationTimer animationTimer;
public GameController(Canvas canvas) { public GameController() {
this.canvas = canvas;
} }
public void startGame() { 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. //Draw scene on a separate thread to avoid blocking UI.
animationTimer = new DrawingThread(canvas, world); animationTimer = new DrawingThread(canvas, world);
animationTimer.start(); animationTimer.start();
...@@ -22,7 +36,6 @@ public class GameController { ...@@ -22,7 +36,6 @@ public class GameController {
world.setCannonAngle(-45d); world.setCannonAngle(-45d);
world.setCannonPower(100.); world.setCannonPower(100.);
world.fireBullet();
} }
...@@ -30,5 +43,8 @@ public class GameController { ...@@ -30,5 +43,8 @@ public class GameController {
animationTimer.stop(); animationTimer.stop();
} }
@FXML
private void firePressed() {
world.fireBullet();
}
} }
<?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>
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment