From d3f974618c7583f719d6fcd6b6ec8f69d871f411 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Ko=C5=BEusznik?= <jan@kozusznik.cz> Date: Mon, 25 Oct 2021 10:17:30 +0200 Subject: [PATCH] lab06 --- pom.xml | 2 +- src/main/java/lab/BulletAnimated.java | 28 ++++++++++++++--- src/main/java/lab/Cannon.java | 11 +++++++ src/main/java/lab/EmptyGameListener.java | 13 ++++++++ src/main/java/lab/EmptyHitListener.java | 9 ++++++ src/main/java/lab/GameController.java | 22 +++++++++++-- src/main/java/lab/GameListener.java | 8 +++++ src/main/java/lab/HitListener.java | 5 +++ src/main/java/lab/World.java | 40 +++++++++++++++++------- src/main/resources/lab/GameView.fxml | 33 ++++++++++++++++--- 10 files changed, 147 insertions(+), 24 deletions(-) create mode 100644 src/main/java/lab/EmptyGameListener.java create mode 100644 src/main/java/lab/EmptyHitListener.java create mode 100644 src/main/java/lab/GameListener.java create mode 100644 src/main/java/lab/HitListener.java diff --git a/pom.xml b/pom.xml index ccf17e2..8bdcd5d 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>vsb-cs-java1</groupId> - <artifactId>lab04</artifactId> + <artifactId>lab06</artifactId> <version>0.0.1-SNAPHOST</version> <packaging>jar</packaging> <properties> diff --git a/src/main/java/lab/BulletAnimated.java b/src/main/java/lab/BulletAnimated.java index bfe0a20..729c7c0 100644 --- a/src/main/java/lab/BulletAnimated.java +++ b/src/main/java/lab/BulletAnimated.java @@ -7,15 +7,16 @@ import javafx.scene.image.Image; public class BulletAnimated implements DrawableSimulable, Collisionable{ + private static final double STRENGTH_CANNON_COEFICIENT = 4.; + private Point2D position; private Point2D start; private Point2D speed; private Point2D initialSpeed; private double size; 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; @@ -24,7 +25,10 @@ public class BulletAnimated implements DrawableSimulable, Collisionable{ private Image image; private World world; private Cannon cannon; + private boolean fired; + private HitListener hitListener = new EmptyHitListener(); + public BulletAnimated(World world, Cannon cannon) { this(world, cannon, new Point2D(0, 0), new Point2D(0, 0), 10); } @@ -32,7 +36,7 @@ public class BulletAnimated implements DrawableSimulable, Collisionable{ public BulletAnimated(World world, Cannon cannon, Point2D start, Point2D speed, double size) { this.start = start; this.position = this.start; - this.initialSpeed = speed; + this.initialSpeed = Point2D.ZERO; this.speed = speed; this.size = size; this.world = world; @@ -49,9 +53,13 @@ public class BulletAnimated implements DrawableSimulable, Collisionable{ } public void simulate(double deltaT) { + if (!fired) { + return; + } double timeStep = deltaT * 1000; if (accelerate && start.distance(position) < cannonLength) { double cannonAngle = cannon.getAngle(); + double strenghtOfCannon = cannon.getStrength() * STRENGTH_CANNON_COEFICIENT/100.; speed = speed .add(new Point2D(Math.cos(cannonAngle) * strenghtOfCannon, Math.sin(cannonAngle) * strenghtOfCannon) .multiply(1 / mass)); @@ -74,7 +82,6 @@ public class BulletAnimated implements DrawableSimulable, Collisionable{ reload(); } - } public Rectangle2D getBoundingBox() { @@ -86,14 +93,25 @@ public class BulletAnimated implements DrawableSimulable, Collisionable{ } public void hitBy(Collisionable other) { + hitListener.hit(); reload(); } public void reload() { position = start; - speed = initialSpeed; + speed = Point2D.ZERO; hitToGround = false; + accelerate = false; + fired = false; + } + + public void fire() { + if (fired) { + return; + } + fired = true; accelerate = true; + speed = initialSpeed; } } diff --git a/src/main/java/lab/Cannon.java b/src/main/java/lab/Cannon.java index d728a05..8e428ef 100644 --- a/src/main/java/lab/Cannon.java +++ b/src/main/java/lab/Cannon.java @@ -8,11 +8,13 @@ import javafx.scene.transform.Affine; public class Cannon implements DrawableSimulable { private double angle = 0; + private double strength = 50.; private Point2D position; private Point2D size; private World world; + public Cannon(World world, Point2D position, Point2D size) { @@ -50,4 +52,13 @@ public class Cannon implements DrawableSimulable { public void setAngle(double doubleValue) { angle = doubleValue; } + + public double getStrength() { + return strength; + } + + public void setStrength(double doubleValue) { + this.strength = doubleValue; + } + } diff --git a/src/main/java/lab/EmptyGameListener.java b/src/main/java/lab/EmptyGameListener.java new file mode 100644 index 0000000..d703a08 --- /dev/null +++ b/src/main/java/lab/EmptyGameListener.java @@ -0,0 +1,13 @@ +package lab; + +public class EmptyGameListener implements GameListener { + + @Override + public void stateChanged(int shoots, int hits) { + } + + @Override + public void gameOver() { + } + +} diff --git a/src/main/java/lab/EmptyHitListener.java b/src/main/java/lab/EmptyHitListener.java new file mode 100644 index 0000000..fba8b0b --- /dev/null +++ b/src/main/java/lab/EmptyHitListener.java @@ -0,0 +1,9 @@ +package lab; + +public class EmptyHitListener implements HitListener { + + @Override + public void hit() { + } + +} diff --git a/src/main/java/lab/GameController.java b/src/main/java/lab/GameController.java index 66a0e87..c7b578b 100644 --- a/src/main/java/lab/GameController.java +++ b/src/main/java/lab/GameController.java @@ -1,9 +1,10 @@ -package lab; + package lab; import javafx.animation.AnimationTimer; import javafx.beans.value.ObservableValue; import javafx.fxml.FXML; import javafx.scene.canvas.Canvas; +import javafx.scene.control.Label; import javafx.scene.control.Slider; public class GameController { @@ -13,9 +14,18 @@ public class GameController { @FXML private Slider angleSlider; + @FXML + private Slider strengthSlider; + @FXML private Canvas canvas; + @FXML + private Label shoots; + + @FXML + private Label hits; + private AnimationTimer animationTimer; public GameController() { @@ -39,6 +49,9 @@ public class GameController { }; angleSlider.valueProperty().addListener(this::angleChanged); world.setCannonAngle(angleSlider.getValue()); + + strengthSlider.valueProperty().addListener(this::strenghtChanged); + world.setCannonStrength(strengthSlider.getValue()); animationTimer.start(); } @@ -54,7 +67,7 @@ public class GameController { @FXML private void firePressed() { - System.out.println("Fire"); + world.fire(); } @@ -63,5 +76,8 @@ public class GameController { world.setCannonAngle(newValue.doubleValue()); } - + private void strenghtChanged(ObservableValue<? extends Number> observable + , Number oldValue, Number newValue) { + world.setCannonStrength(newValue.doubleValue()); + } } diff --git a/src/main/java/lab/GameListener.java b/src/main/java/lab/GameListener.java new file mode 100644 index 0000000..337d3c3 --- /dev/null +++ b/src/main/java/lab/GameListener.java @@ -0,0 +1,8 @@ +package lab; + +public interface GameListener { + + void stateChanged(int shoots, int hits); + + void gameOver(); +} diff --git a/src/main/java/lab/HitListener.java b/src/main/java/lab/HitListener.java new file mode 100644 index 0000000..51cc8dd --- /dev/null +++ b/src/main/java/lab/HitListener.java @@ -0,0 +1,5 @@ +package lab; + +public interface HitListener { + void hit(); +} diff --git a/src/main/java/lab/World.java b/src/main/java/lab/World.java index 6e53001..58d0489 100644 --- a/src/main/java/lab/World.java +++ b/src/main/java/lab/World.java @@ -8,10 +8,17 @@ import javafx.scene.canvas.GraphicsContext; public class World { - private final static int NUMBER_OF_DRAGONS = 5; + private final static int NUMBER_OF_DRAGONS = 2; private double width; private double height; + + private GameListener gameListener = new EmptyGameListener(); + + private int hits = 0; + + private int shoots = 0; + private DrawableSimulable []entities; public World(double width, double height) { @@ -61,16 +68,6 @@ public class World { } } } - /*bulletAnimatted.simulate(timeDelta); - cannon.simulate(timeDelta); - - for(Dragon dragon: dragons) { - if (bulletAnimatted.overlaps(dragon)) { - dragon.hit(); - bulletAnimatted.reload(); - } - dragon.simulate(timeDelta); - }*/ } public double getWidth() { @@ -98,5 +95,26 @@ public class World { } } + + public void setCannonStrength(double doubleValue) { + for (DrawableSimulable d: entities) { + if (d instanceof Cannon) { + Cannon cannon = (Cannon) d; + cannon.setStrength(doubleValue); + } + } + + } + + public void fire() { + for (DrawableSimulable e: entities) { + if (e instanceof BulletAnimated) { + BulletAnimated ba = (BulletAnimated) e; + ba.fire(); + shoots++; + gameListener.stateChanged(shoots, hits); + } + } + } } diff --git a/src/main/resources/lab/GameView.fxml b/src/main/resources/lab/GameView.fxml index 373c455..e0732c4 100644 --- a/src/main/resources/lab/GameView.fxml +++ b/src/main/resources/lab/GameView.fxml @@ -1,16 +1,18 @@ <?xml version="1.0" encoding="UTF-8"?> <?import javafx.geometry.Insets?> +<?import javafx.scene.Group?> <?import javafx.scene.canvas.Canvas?> <?import javafx.scene.control.Button?> +<?import javafx.scene.control.Label?> <?import javafx.scene.control.Slider?> <?import javafx.scene.layout.BorderPane?> +<?import javafx.scene.layout.ColumnConstraints?> +<?import javafx.scene.layout.GridPane?> <?import javafx.scene.layout.HBox?> +<?import javafx.scene.layout.RowConstraints?> <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> @@ -19,8 +21,31 @@ <HBox.margin> <Insets bottom="11.0" left="14.0" right="11.0" top="12.0" /> </HBox.margin></Button> - <Slider HBox.hgrow="ALWAYS" /> + <Slider fx:id="strengthSlider" showTickLabels="true" showTickMarks="true" value="50.0" HBox.hgrow="ALWAYS" /> </children> </HBox> </bottom> + <center> + <Group BorderPane.alignment="CENTER"> + <children> + <GridPane layoutX="20.0" layoutY="20.0" prefHeight="61.0" prefWidth="167.0"> + <columnConstraints> + <ColumnConstraints hgrow="SOMETIMES" maxWidth="79.0" minWidth="10.0" prefWidth="51.0" /> + <ColumnConstraints hgrow="SOMETIMES" maxWidth="124.0" minWidth="10.0" prefWidth="116.0" /> + </columnConstraints> + <rowConstraints> + <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> + <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> + </rowConstraints> + <children> + <Label text="Shoots:" /> + <Label fx:id="shoots" text="0" GridPane.columnIndex="1" /> + <Label text="Hits:" GridPane.rowIndex="1" /> + <Label fx:id="hits" text="0" GridPane.rowIndex="1" GridPane.columnIndex="1" /> + </children> + </GridPane> + <Canvas fx:id="canvas" height="400.0" width="600.0" /> + </children> + </Group> + </center> </BorderPane> -- GitLab