Skip to content
Snippets Groups Projects
Commit 75cf1d59 authored by koz01's avatar koz01
Browse files

Complete task

parent cf0c6b55
No related merge requests found
Pipeline #72 failed with stages
in 0 seconds
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,13 @@ 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.
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 +31,7 @@ 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);
......
......@@ -15,7 +15,7 @@ public class BulletAnimated implements DrawableSimulable, Collisionable{
private double mass = 2;
private double strenghtOfCannon = 100;
private double cannonLength = 100;
private boolean accelerate = true;
private boolean accelerate;
private boolean hitToGround = false;
private double crossSectionalArea;
......@@ -49,6 +49,9 @@ public class BulletAnimated implements DrawableSimulable, Collisionable{
}
public void simulate(double deltaT) {
if(!accelerate && position == start) {
return;
}
if (accelerate && start.distance(position) < cannonLength) {
double cannonAngle = cannon.getAngle();
speed = speed
......@@ -90,6 +93,14 @@ public class BulletAnimated implements DrawableSimulable, Collisionable{
position = start;
speed = initialSpeed;
hitToGround = false;
}
public void setCannonPower(double value) {
strenghtOfCannon = value;
}
public void fire() {
reload();
accelerate = true;
}
......
......@@ -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,7 @@ public class Cannon implements DrawableSimulable {
}
public void simulate(double timeStep) {
angle = angle + direction*0.8;
if(angle <=-90 || angle >= 0) {
direction*=-1;
}
}
public void draw(GraphicsContext gc) {
......@@ -46,4 +42,9 @@ public class Cannon implements DrawableSimulable {
public double getAngle() {
return (angle * -1) / 180 * Math.PI;
}
public void setAngle(double value) {
angle = -value;
}
}
package lab;
import javafx.animation.AnimationTimer;
import javafx.fxml.FXML;
import javafx.scene.canvas.Canvas;
import javafx.scene.control.Button;
import javafx.scene.control.Slider;
public class GameController {
private World world;
@FXML
private Canvas canvas;
private AnimationTimer animationTimer;
public GameController(Canvas canvas) {
this.canvas = canvas;
}
@FXML
private Slider angleSlider;
@FXML
private Button fireButton;
@FXML
private Slider powerSlider;
private AnimationTimer animationTimer;
public void startGame() {
this.world = new World(canvas.getWidth(), canvas.getHeight());
this.world = new World(canvas.getWidth(), canvas.getHeight());
this.angleSlider.valueProperty().addListener((obj, oldValue, newValue) -> world.setCannonAngle(newValue.doubleValue()));
this.powerSlider.valueProperty().addListener((obj, oldValue, newValue) -> world.setCannonPower(newValue.doubleValue()));
world.setCannonPower(powerSlider.getValue());
//Draw scene on a separate thread to avoid blocking UI.
animationTimer = new DrawingThread(canvas, world);
animationTimer.start();
......@@ -25,5 +40,9 @@ public class GameController {
animationTimer.stop();
}
@FXML
private void firePressed() {
world.fireBullet();
}
}
......@@ -7,7 +7,7 @@ import javafx.scene.canvas.GraphicsContext;
public class World {
private final static int NUMBER_OF_DRAGONS = 5;
private final static int NUMBER_OF_DRAGONS = 1;
private double width;
private double height;
......@@ -78,4 +78,32 @@ public class World {
this.height = height;
}
public void setCannonAngle(double angle) {
for (DrawableSimulable obj: entities) {
if (obj instanceof Cannon cannon) {
cannon.setAngle(angle);
break;
}
}
}
public void setCannonPower(double value) {
for (DrawableSimulable obj: entities) {
if (obj instanceof BulletAnimated bullet) {
bullet.setCannonPower(value);
break;
}
}
}
public void fireBullet() {
for (DrawableSimulable obj: entities) {
if (obj instanceof BulletAnimated bullet) {
bullet.fire();
break;
}
}
}
}
<?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/18" xmlns:fx="http://javafx.com/fxml/1" fx:controller="lab.GameController">
<bottom>
<HBox BorderPane.alignment="CENTER">
<children>
<Slider fx:id="angleSlider" max="90.0" showTickLabels="true" showTickMarks="true" HBox.hgrow="ALWAYS">
<HBox.margin>
<Insets bottom="13.0" left="13.0" right="13.0" top="13.0" />
</HBox.margin>
</Slider>
<Button fx:id="fireButton" mnemonicParsing="false" onAction="#firePressed" text="Střílej" HBox.hgrow="ALWAYS">
<HBox.margin>
<Insets bottom="13.0" left="13.0" right="13.0" top="13.0" />
</HBox.margin>
</Button>
<Slider fx:id="powerSlider" max="210.0" min="10.0" showTickLabels="true" showTickMarks="true" HBox.hgrow="ALWAYS">
<HBox.margin>
<Insets bottom="13.0" left="13.0" right="13.0" top="13.0" />
</HBox.margin>
</Slider>
</children>
</HBox>
</bottom>
<center>
<Canvas fx:id="canvas" height="400.0" width="600.0" BorderPane.alignment="CENTER" />
</center>
</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