diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameSceneController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameSceneController.java index 4f25db765a951d54e157ae96fc934e71bf9920dd..3a523cc9aaf4cc3a1b89e5d3b5e645a1be87d149 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameSceneController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameSceneController.java @@ -1,6 +1,6 @@ package de.hdm_stuttgart.battlearena.Controller; -import de.hdm_stuttgart.battlearena.Controller.Utilities.ScreenClasses; +import de.hdm_stuttgart.battlearena.Controller.Utilities.SceneLoader; import de.hdm_stuttgart.battlearena.Controller.Utilities.ScreenDimensionCalculator; import de.hdm_stuttgart.battlearena.Controller.Enum.GameMode; import de.hdm_stuttgart.battlearena.Controller.Enum.GameState; @@ -17,35 +17,43 @@ import de.hdm_stuttgart.battlearena.Model.Map.TileManager; import de.hdm_stuttgart.battlearena.Model.Sound.SoundEffects; import javafx.animation.AnimationTimer; -import javafx.beans.value.ChangeListener; -import javafx.beans.value.ObservableValue; import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; -import javafx.geometry.Insets; import javafx.geometry.Rectangle2D; +import javafx.scene.Group; +import javafx.scene.Node; +import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.control.Label; import javafx.scene.control.Slider; +import javafx.scene.effect.Blend; +import javafx.scene.effect.BlendMode; +import javafx.scene.effect.BoxBlur; +import javafx.scene.effect.GaussianBlur; import javafx.scene.layout.*; +import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; import javafx.scene.text.Font; -import javafx.scene.text.Text; +import javafx.stage.Modality; import javafx.stage.Screen; +import javafx.stage.Stage; +import javafx.stage.StageStyle; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; import java.io.IOException; import java.net.URL; -import java.util.List; -import java.util.ResourceBundle; +import java.util.*; import java.util.stream.Collectors; public class GameSceneController implements Initializable { private static final Logger log = LogManager.getLogger(GameSceneController.class); - + @FXML + private BorderPane gameScene; @FXML private Canvas canvas2D; @FXML @@ -58,6 +66,9 @@ public class GameSceneController implements Initializable { private Label playerHp, enemyHp, time, round; @FXML private StackPane stackPane; + private final Pane pause = new SceneLoader().loadScene("Pause"); + + private boolean wasPaused; Screen screen = Screen.getPrimary(); Rectangle2D visualBounds = screen.getVisualBounds(); final private double healthBarWidth = screen.getBounds().getWidth() / 5; @@ -211,6 +222,13 @@ public class GameSceneController implements Initializable { graphicsContext2D.clearRect(0, 0, canvas2D.getWidth(), canvas2D.getHeight()); renderContent(graphicsContext2D); updateContent(); + if (wasPaused) { + resume(); + } + } else { + if (!wasPaused) { + pauseMenu(); + } } } }; @@ -218,6 +236,34 @@ public class GameSceneController implements Initializable { log.debug("Game loop started"); } + private void pauseMenu() { +// setting blur in for loop otherwise all child node will inherit blur from root including pause menu + for (Node child : gameScene.getChildren()) { + if (child != stackPane) { + child.setEffect(new GaussianBlur(10)); + } + } + for (Node child : stackPane.getChildren()) { + if (child != pause) { + child.setEffect(new GaussianBlur(10)); + } + } + stackPane.getChildren().add(pause); + wasPaused = true; + } + + private void resume() { + for (Node child : gameScene.getChildren()) { + child.setEffect(null); + } + for (Node child : stackPane.getChildren()) { + child.setEffect(null); + } + stackPane.getChildren().remove(pause); + wasPaused = false; + } + + private void updateContent() { player.updateEntityMovement(this); enemy.updateEntityMovement(this); diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/PauseController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/PauseController.java new file mode 100644 index 0000000000000000000000000000000000000000..bdd579ac2b471a309d265e62e932c883879b829a --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/PauseController.java @@ -0,0 +1,32 @@ +package de.hdm_stuttgart.battlearena.Controller; + +import de.hdm_stuttgart.battlearena.Controller.Utilities.SceneLoader; +import de.hdm_stuttgart.battlearena.Model.Inputs.InputHandler; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.scene.layout.VBox; + +import java.io.IOException; +import java.util.Objects; + +public class PauseController { + @FXML + private VBox parent; + + @FXML + private void resume() { + InputHandler.getInstance().setPause(false); + } + + @FXML + private void settings() { + parent.getChildren().clear(); + parent.getChildren().add(new SceneLoader().loadScene("PauseSettings")); + } + + @FXML + private void mainMenu() throws IOException { +// TODO: stop game scene + parent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/MenuBorderPane.fxml")))); + } +} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/PauseSettingsController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/PauseSettingsController.java new file mode 100644 index 0000000000000000000000000000000000000000..8ea6dba3d1e0f02ecfe80d07412cbe1a5266b540 --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/PauseSettingsController.java @@ -0,0 +1,54 @@ +package de.hdm_stuttgart.battlearena.Controller; + +import de.hdm_stuttgart.battlearena.Controller.Utilities.MusicPlayerSingleton; +import de.hdm_stuttgart.battlearena.Controller.Utilities.SceneLoader; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.fxml.Initializable; +import javafx.scene.control.Slider; +import javafx.scene.layout.VBox; + +import java.net.URL; +import java.util.ResourceBundle; + +public class PauseSettingsController implements Initializable { + @FXML + private VBox parent; + @FXML + private Slider musicSlider, sfxSlider; + SceneLoader sceneLoader = new SceneLoader(); + private int musicVolume, sfxVolume; + MusicPlayerSingleton musicPlayer = MusicPlayerSingleton.getInstance(); + Persistence persistence = Persistence.getInstance(); + + @Override + public void initialize(URL url, ResourceBundle resourceBundle) { + setMusicVolume(); + setSfxVolume(); + } + + @FXML + private void backButton() { + parent.getChildren().clear(); + parent.getChildren().add(sceneLoader.loadScene("Pause")); + } + + private void setMusicVolume() { + musicSlider.setValue(persistence.getSettings().getMusicVolume()); + musicSlider.valueProperty().addListener((observableValue, oldValue, newValue) -> { + musicVolume = newValue.intValue(); + persistence.getSettings().setMusicVolume(musicVolume); + musicPlayer.getMediaPlayer().setVolume((double) musicVolume / 100); + }); + } + + private void setSfxVolume(){ + sfxSlider.setValue(persistence.getSettings().getSfxVolume()); + sfxSlider.valueProperty().addListener(((observableValue, oldValue, newValue) -> { + sfxVolume = newValue.intValue(); + persistence.getSettings().setSfxVolume(sfxVolume); +// sfxPlayer.getMediaPlayer().setVolume((double) sfxVolume / 100); + })); + } +} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/ScreenClasses.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/ScreenClasses.java deleted file mode 100644 index 469d628a724f3761c23b14fc85f602966e3d0720..0000000000000000000000000000000000000000 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/ScreenClasses.java +++ /dev/null @@ -1,28 +0,0 @@ -package de.hdm_stuttgart.battlearena.Controller.Utilities; - -public enum ScreenClasses { -// enums have a range because the screen calculations are not precise, especially with screen scaling in the OS settings - INCH27(26, 28), - INCH24(23, 25), - INCH13_SURFACE(12, 14); - - final int lBound, uBound; - - ScreenClasses(int lBound, int uBound) { - this.lBound = lBound; - this.uBound = uBound; - } - - public static ScreenClasses inRange(int inches) { - for (ScreenClasses screens : ScreenClasses.values()) { - if (screens.isInRange(inches)) { - return screens; - } - } - return null; - } - - private boolean isInRange(int inches) { - return inches >= lBound && inches <= uBound; - } -} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Inputs/InputHandler.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Inputs/InputHandler.java index d65fd87e2145d57c442b18513b405065a09247ec..324829b13054eb7fb6f3f2e3d7d3a611e90e3468 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Inputs/InputHandler.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Inputs/InputHandler.java @@ -129,6 +129,10 @@ public class InputHandler { return isPause; } + public void setPause(boolean pause) { + isPause = pause; + } + public boolean isMoveUp() { return moveUp; } diff --git a/src/main/resources/fxml/Pause.fxml b/src/main/resources/fxml/Pause.fxml new file mode 100644 index 0000000000000000000000000000000000000000..318f3a455528b5221ee4e24caf8382d745f94ce2 --- /dev/null +++ b/src/main/resources/fxml/Pause.fxml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.scene.control.Button?> +<?import javafx.scene.layout.VBox?> + + +<VBox fx:id="parent" alignment="CENTER" prefHeight="400.0" prefWidth="600.0" spacing="20.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.hdm_stuttgart.battlearena.Controller.PauseController"> + <children> + <Button mnemonicParsing="false" onAction="#resume" text="Continue" /> + <Button mnemonicParsing="false" text="Restart" /> + <Button mnemonicParsing="false" onAction="#settings" text="Settings" /> + <Button mnemonicParsing="false" onAction="#mainMenu" text="Main Menu" /> + </children> +</VBox> diff --git a/src/main/resources/fxml/PauseSettings.fxml b/src/main/resources/fxml/PauseSettings.fxml new file mode 100644 index 0000000000000000000000000000000000000000..245ece5f4b8fdf6c78d643deb8af77e310b38dc9 --- /dev/null +++ b/src/main/resources/fxml/PauseSettings.fxml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.scene.control.Button?> +<?import javafx.scene.control.Slider?> +<?import javafx.scene.layout.HBox?> +<?import javafx.scene.layout.VBox?> +<?import javafx.scene.text.Text?> + +<VBox fx:id="parent" alignment="CENTER" prefHeight="400.0" prefWidth="600.0" spacing="20.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.hdm_stuttgart.battlearena.Controller.PauseSettingsController"> + <children> + <HBox alignment="CENTER"> + <children> + <VBox alignment="TOP_CENTER" spacing="10.0"> + <children> + <VBox alignment="CENTER" VBox.vgrow="ALWAYS"> + <children> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Music volume:" /> + <Slider fx:id="musicSlider" blockIncrement="25.0" majorTickUnit="100.0" minorTickCount="1" prefHeight="14.0" prefWidth="480.0" showTickLabels="true" value="75.0" VBox.vgrow="NEVER" /> + </children> + </VBox> + <VBox alignment="CENTER" VBox.vgrow="ALWAYS"> + <children> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="SFX volume:" /> + <Slider fx:id="sfxSlider" blockIncrement="25.0" majorTickUnit="100.0" minorTickCount="1" prefHeight="14.0" prefWidth="480.0" showTickLabels="true" value="75.0" /> + </children> + </VBox> + </children> + </VBox> + </children> + </HBox> + <Button mnemonicParsing="false" onAction="#backButton" text="Back" /> + </children> +</VBox> diff --git a/src/main/resources/styles/style.css b/src/main/resources/styles/style.css index c6d0d1c3446bc10e5bdcf9c19cc7c6d94fb33bce..391b9362f097e727cf78085a42f2c94d0ffcc14f 100644 --- a/src/main/resources/styles/style.css +++ b/src/main/resources/styles/style.css @@ -44,7 +44,7 @@ } #gameScene { - -fx-background-image: url("../textures/images/game_scene_backgorund.jpg"); + -fx-background-image: url("../textures/images/game_scene_backgorund.png"); -fx-background-size: cover; } diff --git a/src/main/resources/textures/images/game_scene_backgorund.png b/src/main/resources/textures/images/game_scene_backgorund.png new file mode 100644 index 0000000000000000000000000000000000000000..f634cef655e4982edc226cf79c3f654ea9a76926 Binary files /dev/null and b/src/main/resources/textures/images/game_scene_backgorund.png differ