diff --git a/README.md b/README.md index 69625de7934d607289e90646606803cc8faefb41..d351a7e1c76dec53336acb562d9f67b5c8075daf 100644 --- a/README.md +++ b/README.md @@ -1 +1,4 @@ ## Hier könnte ihre Werbung stehn + +### Known issues + - Videos sometimes don't load in windows 11 especially on weaker systems diff --git a/pom.xml b/pom.xml index 4cf921c1adaad2cf290231e1715fa044c64b067d..00cecae4b603bb2ef7a769e8effa5db5010b47d5 100644 --- a/pom.xml +++ b/pom.xml @@ -65,6 +65,18 @@ <version>19.0.2.1</version> </dependency> + <dependency> + <groupId>com.jtransc</groupId> + <artifactId>jtransc-rt</artifactId> + <version>0.5.0-ALPHA4</version> + </dependency> + + <!--<dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-core</artifactId> + <version>4.3.24.RELEASE</version> + </dependency>--> + <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc11</artifactId> diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/CommunityMapController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/CommunityMapController.java index 3dc79401a4a89941e5bcffa4b07dacbb45c14817..be1256f441fa09604694e890557db0bd53131531 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/CommunityMapController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/CommunityMapController.java @@ -49,7 +49,7 @@ public class CommunityMapController implements Initializable { // TODO: create map preview @FXML - private void backButton() { // for some reason compiler doesn't recognize method usage when 'back' is used as method name. Any other method name works however + private void backButton() { parent.getChildren().clear(); parent.getChildren().add(new SceneLoader().loadScene("MapForge")); } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/IntroController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/IntroController.java index 2c4472104e35751cedb56601d0b5f6b13f72e278..0ee284ce321557aafe682c4accff45c12625da6c 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/IntroController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/IntroController.java @@ -1,6 +1,9 @@ package de.hdm_stuttgart.battlearena.Controller; import de.hdm_stuttgart.battlearena.Controller.Utilities.CreateMediaPlayer; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions.DatabaseException; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.StartupThread; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; @@ -8,6 +11,8 @@ import javafx.scene.Cursor; import javafx.scene.layout.BorderPane; import javafx.scene.media.MediaPlayer; import javafx.scene.media.MediaView; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import java.io.File; import java.io.IOException; @@ -27,12 +32,15 @@ public class IntroController implements Initializable { private File file = new File(fileName + videos[0]); private int counter = 0; private MediaPlayer mediaPlayer; + private final Persistence persistence = Persistence.getInstance(); + private static final Logger log = LogManager.getLogger(Persistence.class); @Override public void initialize(URL url, ResourceBundle resourceBundle) { introParent.setStyle("-fx-background-color: black;"); introParent.setCursor(Cursor.NONE); createMediaPlayer(); + new StartupThread().run(); } private void createMediaPlayer() { @@ -42,7 +50,11 @@ public class IntroController implements Initializable { mediaPlayer.setOnEndOfMedia(() -> { if (counter == videos.length - 1) { - videoEnd(); + try { + videoEnd(); + } catch (IOException e) { + throw new RuntimeException(e); + } } else { nextVideo(); } @@ -51,21 +63,42 @@ public class IntroController implements Initializable { // TODO: make any button pressed work introParent.setOnMouseClicked((mouseEvent) -> { if (counter == videos.length - 1) { - videoEnd(); + try { + videoEnd(); + } catch (IOException e) { + throw new RuntimeException(e); + } } else { nextVideo(); } }); } - private void videoEnd() { -// TODO: check if player exists - try { - mediaPlayer.dispose(); - introParent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/PlayerCreateScene.fxml")))); - } catch (IOException e) { - throw new RuntimeException(); + private void videoEnd() throws IOException { + boolean isStartUp = true, noAccount = false, statsLoaded = false; + while (isStartUp) { + try { + persistence.loadPlayerAccount(); + persistence.verifyPlayerAccount(); + mediaPlayer.dispose(); + isStartUp = false; + } catch (DatabaseException e) { + noAccount = true; +// TODO: reset player account if account fails to load in loadPlayerAccount() + } + if (noAccount) { + introParent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/PlayerCreateScene.fxml")))); + } + } + while (!statsLoaded) { // while loop because Martin said so + try { + persistence.loadPlayerStatistics(); + statsLoaded = true; + } catch (DatabaseException e) { + log.error(e); + } } + introParent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/MenuBorderPane.fxml")))); } private void nextVideo() { diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MainMenuController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MainMenuController.java index c71e7fc4804f06df9f0249a24e102b057c55ba7a..83a6d92e8b0dbe60af7cbbbe09a263afdb51a6b5 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MainMenuController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MainMenuController.java @@ -1,6 +1,8 @@ package de.hdm_stuttgart.battlearena.Controller; import de.hdm_stuttgart.battlearena.Controller.Utilities.SceneLoader; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions.DatabaseException; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Button; @@ -17,6 +19,7 @@ public class MainMenuController implements Initializable { @FXML private Button exitButton; private final SceneLoader sceneLoader = new SceneLoader(); + private final Persistence persistence = Persistence.getInstance(); private void switchScene(String name) { parent.getChildren().clear(); @@ -44,7 +47,9 @@ public class MainMenuController implements Initializable { } @FXML - private void exit() { + private void exit() throws DatabaseException { + persistence.savePlayerStatistics(); + persistence.saveSettings(); Stage stage = (Stage) exitButton.getScene().getWindow(); stage.close(); } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MapForgeController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MapForgeController.java index 7f57a6dd566a493f12e2c9ffdea4772df823f130..784361391329dab062e1c64e5aee944381861ff1 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MapForgeController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MapForgeController.java @@ -2,6 +2,8 @@ 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.Exceptions.DatabaseException; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.layout.VBox; @@ -13,6 +15,7 @@ public class MapForgeController { @FXML private VBox parent; SceneLoader sceneLoader = new SceneLoader(); + private final Persistence persistence = Persistence.getInstance(); @FXML private void mapEditorScene() { @@ -30,13 +33,9 @@ public class MapForgeController { } @FXML - private void updateMapScene() { - try { - parent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/PlayerCreateScene.fxml")))); - MusicPlayerSingleton.getInstance().getMediaPlayer().dispose(); - } catch (IOException e) { - throw new RuntimeException(); - } + private void updateMapScene() throws DatabaseException { + persistence.updateCoreMaps(); +// TODO: set message label if update was successful or not } @FXML diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MapSelectionController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MapSelectionController.java new file mode 100644 index 0000000000000000000000000000000000000000..d821334354bd487632d52077ffa4a3c21f6a1914 --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MapSelectionController.java @@ -0,0 +1,72 @@ +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.MapData; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.fxml.Initializable; +import javafx.scene.control.ToggleButton; +import javafx.scene.control.ToggleGroup; +import javafx.scene.layout.VBox; +import javafx.scene.text.Text; + +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Objects; +import java.util.ResourceBundle; + +public class MapSelectionController implements Initializable { + @FXML + private VBox boxBox, parent; + @FXML + private Text selectedMapText; + + private int selectedMap; + + private final SceneLoader sceneLoader = new SceneLoader(); + + private final ArrayList<MapData> coreMaps = Persistence.getInstance().getCoreMaps(); + + @Override + public void initialize(URL url, ResourceBundle resourceBundle) { + ToggleGroup group = new ToggleGroup(); + + for (int i = 0; i < coreMaps.size(); i++) { + ToggleButton toggleButton = new ToggleButton(coreMaps.get(i).getMapName()); + toggleButton.setToggleGroup(group); + boxBox.getChildren().add(toggleButton); + } + + group.selectedToggleProperty().addListener((observableValue, oldToggle, newToggle) -> { + if (group.getSelectedToggle() != null) { + ToggleButton selected = (ToggleButton) group.getSelectedToggle(); + selectedMap = boxBox.getChildren().indexOf(selected); + System.out.println(selectedMap); + String value = selected.getText(); + selectedMapText.setText(value); + System.out.println(value); + } + }); + } + + @FXML + private void gameScene() { + try { + RuntimeInfo.getInstance().setGameMap(coreMaps.get(selectedMap)); + MusicPlayerSingleton.getInstance().getMediaPlayer().dispose(); + parent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/GameScene.fxml")))); + } catch (IOException e) { + throw new RuntimeException(); + } + } + + @FXML + private void backButton() { + parent.getChildren().clear(); + parent.getChildren().add(sceneLoader.loadScene("SkinSelection")); + } +} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MenuBorderPaneController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MenuBorderPaneController.java index 81b05ca9a8de2670edb504e78a78fb3e20ca2ebd..392326c31e7e700ca491b955e92531d125bf9e5f 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MenuBorderPaneController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MenuBorderPaneController.java @@ -3,6 +3,7 @@ package de.hdm_stuttgart.battlearena.Controller; import de.hdm_stuttgart.battlearena.Controller.Utilities.CreateMediaPlayer; 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.Initializable; import javafx.geometry.Rectangle2D; @@ -35,11 +36,12 @@ public class MenuBorderPaneController implements Initializable { private final String[] videoFiles = {"depression", "allMyFellas", "wooOOoo", "myMind", "dogCheese", "gta", "cat", "bobama", "roomba", "firework", "cheezburger", "kangaroo", "lifeCouldBeMonke", "seal", "imNotYou", "parkingTickets", "russianKid", "rejectHumanity", "horse", "catSitting", "pablo", "holyCrap", "lessGoo", "sadCat", "basketball", "yoinkySploinky", "msPuff", "=D", "banana", "chaCha", "async", "sadHorse", "minecraftCat", "muecke", "top10Cats", "dog", - "pot", "mineCraftCat2", "catEating", "bear", "pancake", "frog", "gtfo", "carl", "dog2", "slippery", "wolf", "legCat", "sad", "waaahhh"}; + "pot", "mineCraftCat2", "catEating", "catJump", "bear", "pancake", "frog", "gtfo", "carl", "dog2", "slippery", "wolf", "legCat", "sad", "waaahhh"}; List<String> shuffledVideos = Arrays.asList(videoFiles); Rectangle2D screen = Screen.getPrimary().getVisualBounds(); + @Override public void initialize(URL url, ResourceBundle resourceBundle) { center.getChildren().add(sceneLoader.loadScene("MainMenu")); @@ -107,6 +109,7 @@ public class MenuBorderPaneController implements Initializable { private void backgroundMusic(String file) { Media media = new Media(new File("src/main/resources/sound/music/" + file).toURI().toString()); musicPlayer = new MediaPlayer(media); + musicPlayer.setVolume((double) Persistence.getInstance().getSettings().getMusicVolume() / 100); musicPlayer.setCycleCount(MediaPlayer.INDEFINITE); musicPlayer.play(); MusicPlayerSingleton.getInstance().setMediaPlayer(musicPlayer); diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/SettingsController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/SettingsController.java index a3c7526665111d073af465d5c74599952442b63b..a04eb1c6d84b615f3eff95b33d86485cb0ef5b51 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/SettingsController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/SettingsController.java @@ -2,6 +2,7 @@ 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; @@ -17,14 +18,16 @@ public class SettingsController implements Initializable { @FXML private VBox parent; @FXML - private Slider musicVolume, sfxVolume; + private Slider musicSlider, sfxSlider; SceneLoader sceneLoader = new SceneLoader(); - public double music; + private int musicVolume, sfxVolume; MusicPlayerSingleton musicPlayer = MusicPlayerSingleton.getInstance(); + Persistence persistence = Persistence.getInstance(); @Override public void initialize(URL url, ResourceBundle resourceBundle) { setMusicVolume(); + setSfxVolume(); } @FXML @@ -40,17 +43,20 @@ public class SettingsController implements Initializable { } private void setMusicVolume() { -// need a runtime database to save volume - musicVolume.valueProperty().addListener((observableValue, oldValue, newValue) -> { - setMusic(musicVolume); - System.out.println(music); + 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 setMusic(Slider slider) { - slider.valueProperty().addListener(((observableValue, oldValue, newValue) -> { - music = newValue.doubleValue() / 100; - musicPlayer.getMediaPlayer().setVolume(music); + 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/SkinSelectionController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/SkinSelectionController.java index 6015655a06d8dad0530362087a84c6e87e646f57..9e27cab1e0a87b52e01a1ea63b84ba6cf6b46006 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/SkinSelectionController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/SkinSelectionController.java @@ -54,11 +54,9 @@ public class SkinSelectionController implements Initializable { @FXML private void gameScene() { - try { - MusicPlayerSingleton.getInstance().getMediaPlayer().dispose(); - parent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/GameScene.fxml")))); - } catch (IOException e) { - throw new RuntimeException(); - } + + + parent.getChildren().clear(); + parent.getChildren().add(new SceneLoader().loadScene("MapSelection")); } } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/StatisticsController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/StatisticsController.java index 009c8a94b5f4a68c3c1b21ddcf194621be698a9c..ee8ccd517fc9c48f3178e792d136dba3f20783e8 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/StatisticsController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/StatisticsController.java @@ -1,6 +1,7 @@ package de.hdm_stuttgart.battlearena.Controller; import de.hdm_stuttgart.battlearena.Controller.Utilities.SceneLoader; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence; import javafx.beans.binding.Bindings; import javafx.collections.FXCollections; import javafx.collections.ObservableList; @@ -23,6 +24,8 @@ public class StatisticsController implements Initializable { private PieChart kd, wl; SceneLoader sceneLoader = new SceneLoader(); + Persistence persistence = Persistence.getInstance(); + public void mainMenuScene() { parent.getChildren().clear(); parent.getChildren().add(sceneLoader.loadScene("MainMenu")); @@ -30,17 +33,27 @@ public class StatisticsController implements Initializable { @Override public void initialize(URL url, ResourceBundle resourceBundle) { - iniPieChartkd(); - iniPieChartwl(); + iniPieChartKD(); + iniPieChartWL(); kd.setLegendVisible(false); wl.setLegendVisible(false); + setLabels(); + } + + private void setLabels() { + kills.setText(String.valueOf(persistence.getStatistics().getKills())); + gamesWon.setText(Integer.toString(persistence.getStatistics().getGamesWon())); + gamesLost.setText(String.valueOf(persistence.getStatistics().getGamesLost())); + gameTime.setText(Integer.toString(persistence.getStatistics().getGameTimeInHours())); + deaths.setText(String.valueOf(persistence.getStatistics().getDeaths())); + blocks.setText(Integer.toString(persistence.getStatistics().getBlocksDestroyed())); } - public void iniPieChartkd() { + public void iniPieChartKD() { ObservableList<PieChart.Data> pieChartData = FXCollections.observableArrayList( - new PieChart.Data("Kills", 20), - new PieChart.Data("Deaths", 12)); + new PieChart.Data("Kills", persistence.getStatistics().getKills()), + new PieChart.Data("Deaths", persistence.getStatistics().getDeaths())); pieChartData.forEach(data -> data.nameProperty().bind( @@ -52,11 +65,11 @@ public class StatisticsController implements Initializable { kd.getData().addAll(pieChartData); } - public void iniPieChartwl() { + public void iniPieChartWL() { ObservableList<PieChart.Data> pieChartData = FXCollections.observableArrayList( - new PieChart.Data("Wins", 3), - new PieChart.Data("Losses", 5)); + new PieChart.Data("Wins", persistence.getStatistics().getGamesWon()), + new PieChart.Data("Losses", persistence.getStatistics().getGamesLost())); pieChartData.forEach(data -> data.nameProperty().bind( diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Main/Main.java b/src/main/java/de/hdm_stuttgart/battlearena/Main/Main.java index 5ba11eb60e0f13ae13883241d2a96279e5f58025..dd93c23719f1f4cb260c6b9da8a0f1f1fac2b475 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Main/Main.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Main/Main.java @@ -1,6 +1,11 @@ package de.hdm_stuttgart.battlearena.Main; + +import de.hdm_stuttgart.battlearena.Model.Sound.MusicType; +import de.hdm_stuttgart.battlearena.Model.Sound.SFX; +import de.hdm_stuttgart.battlearena.Model.Sound.SoundManager; import de.hdm_stuttgart.battlearena.Model.Inputs.InputHandler; + import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.geometry.Rectangle2D; @@ -30,6 +35,7 @@ public class Main extends Application { @Override public void start(Stage stage) throws Exception { + // loading font in start() because CSS can't handle whitespace in folder names Font.loadFont(getClass().getResourceAsStream("/fonts/StarshipShadow.ttf"), 50); @@ -53,6 +59,17 @@ public class Main extends Application { scene.getStylesheets().add(Objects.requireNonNull(this.getClass().getResource("/styles/style.css")).toExternalForm()); stage.setScene(scene); + + SoundManager soundManager = new SoundManager(); + + stage.setOnCloseRequest(event -> { + if (soundManager != null) { + soundManager.stopMusic(); + } + }); + + soundManager.playMusic(MusicType.GAME); + stage.show(); log.debug("Project started successfully!"); } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/ISoundManager.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/ISoundManager.java new file mode 100644 index 0000000000000000000000000000000000000000..7f31c780e19380b4f58e02ab5a854d8b25ea2019 --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/ISoundManager.java @@ -0,0 +1,16 @@ +package de.hdm_stuttgart.battlearena.Model.Sound; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.nio.file.Path; +import java.util.List; + +public interface ISoundManager { + + + + void playSoundEffect() throws InterruptedException, MalformedURLException; //plays sound effects only + + List<Path> getFilePathsFromResources(Path folderPath) throws IOException; // gets file-paths in a Folder as a list + +} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/MusicType.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/MusicType.java new file mode 100644 index 0000000000000000000000000000000000000000..b7d5924e85a9559d88db4bf4a295fd235fc2aa5b --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/MusicType.java @@ -0,0 +1,16 @@ +package de.hdm_stuttgart.battlearena.Model.Sound; + +public enum MusicType { + MENU("src/main/resources/sound/music/menu"), + OPTIONS("src/main/resources/sound/music/options"), + GAME("src/main/resources/sound/music/game"); + + private String path; + MusicType(String path){ + this.path = path; + } + + public String getPath(){ + return path; + } +} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFX.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFX.java new file mode 100644 index 0000000000000000000000000000000000000000..4c4dae812049378d829bd1a0c1d6d3504e350530 --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFX.java @@ -0,0 +1,17 @@ +package de.hdm_stuttgart.battlearena.Model.Sound; + +public enum SFX { + GRASS("/sound/sfx/steps/grass"), + STONE("/sound/sfx/steps/stone"), + COLLISION("/sound/sfx/collision"), + ATTACK("/sound/sfx/attack"); + + private String path; + SFX(String path){ + this.path = path; + } + + public String getPath(){ + return path; + } +} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundManager.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundManager.java new file mode 100644 index 0000000000000000000000000000000000000000..41af98775814a73c36d2b5273f29540449d2bbbb --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundManager.java @@ -0,0 +1,85 @@ +package de.hdm_stuttgart.battlearena.Model.Sound; + + +import javafx.scene.media.Media; +import javafx.scene.media.MediaPlayer; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.LogManager; + +import javafx.scene.media.AudioClip; + + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Random; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class SoundManager implements ISoundManager { + private static final Logger log = LogManager.getLogger(SoundManager.class); + + + private final ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5); + private final List<SFX> soundEffectsRunning = new ArrayList<>(); + private MediaPlayer mediaPlayer; + + private final boolean stopLoop = false; + private List<Path> walkingSFXPaths; + + //Todo Make music play + public void playMusic(MusicType musicType) throws IOException { + Path pathTypeOfMusic = Paths.get(musicType.getPath()); + List<Path> musicPaths = getFilePathsFromResources(pathTypeOfMusic); + Random random = new Random(); + int min = 0; + int max = musicPaths.size() - 1; + int randomIndex = random.nextInt(max - min + 1 ) + min; + String randomMusic = musicPaths.get(randomIndex).toString(); + String normalizedPath = Paths.get(randomMusic).toString().replace('\\', '/'); + String resource = normalizedPath.substring(18); + log.info(resource); + Thread thread = new Thread(() -> { + Media media = new Media(getClass().getResource(resource).toExternalForm()); + mediaPlayer = new MediaPlayer(media); + mediaPlayer.setCycleCount(MediaPlayer.INDEFINITE); + mediaPlayer.play(); + log.info("Music is playing"); + + }); + thread.setDaemon(true); + thread.start(); + } + + public void stopMusic(){ + if (mediaPlayer != null) { + mediaPlayer.dispose(); // Dispose of the MediaPlayer instance + } + } + + @Override + public void playSoundEffect() throws InterruptedException, MalformedURLException { + + } + + + + public List<Path> getFilePathsFromResources(Path folderPath) throws IOException { + List<Path> result; + try (Stream<Path> walk = Files.walk(folderPath)) { + result = walk.filter(Files::isRegularFile) + .collect(Collectors.toList()); + } + return result; + } + +} diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 0e27c537bfec8ecab654f48ede3fb580f8adf0dd..7170d5f5377d9044dc83b6f3705c684f0db71786 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -3,24 +3,24 @@ module gui { requires javafx.fxml; requires javafx.media; requires org.apache.logging.log4j; + requires java.desktop; requires java.sql; requires com.google.gson; requires com.oracle.database.jdbc; requires java.naming; - - opens de.hdm_stuttgart.battlearena to javafx.fxml; opens de.hdm_stuttgart.battlearena.Controller to javafx.fxml; opens de.hdm_stuttgart.battlearena.Model.DataStorage.Classes to com.google.gson; opens de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions to com.google.gson; opens de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Utilities to com.google.gson; + opens de.hdm_stuttgart.battlearena to javafx.fxml; + opens de.hdm_stuttgart.battlearena.Model.Sound to javafx.media; + opens de.hdm_stuttgart.battlearena.Controller.Utilities to javafx.fxml; + exports de.hdm_stuttgart.battlearena.Main; exports de.hdm_stuttgart.battlearena.Controller; exports de.hdm_stuttgart.battlearena.Model.Entity; exports de.hdm_stuttgart.battlearena.Model.Inputs; exports de.hdm_stuttgart.battlearena.Model.Map; exports de.hdm_stuttgart.battlearena.Controller.Utilities; - exports de.hdm_stuttgart.battlearena.Model.Multiplayer; - opens de.hdm_stuttgart.battlearena.Controller.Utilities to javafx.fxml; - opens de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs to com.google.gson; } \ No newline at end of file diff --git a/src/main/resources/sound/sfx/Footsteps, Human, Dirty Ground, Walk SND62078.wav b/src/main/resources/Footsteps, Human, Dirty Ground, Walk SND62078.wav similarity index 100% rename from src/main/resources/sound/sfx/Footsteps, Human, Dirty Ground, Walk SND62078.wav rename to src/main/resources/Footsteps, Human, Dirty Ground, Walk SND62078.wav diff --git a/src/main/resources/fxml/MapSelection.fxml b/src/main/resources/fxml/MapSelection.fxml new file mode 100644 index 0000000000000000000000000000000000000000..1be6734bac78aa59dd7db7a771411adfd64dd828 --- /dev/null +++ b/src/main/resources/fxml/MapSelection.fxml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.geometry.Insets?> +<?import javafx.scene.control.Accordion?> +<?import javafx.scene.control.Button?> +<?import javafx.scene.control.ScrollPane?> +<?import javafx.scene.control.TitledPane?> +<?import javafx.scene.layout.HBox?> +<?import javafx.scene.layout.Pane?> +<?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.MapSelectionController"> + <children> + <Pane VBox.vgrow="ALWAYS" /> + <HBox alignment="TOP_CENTER" spacing="20.0"> + <children> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Maps:" /> + <Accordion> + <panes> + <TitledPane fx:id="roundsTitledPane" text="Select"> + <content> + <ScrollPane minViewportHeight="40.0"> + <content> + <VBox fx:id="boxBox" /> + </content> + </ScrollPane> + </content> + </TitledPane> + </panes> + </Accordion> + </children> + <VBox.margin> + <Insets /> + </VBox.margin> + </HBox> + <HBox alignment="TOP_CENTER" maxWidth="-Infinity" minWidth="-Infinity" prefHeight="25.0" prefWidth="213.0" spacing="20.0"> + <children> + <Text fx:id="selectedMapText" strokeType="OUTSIDE" strokeWidth="0.0" /> + </children> + </HBox> + <Button mnemonicParsing="false" onAction="#gameScene" text="Start" /> + <Button mnemonicParsing="false" onAction="#backButton" text="Back"> + <VBox.margin> + <Insets bottom="50.0" /> + </VBox.margin> + </Button> + <Pane VBox.vgrow="ALWAYS" /> + </children> +</VBox> diff --git a/src/main/resources/fxml/MultiplayerCreate.fxml b/src/main/resources/fxml/MultiplayerCreate.fxml index 3cf21a91e290fca2da1b2516320c1feb50a99cee..f95e2126f13aee4f89541b835ef2c90ffbbc7d9b 100644 --- a/src/main/resources/fxml/MultiplayerCreate.fxml +++ b/src/main/resources/fxml/MultiplayerCreate.fxml @@ -47,7 +47,7 @@ <Insets top="20.0" /> </VBox.margin> </AnchorPane> - <Button mnemonicParsing="false" text="Start" /> + <Button mnemonicParsing="false" onAction="#start" text="Start" /> <Button mnemonicParsing="false" onAction="#backButton" text="Back" /> <Pane VBox.vgrow="ALWAYS" /> <Pane VBox.vgrow="ALWAYS" /> diff --git a/src/main/resources/fxml/PlayerCreateScene.fxml b/src/main/resources/fxml/PlayerCreateScene.fxml index 1563facf396815b701f237fdab3dd7e3769c7951..5200c6495466b6bf62772664a6f3a093ac2f5453 100644 --- a/src/main/resources/fxml/PlayerCreateScene.fxml +++ b/src/main/resources/fxml/PlayerCreateScene.fxml @@ -7,7 +7,6 @@ <?import javafx.scene.media.MediaView?> <?import javafx.scene.text.Text?> - <BorderPane fx:id="parent" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.hdm_stuttgart.battlearena.Controller.PlayerCreateController"> <center> <StackPane BorderPane.alignment="CENTER"> diff --git a/src/main/resources/fxml/Settings.fxml b/src/main/resources/fxml/Settings.fxml index 6cab6585ef8f19e015fc3645684934a599ee9aec..7b8950fc2664c2e1e041ce2d05b7b46986f01d64 100644 --- a/src/main/resources/fxml/Settings.fxml +++ b/src/main/resources/fxml/Settings.fxml @@ -15,13 +15,13 @@ <VBox alignment="CENTER" VBox.vgrow="ALWAYS"> <children> <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Music volume:" /> - <Slider fx:id="musicVolume" blockIncrement="25.0" majorTickUnit="100.0" minorTickCount="1" prefHeight="14.0" prefWidth="480.0" showTickLabels="true" value="75.0" VBox.vgrow="NEVER" /> + <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="sfxVolume" blockIncrement="25.0" majorTickUnit="100.0" minorTickCount="1" prefHeight="14.0" prefWidth="480.0" showTickLabels="true" value="75.0" /> + <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> diff --git a/src/main/resources/player/appSettings.json b/src/main/resources/player/appSettings.json index ac6b7e58fa58ee25e2070c5cdfb9b8324bdddc6b..ec5bc62a909f2065d81be4cfd6c494b9e10715fb 100644 --- a/src/main/resources/player/appSettings.json +++ b/src/main/resources/player/appSettings.json @@ -1,4 +1,4 @@ { "sfxVolume": 50, - "musicVolume": 50 + "musicVolume": 0 } \ No newline at end of file diff --git a/src/main/resources/player/playerAccount.json b/src/main/resources/player/playerAccount.json index ad25fb8ab5d0aeda7756b512127b84937090f676..60070b6ed6a4c8153907eaf7e737e2e997fb3377 100644 --- a/src/main/resources/player/playerAccount.json +++ b/src/main/resources/player/playerAccount.json @@ -1,5 +1,5 @@ { "playerName": "Player1", "accountPassword": "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8", - "accountType": "ONLINE" + "accountType": "LOCAL" } \ No newline at end of file diff --git a/src/main/resources/player/playerStatsLocal.json b/src/main/resources/player/playerStatsLocal.json index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e51de779c74b6c93fe347b5bf263508c23fff2c9 100644 --- a/src/main/resources/player/playerStatsLocal.json +++ b/src/main/resources/player/playerStatsLocal.json @@ -0,0 +1,8 @@ +{ + "gamesLost": 5, + "gamesWon": 9, + "kills": 30, + "deaths": 20, + "blocksDestroyed": 200, + "gameTime": 3966480 +} \ No newline at end of file diff --git a/src/main/resources/sound/music/musicPlaceholder.mp3 b/src/main/resources/sound/music/game/musicPlaceholder.mp3 similarity index 100% rename from src/main/resources/sound/music/musicPlaceholder.mp3 rename to src/main/resources/sound/music/game/musicPlaceholder.mp3 diff --git a/src/main/resources/sound/music/menu/musicPlaceholder.wav b/src/main/resources/sound/music/menu/musicPlaceholder.wav new file mode 100644 index 0000000000000000000000000000000000000000..e10258b8b48d0253ca1a3141482ee600c96d58e9 Binary files /dev/null and b/src/main/resources/sound/music/menu/musicPlaceholder.wav differ diff --git a/src/main/resources/sound/sfx/steps/grass/steps - Track 1.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 1.wav new file mode 100644 index 0000000000000000000000000000000000000000..fb7dc6572c0c0232ddd17049a0801d8de0ef0035 Binary files /dev/null and b/src/main/resources/sound/sfx/steps/grass/steps - Track 1.wav differ diff --git a/src/main/resources/sound/sfx/steps/grass/steps - Track 10.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 10.wav new file mode 100644 index 0000000000000000000000000000000000000000..7edaf5417e8f65c81092fbae60f309d0c469ae44 Binary files /dev/null and b/src/main/resources/sound/sfx/steps/grass/steps - Track 10.wav differ diff --git a/src/main/resources/sound/sfx/steps/grass/steps - Track 11.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 11.wav new file mode 100644 index 0000000000000000000000000000000000000000..52dbe6393a2855313ab661be65b0cfa8c85838c8 Binary files /dev/null and b/src/main/resources/sound/sfx/steps/grass/steps - Track 11.wav differ diff --git a/src/main/resources/sound/sfx/steps/grass/steps - Track 12.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 12.wav new file mode 100644 index 0000000000000000000000000000000000000000..24f9a5f098b6f55465cfbe41edac6324985396b2 Binary files /dev/null and b/src/main/resources/sound/sfx/steps/grass/steps - Track 12.wav differ diff --git a/src/main/resources/sound/sfx/steps/grass/steps - Track 13.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 13.wav new file mode 100644 index 0000000000000000000000000000000000000000..ead5ebf730e986b5300ae859cb7804d9c5025bc6 Binary files /dev/null and b/src/main/resources/sound/sfx/steps/grass/steps - Track 13.wav differ diff --git a/src/main/resources/sound/sfx/steps/grass/steps - Track 14.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 14.wav new file mode 100644 index 0000000000000000000000000000000000000000..128c1d579f44bace7190a3c855673eee901c98ec Binary files /dev/null and b/src/main/resources/sound/sfx/steps/grass/steps - Track 14.wav differ diff --git a/src/main/resources/sound/sfx/steps/grass/steps - Track 15.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 15.wav new file mode 100644 index 0000000000000000000000000000000000000000..e2c2c54985afc50b3f3f1de45b6dd68ae8c0db00 Binary files /dev/null and b/src/main/resources/sound/sfx/steps/grass/steps - Track 15.wav differ diff --git a/src/main/resources/sound/sfx/steps/grass/steps - Track 16.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 16.wav new file mode 100644 index 0000000000000000000000000000000000000000..b28f00628e321a05293fa07c73503abc9cc9ec37 Binary files /dev/null and b/src/main/resources/sound/sfx/steps/grass/steps - Track 16.wav differ diff --git a/src/main/resources/sound/sfx/steps/grass/steps - Track 17.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 17.wav new file mode 100644 index 0000000000000000000000000000000000000000..6481be5c73f1137e3b10f8483819292d3376056b Binary files /dev/null and b/src/main/resources/sound/sfx/steps/grass/steps - Track 17.wav differ diff --git a/src/main/resources/sound/sfx/steps/grass/steps - Track 18.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 18.wav new file mode 100644 index 0000000000000000000000000000000000000000..f828b12669df1b8a01a4956cc178bd0bed24243d Binary files /dev/null and b/src/main/resources/sound/sfx/steps/grass/steps - Track 18.wav differ diff --git a/src/main/resources/sound/sfx/steps/grass/steps - Track 19.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 19.wav new file mode 100644 index 0000000000000000000000000000000000000000..4e2be3515c1fdfc95226033cf304f56be65a5b6c Binary files /dev/null and b/src/main/resources/sound/sfx/steps/grass/steps - Track 19.wav differ diff --git a/src/main/resources/sound/sfx/steps/grass/steps - Track 2.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 2.wav new file mode 100644 index 0000000000000000000000000000000000000000..87570339d853042dd6dc4fcbd7b871ec3afcee34 Binary files /dev/null and b/src/main/resources/sound/sfx/steps/grass/steps - Track 2.wav differ diff --git a/src/main/resources/sound/sfx/steps/grass/steps - Track 20.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 20.wav new file mode 100644 index 0000000000000000000000000000000000000000..85a71f7d9764cae6a3220c38393336cf320cb284 Binary files /dev/null and b/src/main/resources/sound/sfx/steps/grass/steps - Track 20.wav differ diff --git a/src/main/resources/sound/sfx/steps/grass/steps - Track 3.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 3.wav new file mode 100644 index 0000000000000000000000000000000000000000..ba37dc8a23965323887983518a5e9274ff1938f6 Binary files /dev/null and b/src/main/resources/sound/sfx/steps/grass/steps - Track 3.wav differ diff --git a/src/main/resources/sound/sfx/steps/grass/steps - Track 4.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 4.wav new file mode 100644 index 0000000000000000000000000000000000000000..e3acb0eb0e6d900fa67fc2500c06be7ab0383d16 Binary files /dev/null and b/src/main/resources/sound/sfx/steps/grass/steps - Track 4.wav differ diff --git a/src/main/resources/sound/sfx/steps/grass/steps - Track 5.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 5.wav new file mode 100644 index 0000000000000000000000000000000000000000..dabe68f4c735ded390aa3de52d293e31ef0b4967 Binary files /dev/null and b/src/main/resources/sound/sfx/steps/grass/steps - Track 5.wav differ diff --git a/src/main/resources/sound/sfx/steps/grass/steps - Track 6.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 6.wav new file mode 100644 index 0000000000000000000000000000000000000000..ce9dd0eb336d5129f78ceac527e28f60f39b554f Binary files /dev/null and b/src/main/resources/sound/sfx/steps/grass/steps - Track 6.wav differ diff --git a/src/main/resources/sound/sfx/steps/grass/steps - Track 7.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 7.wav new file mode 100644 index 0000000000000000000000000000000000000000..71e061472f1fddae9fbaa2ae5a186a71f078a008 Binary files /dev/null and b/src/main/resources/sound/sfx/steps/grass/steps - Track 7.wav differ diff --git a/src/main/resources/sound/sfx/steps/grass/steps - Track 8.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 8.wav new file mode 100644 index 0000000000000000000000000000000000000000..9b8538a47aaa357ffcbe6bc8223809584be19e2c Binary files /dev/null and b/src/main/resources/sound/sfx/steps/grass/steps - Track 8.wav differ diff --git a/src/main/resources/sound/sfx/steps/grass/steps - Track 9.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 9.wav new file mode 100644 index 0000000000000000000000000000000000000000..6ea17cb32406c61630d7975713742719070d3ef6 Binary files /dev/null and b/src/main/resources/sound/sfx/steps/grass/steps - Track 9.wav differ diff --git a/src/main/resources/styles/style.css b/src/main/resources/styles/style.css index 2bb5cd89b79625f3392d4701dcf93ac9fb88d7f2..e676c8daadf56536c73d3bf8dd515a7c5a7533cd 100644 --- a/src/main/resources/styles/style.css +++ b/src/main/resources/styles/style.css @@ -4,7 +4,7 @@ } #button { - -fx-text-fill: black; + -fx-text-fill: #454545; } .root { diff --git a/src/main/resources/videos/catJump.mp4 b/src/main/resources/videos/catJump.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..cce5bdb3f5ecb0d515d9802848cd742d8b6bcb56 Binary files /dev/null and b/src/main/resources/videos/catJump.mp4 differ diff --git a/src/main/resources/videos/sad.mp4 b/src/main/resources/videos/sad.mp4 index 9eb120c9e461edaed7858c02a42d44dc25f49e31..1868f52e473cad115b0dbe455c642211e5c50e81 100644 Binary files a/src/main/resources/videos/sad.mp4 and b/src/main/resources/videos/sad.mp4 differ