diff --git a/CHANGELOG b/CHANGELOG deleted file mode 100644 index 8b137891791fe96927ad78e64b0aad7bded08bdc..0000000000000000000000000000000000000000 --- a/CHANGELOG +++ /dev/null @@ -1 +0,0 @@ - diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..d259abe54736dbb6cefa66fcecb72b757a599991 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,20 @@ +# Changelog + +## [Unreleased] + +### Added +- + +### Fixed +- + +### Changed +- + + +### Removed +- + +##[v.v.v] - dd.mm.yyyy + +### Added diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/ButtonTransition.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/ButtonTransition.java new file mode 100644 index 0000000000000000000000000000000000000000..2af6c6d63c35c91301dfd68eab22027ced9fdcbc --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/ButtonTransition.java @@ -0,0 +1,29 @@ +package de.hdm_stuttgart.battlearena.Controller; + +import javafx.animation.ScaleTransition; +import javafx.scene.control.Button; +import javafx.scene.control.skin.ButtonSkin; +import javafx.util.Duration; + +public class ButtonTransition extends ButtonSkin { + public ButtonTransition(Button button) { + super(button); +// set transition for mouse hovering over button + final ScaleTransition fadeIn = new ScaleTransition(Duration.millis(150)); + fadeIn.setNode(button); + fadeIn.setToX(1.1); + fadeIn.setToY(1.1); + button.setOnMouseEntered(e -> fadeIn.playFromStart()); + +// set transition for mouse exiting buttonButtonTransitionScale + final ScaleTransition fadeOut = new ScaleTransition(Duration.millis(150)); + fadeOut.setNode(button); + fadeOut.setToX(1.0); + fadeOut.setToY(1.0); + button.setOnMouseExited(e -> fadeOut.playFromStart()); + + button.setScaleX(1.0); + button.setScaleY(1.0); + } +} + diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/CreateMediaPlayer.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/CreateMediaPlayer.java new file mode 100644 index 0000000000000000000000000000000000000000..03fbd835e1a457c5f9ad0fdd649d747840a240fd --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/CreateMediaPlayer.java @@ -0,0 +1,23 @@ +package de.hdm_stuttgart.battlearena.Controller; + +import javafx.scene.layout.BorderPane; +import javafx.scene.media.Media; +import javafx.scene.media.MediaPlayer; +import javafx.scene.media.MediaView; + +import java.io.File; + +public class CreateMediaPlayer { + public MediaPlayer getMediaPlayer(MediaView mediaView, File file, BorderPane parent) { + Media media = new Media(file.toURI().toString()); + MediaPlayer mediaPlayer = new MediaPlayer(media); + +// resizing once the scenes has been loaded to get width and height property + mediaPlayer.setOnReady(() -> { + mediaView.fitWidthProperty().bind(parent.getScene().widthProperty()); + mediaView.fitHeightProperty().bind(parent.getScene().heightProperty()); + }); + mediaPlayer.setAutoPlay(true); + return mediaPlayer; + } +} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/CreditsController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/CreditsController.java new file mode 100644 index 0000000000000000000000000000000000000000..a6e47b9d714df5d509ec60ac27bd6ac89029fa5f --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/CreditsController.java @@ -0,0 +1,52 @@ +package de.hdm_stuttgart.battlearena.Controller; + +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.fxml.Initializable; +import javafx.scene.Cursor; +import javafx.scene.layout.BorderPane; +import javafx.scene.media.MediaPlayer; +import javafx.scene.media.MediaView; + +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.Objects; +import java.util.ResourceBundle; + +public class CreditsController implements Initializable { + @FXML + public BorderPane parent; + @FXML + public MediaView mediaView; + private MediaPlayer mediaPlayer; + private final File file = new File("src/main/resources/videos/credits.mp4"); + + @Override + public void initialize(URL url, ResourceBundle resourceBundle) { + parent.setStyle("-fx-background-color: black;"); + parent.setCursor(Cursor.NONE); + createMediaPlayer(); + MusicPlayerSingleton.getInstance().getMediaPlayer().dispose(); + } + + private void createMediaPlayer() { + mediaPlayer = new CreateMediaPlayer().getMediaPlayer(mediaView, file, parent); + mediaView.setMediaPlayer(mediaPlayer); + + mediaPlayer.setOnEndOfMedia(this::videoEnd); + + parent.setOnMouseClicked(mouseEvent -> videoEnd()); + } + + private void videoEnd() { + try { +// I don't know how to return to the options scene, so it just goes back to the main menu :( + mediaPlayer.dispose(); + parent.getChildren().clear(); + parent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/MenuBorderPane.fxml")))); + } catch (IOException e) { + throw new RuntimeException(); + } + } +} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/IntroController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/IntroController.java new file mode 100644 index 0000000000000000000000000000000000000000..7a77864cb6349989b9ee99f84e56f98932683146 --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/IntroController.java @@ -0,0 +1,75 @@ +package de.hdm_stuttgart.battlearena.Controller; + +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.fxml.Initializable; +import javafx.scene.Cursor; +import javafx.scene.layout.BorderPane; +import javafx.scene.media.MediaPlayer; +import javafx.scene.media.MediaView; + +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.Objects; +import java.util.ResourceBundle; + +public class IntroController implements Initializable { + + @FXML + public MediaView mediaView; + @FXML + public BorderPane introParent; + private final String fileName = "src/main/resources/videos/"; + // nextVideo() will iterate through this array so the next video will be played TODO: change the videos to non memes lmao + private final String[] videos = {"sony.mp4", "gamecube.mp4", "gameboy.mp4", "monke.mp4"}; + private File file = new File(fileName + videos[0]); + private int counter = 0; + private MediaPlayer mediaPlayer; + + @Override + public void initialize(URL url, ResourceBundle resourceBundle) { + introParent.setStyle("-fx-background-color: black;"); + introParent.setCursor(Cursor.NONE); + createMediaPlayer(); + } + + private void createMediaPlayer() { +// initializing this.mediaPlayer + mediaPlayer = new CreateMediaPlayer().getMediaPlayer(mediaView, file, introParent); + mediaView.setMediaPlayer(mediaPlayer); + + mediaPlayer.setOnEndOfMedia(() -> { + if (counter == videos.length - 1) { + videoEnd(); + } else { + nextVideo(); + } + }); + +// TODO: make any button pressed work + introParent.setOnMouseClicked((mouseEvent) -> { + if (counter == videos.length - 1) { + videoEnd(); + } else { + nextVideo(); + } + }); + } + + private void videoEnd() { + try { + mediaPlayer.dispose(); + introParent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/MenuBorderPane.fxml")))); + } catch (IOException e) { + throw new RuntimeException(); + } + } + + private void nextVideo() { + mediaPlayer.dispose(); + file = new File(fileName + videos[counter + 1]); + counter++; + createMediaPlayer(); + } +} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/LocalCreateController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/LocalCreateController.java new file mode 100644 index 0000000000000000000000000000000000000000..12f6d654caa5d116dbb0d6be8fcf8b03d25747f8 --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/LocalCreateController.java @@ -0,0 +1,23 @@ +package de.hdm_stuttgart.battlearena.Controller; + +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.scene.layout.VBox; + +import java.io.IOException; +import java.util.Objects; + +public class LocalCreateController { + @FXML public VBox parent; + private final SceneLoader sceneLoader = new SceneLoader(); + + public void playScene() { + parent.getChildren().clear(); + parent.getChildren().add(sceneLoader.loadScene("Play")); + } + + public void skinSelectionScene() { + parent.getChildren().clear(); + parent.getChildren().add(sceneLoader.loadScene("SkinSelection")); + } +} 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 4fa73f1d596e95461bfb44775fdb526efc4377f3..5a8c9dea297cc86f74b13911c31a9318d66f6178 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MainMenuController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MainMenuController.java @@ -1,4 +1,38 @@ package de.hdm_stuttgart.battlearena.Controller; +import javafx.fxml.FXML; +import javafx.scene.control.Button; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; + public class MainMenuController { + @FXML + public VBox parent; + @FXML + public Button exitButton; + private final SceneLoader sceneLoader = new SceneLoader(); + + private void switchScene(String name) { + parent.getChildren().clear(); + parent.getChildren().add(sceneLoader.loadScene(name)); + } + public void playScene() { + switchScene("Play"); + } + + public void statisticsScene() { + switchScene("Statistics"); + } + + public void optionsScene() { + switchScene("Options"); + } + + public void exit() { + Stage stage = (Stage) exitButton.getScene().getWindow(); + stage.close(); + } + + +// TODO: create skin selection scene } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MenuBorderPaneController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MenuBorderPaneController.java new file mode 100644 index 0000000000000000000000000000000000000000..6f980d5271853b580f31e74f3b3cac3ea1a9758d --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MenuBorderPaneController.java @@ -0,0 +1,68 @@ +package de.hdm_stuttgart.battlearena.Controller; + +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.geometry.Rectangle2D; +import javafx.scene.control.Button; +import javafx.scene.image.ImageView; +import javafx.scene.layout.BorderPane; +import javafx.scene.media.Media; +import javafx.scene.media.MediaPlayer; +import javafx.scene.media.MediaView; +import javafx.stage.Screen; + +import java.io.File; +import java.net.URL; +import java.util.ResourceBundle; + +public class MenuBorderPaneController implements Initializable { + // TODO: change FXML variables to private. Don't know why it's not working when they're private + @FXML + public BorderPane parent; + @FXML + public Button btnRight; + @FXML + public ImageView imgLeft, imgRight; + private int counter = 1; + private final SceneLoader sceneLoader = new SceneLoader(); + MediaPlayer musicPlayer; + + @Override + public void initialize(URL url, ResourceBundle resourceBundle) { + parent.setCenter(sceneLoader.loadScene("MainMenu")); +// set size for rusty gear image depending on screen resolution + Rectangle2D screen = Screen.getPrimary().getVisualBounds(); + final double imageWidth = screen.getWidth() / 6; + imgRight.setFitWidth(imageWidth); + imgRight.setPreserveRatio(true); + imgLeft.setFitWidth(imageWidth); + imgLeft.setPreserveRatio(true); + backgroundMusic("cocBackgroundMusicTest.mp3"); + } + + public void easterEgg() { + btnRight.setOnMouseClicked(mouseEvent -> counter++); + switch (counter) { + case 5: + musicPlayer.dispose(); + backgroundMusic("spongeBob.mp3"); + break; + case 12: + musicPlayer.dispose(); + backgroundMusic("stadiumRave.mp3"); + break; + case 20: + musicPlayer.dispose(); + backgroundMusic("wii.mp3"); + break; + } + } + + private void backgroundMusic(String file) { + Media media = new Media(new File("src/main/resources/sound/music/" + file).toURI().toString()); + musicPlayer = new MediaPlayer(media); + musicPlayer.setCycleCount(MediaPlayer.INDEFINITE); + musicPlayer.play(); + MusicPlayerSingleton.getInstance().setMediaPlayer(musicPlayer); + } +} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerController.java new file mode 100644 index 0000000000000000000000000000000000000000..c0398758ef90f8af93860a24e7706c04f3293035 --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerController.java @@ -0,0 +1,24 @@ +package de.hdm_stuttgart.battlearena.Controller; + +import javafx.fxml.FXML; +import javafx.scene.layout.VBox; + +public class MultiplayerController { + @FXML public VBox parent; + private final SceneLoader sceneLoader = new SceneLoader(); + + public void multiplayerCreateScene() { + parent.getChildren().clear(); + parent.getChildren().add(sceneLoader.loadScene("MultiplayerCreate")); + } + + public void multiplayerJoinScene() { + parent.getChildren().clear(); + parent.getChildren().add(sceneLoader.loadScene("MultiplayerJoin")); + } + + public void playScene() { + parent.getChildren().clear(); + parent.getChildren().add(sceneLoader.loadScene("Play")); + } +} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerCreateController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerCreateController.java new file mode 100644 index 0000000000000000000000000000000000000000..3791d1b65442c4156ceed67abdabcd15d0459d64 --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerCreateController.java @@ -0,0 +1,14 @@ +package de.hdm_stuttgart.battlearena.Controller; + +import javafx.fxml.FXML; +import javafx.scene.layout.VBox; + +public class MultiplayerCreateController { + @FXML public VBox parent; + private final SceneLoader sceneLoader = new SceneLoader(); + + public void multiplayerScene() { + parent.getChildren().clear(); + parent.getChildren().add(sceneLoader.loadScene("Multiplayer")); + } +} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerJoinController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerJoinController.java new file mode 100644 index 0000000000000000000000000000000000000000..e6acf0f92a50714ee0e1a152a24ea0b6999ada31 --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerJoinController.java @@ -0,0 +1,14 @@ +package de.hdm_stuttgart.battlearena.Controller; + +import javafx.fxml.FXML; +import javafx.scene.layout.VBox; + +public class MultiplayerJoinController { + @FXML public VBox parent; + private final SceneLoader sceneLoader = new SceneLoader(); + + public void multiplayerScene() { + parent.getChildren().clear(); + parent.getChildren().add(sceneLoader.loadScene("Multiplayer")); + } +} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MusicPlayerSingleton.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MusicPlayerSingleton.java new file mode 100644 index 0000000000000000000000000000000000000000..5653a7c8cbca3e0278568d08fcda7dc7e1712c17 --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MusicPlayerSingleton.java @@ -0,0 +1,23 @@ +package de.hdm_stuttgart.battlearena.Controller; +import javafx.scene.media.MediaPlayer; + +public class MusicPlayerSingleton { +// creating a singleton, so it can be stopped from other controller classes + private static final MusicPlayerSingleton instance = new MusicPlayerSingleton(); + private MediaPlayer mediaPlayer; + + private MusicPlayerSingleton() {} + + public static MusicPlayerSingleton getInstance() { + return instance; + } + + public MediaPlayer getMediaPlayer() { + return mediaPlayer; + } + + public void setMediaPlayer(MediaPlayer mediaPlayer) { + this.mediaPlayer = mediaPlayer; + } +} + diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/OptionsController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/OptionsController.java new file mode 100644 index 0000000000000000000000000000000000000000..6cba2a46980f3f81abb00e59b69bb6b4666104f4 --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/OptionsController.java @@ -0,0 +1,45 @@ +package de.hdm_stuttgart.battlearena.Controller; + +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.fxml.Initializable; +import javafx.scene.control.Slider; +import javafx.scene.layout.VBox; + +import java.io.IOException; +import java.net.URL; +import java.util.Objects; +import java.util.ResourceBundle; + +public class OptionsController implements Initializable { + @FXML public VBox parent; + @FXML public Slider volumeSlider; + SceneLoader sceneLoader = new SceneLoader(); + public double volume; + MusicPlayerSingleton musicPlayer = MusicPlayerSingleton.getInstance(); + + public void creditScene() throws IOException { + parent.getChildren().clear(); + parent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/credits.fxml")))); + } + + public void mainMenuScene() { + parent.getChildren().clear(); + parent.getChildren().add(sceneLoader.loadScene("MainMenu")); + } + + @Override + public void initialize(URL url, ResourceBundle resourceBundle) { + setVolume(); + } + + private void setVolume() { +// need a runtime database to save volume + volumeSlider.valueProperty().addListener((observableValue, oldValue, newValue) -> { + musicPlayer.getMediaPlayer().setVolume(volume); + volume = newValue.doubleValue() / 100; + musicPlayer.getMediaPlayer().setVolume(volume); + System.out.println(volume); + }); + } +} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/PlayController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/PlayController.java new file mode 100644 index 0000000000000000000000000000000000000000..0b094a0e03c9fcf123fca334bd59b96f09bd719c --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/PlayController.java @@ -0,0 +1,24 @@ +package de.hdm_stuttgart.battlearena.Controller; + +import javafx.fxml.FXML; +import javafx.scene.layout.VBox; + +public class PlayController { + @FXML public VBox parent; + private final SceneLoader sceneLoader = new SceneLoader(); + + public void mainMenuScene() { + parent.getChildren().clear(); + parent.getChildren().add(sceneLoader.loadScene("MainMenu")); + } + + public void localScene() { + parent.getChildren().clear(); + parent.getChildren().add(sceneLoader.loadScene("LocalCreate")); + } + + public void multiplayerScene() { + parent.getChildren().clear(); + parent.getChildren().add(sceneLoader.loadScene("Multiplayer")); + } +} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/SkinSelectionController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/SkinSelectionController.java new file mode 100644 index 0000000000000000000000000000000000000000..531d6229fdfc5b15342a14f662977cecff1d4f2e --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/SkinSelectionController.java @@ -0,0 +1,44 @@ +package de.hdm_stuttgart.battlearena.Controller; + +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 java.io.IOException; +import java.net.URL; +import java.util.Objects; +import java.util.ResourceBundle; + +public class SkinSelectionController implements Initializable { + @FXML public VBox parent; + @FXML public ToggleGroup selectionButton; + + @Override + public void initialize(URL url, ResourceBundle resourceBundle) { + selectionButton.selectedToggleProperty().addListener((observableValue, oldToggle, newToggle) -> { + if (selectionButton.getSelectedToggle() != null) { + ToggleButton selected = (ToggleButton) selectionButton.getSelectedToggle(); + String value = selected.getText(); + System.out.println(value); + } + }); + + } + + public 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(); + } + } + + public void back() { + parent.getChildren().clear(); + parent.getChildren().add(new SceneLoader().loadScene("LocalCreate")); + } +} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/StatisticsController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/StatisticsController.java new file mode 100644 index 0000000000000000000000000000000000000000..f591bfa15ef9a643f91fe59dc3c8c3482b085e8a --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/StatisticsController.java @@ -0,0 +1,63 @@ +package de.hdm_stuttgart.battlearena.Controller; + +import javafx.beans.binding.Bindings; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.chart.PieChart; +import javafx.scene.layout.VBox; +import javafx.scene.text.Text; + +import java.net.URL; +import java.util.ResourceBundle; + +public class StatisticsController implements Initializable { + + @FXML public Text blocks, deaths, gameTime, gamesLost, gamesWon, kills; + @FXML public VBox parent; + @FXML public PieChart kd, wl; + SceneLoader sceneLoader = new SceneLoader(); + + public void mainMenuScene() { + parent.getChildren().clear(); + parent.getChildren().add(sceneLoader.loadScene("MainMenu")); + } + + public void initialize(URL url, ResourceBundle resourceBundle){ + iniPieChartkd(); + iniPieChartwl(); + } + + public void iniPieChartkd() { + ObservableList<PieChart.Data> pieChartData = + FXCollections.observableArrayList( + new PieChart.Data("Kills",20), + new PieChart.Data("Deaths",12)); + + pieChartData.forEach(data -> + data.nameProperty().bind( + Bindings.concat( + data.getName(),": ", data.pieValueProperty() + ) + ) + ); + kd.getData().addAll(pieChartData); + } + public void iniPieChartwl() { + ObservableList<PieChart.Data> pieChartData = + FXCollections.observableArrayList( + new PieChart.Data("Wins",3), + new PieChart.Data("Losses",5)); + + pieChartData.forEach(data -> + data.nameProperty().bind( + Bindings.concat( + data.getName(),": ", data.pieValueProperty() + ) + ) + ); + wl.getData().addAll(pieChartData); + } +} + diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/ToggleButtonTransition.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/ToggleButtonTransition.java new file mode 100644 index 0000000000000000000000000000000000000000..6ee839dddf70e1a34ac776b9343e068234b391ab --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/ToggleButtonTransition.java @@ -0,0 +1,49 @@ +package de.hdm_stuttgart.battlearena.Controller; + +import javafx.animation.FadeTransition; +import javafx.scene.control.ToggleButton; +import javafx.scene.control.skin.ToggleButtonSkin; +import javafx.util.Duration; + +public class ToggleButtonTransition extends ToggleButtonSkin { + private final FadeTransition fadeIn; + private final FadeTransition fadeOut; + + public ToggleButtonTransition(ToggleButton toggleButton) { + super(toggleButton); + + fadeIn = new FadeTransition(Duration.millis(150)); + fadeIn.setNode(toggleButton); + fadeIn.setToValue(1); + + fadeOut = new FadeTransition(Duration.millis(150)); + fadeOut.setNode(toggleButton); + fadeOut.setToValue(0.5); + + toggleButton.setOnMouseEntered(e -> fadeIn.playFromStart()); + toggleButton.setOnMouseExited(e -> { + if (!toggleButton.isSelected()) { + fadeOut.playFromStart(); + } + }); + + toggleButton.selectedProperty().addListener((observable, oldValue, newValue) -> { + if (newValue) { + fadeIn.playFromStart(); + fadeOut.setToValue(0.5); // Set fadeOut back to the default value + } else { + fadeOut.playFromStart(); + toggleButton.setOpacity(0.5); + } + }); + + // Set the initial opacity based on the initial selected state + toggleButton.setOpacity(toggleButton.isSelected() ? 1.0 : 0.5); + + } +} + + + + + 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 db7be08c430fdc16415e617929e3488bc5c148f0..d222017ae825e1a18482ab3913991df51d2df7bf 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Main/Main.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Main/Main.java @@ -3,10 +3,14 @@ package de.hdm_stuttgart.battlearena.Main; import de.hdm_stuttgart.battlearena.Model.Inputs.InputHandler; import javafx.application.Application; import javafx.fxml.FXMLLoader; +import javafx.geometry.Rectangle2D; import javafx.scene.Parent; import javafx.scene.Scene; +import javafx.scene.text.Font; +import javafx.stage.Screen; import javafx.stage.Stage; +import javafx.stage.StageStyle; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -15,6 +19,7 @@ import java.util.Objects; public class Main extends Application { private static final Logger log = LogManager.getLogger(Main.class); + Rectangle2D screen = Screen.getPrimary().getVisualBounds(); InputHandler inputHandler = InputHandler.getInstance(); @@ -24,7 +29,10 @@ public class Main extends Application { @Override public void start(Stage stage) throws Exception { - Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/GameScene.fxml"))); +// loading font in start() because CSS can't handle whitespace in folder names + Font.loadFont(getClass().getResourceAsStream("/fonts/StarshipShadow.ttf"), 20); + + Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/Intro.fxml"))); Scene scene = new Scene(root); @@ -33,6 +41,14 @@ public class Main extends Application { stage.setTitle("BattleArena"); stage.setScene(scene); + stage.minHeightProperty().setValue(400); + stage.minWidthProperty().setValue(600); + stage.setMaximized(true); + stage.setWidth(screen.getWidth()); + stage.setHeight(screen.getHeight()); + stage.initStyle(StageStyle.UNDECORATED); + scene.getStylesheets().add(Objects.requireNonNull(this.getClass().getResource("/styles/style.css")).toExternalForm()); + stage.setScene(scene); stage.show(); log.debug("Project started successfully!"); diff --git a/src/main/resources/fonts/StarshipInline.ttf b/src/main/resources/fonts/StarshipInline.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b738337f8929807e42f3eab6ca17b629b9dd9346 Binary files /dev/null and b/src/main/resources/fonts/StarshipInline.ttf differ diff --git a/src/main/resources/fonts/StarshipInlineGrunge.ttf b/src/main/resources/fonts/StarshipInlineGrunge.ttf new file mode 100644 index 0000000000000000000000000000000000000000..717585cf29071695d9a23cc8c28cacea0108c8d0 Binary files /dev/null and b/src/main/resources/fonts/StarshipInlineGrunge.ttf differ diff --git a/src/main/resources/fonts/StarshipShadow.ttf b/src/main/resources/fonts/StarshipShadow.ttf new file mode 100644 index 0000000000000000000000000000000000000000..87b1a315517048dea5ef414f248a124a9d36c0fb Binary files /dev/null and b/src/main/resources/fonts/StarshipShadow.ttf differ diff --git a/src/main/resources/fonts/StarshipShadowInline.ttf b/src/main/resources/fonts/StarshipShadowInline.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e31a30c5608773cb0ca00947d946cf767df4df1c Binary files /dev/null and b/src/main/resources/fonts/StarshipShadowInline.ttf differ diff --git a/src/main/resources/fxml/Credits.fxml b/src/main/resources/fxml/Credits.fxml new file mode 100644 index 0000000000000000000000000000000000000000..d676f90ba0a604995e51dfa5c8ff51d3dd485aa7 --- /dev/null +++ b/src/main/resources/fxml/Credits.fxml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.scene.layout.BorderPane?> +<?import javafx.scene.media.MediaView?> + + +<BorderPane fx:id="parent" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.hdm_stuttgart.battlearena.Controller.CreditsController"> + <center> + <MediaView fx:id="mediaView" fitHeight="200.0" fitWidth="200.0" BorderPane.alignment="CENTER" /> + </center> +</BorderPane> diff --git a/src/main/resources/fxml/Intro.fxml b/src/main/resources/fxml/Intro.fxml new file mode 100644 index 0000000000000000000000000000000000000000..fb0cfbc611000de77a25e8fd74afdaeb358e7c82 --- /dev/null +++ b/src/main/resources/fxml/Intro.fxml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.scene.layout.BorderPane?> +<?import javafx.scene.media.MediaView?> + +<BorderPane fx:id="introParent" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.hdm_stuttgart.battlearena.Controller.IntroController"> + <center> + <MediaView fx:id="mediaView" fitHeight="200.0" fitWidth="200.0" BorderPane.alignment="CENTER" /> + </center> +</BorderPane> diff --git a/src/main/resources/fxml/LocalCreate.fxml b/src/main/resources/fxml/LocalCreate.fxml new file mode 100644 index 0000000000000000000000000000000000000000..46cca9f8e1e83c60b4a7c8cbc9753d9083bee1a0 --- /dev/null +++ b/src/main/resources/fxml/LocalCreate.fxml @@ -0,0 +1,102 @@ +<?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.RadioButton?> +<?import javafx.scene.control.TitledPane?> +<?import javafx.scene.control.ToggleGroup?> +<?import javafx.scene.layout.AnchorPane?> +<?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.LocalCreateController"> + <children> + <HBox alignment="TOP_CENTER" spacing="20.0"> + <children> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Rounds:" /> + <Accordion> + <panes> + <TitledPane animated="false" text="untitled 1"> + <content> + <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" /> + </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 strokeType="OUTSIDE" strokeWidth="0.0" text="Time:" /> + <Accordion> + <panes> + <TitledPane animated="false" text="untitled 1"> + <content> + <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" /> + </content> + </TitledPane> + </panes> + </Accordion> + </children> + </HBox> + <HBox alignment="TOP_CENTER" spacing="10.0"> + <children> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="PLayers:" /> + <RadioButton mnemonicParsing="false" selected="true" text="2"> + <toggleGroup> + <ToggleGroup fx:id="group31" /> + </toggleGroup> + </RadioButton> + <RadioButton mnemonicParsing="false" text="3" toggleGroup="$group31" /> + <RadioButton mnemonicParsing="false" text="4" toggleGroup="$group31" /> + </children> + </HBox> + <HBox alignment="TOP_CENTER" spacing="10.0"> + <children> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Text:" /> + <RadioButton mnemonicParsing="false" text="Yes"> + <toggleGroup> + <ToggleGroup fx:id="group1" /> + </toggleGroup> + </RadioButton> + <RadioButton mnemonicParsing="false" selected="true" text="No" toggleGroup="$group1" /> + </children> + </HBox> + <HBox alignment="TOP_CENTER" spacing="10.0"> + <children> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Text:" /> + <RadioButton mnemonicParsing="false" text="Yes"> + <toggleGroup> + <ToggleGroup fx:id="group2" /> + </toggleGroup> + </RadioButton> + <RadioButton mnemonicParsing="false" selected="true" text="No" toggleGroup="$group2" /> + </children> + </HBox> + <HBox alignment="TOP_CENTER" spacing="10.0"> + <children> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Text:" /> + <RadioButton mnemonicParsing="false" text="Yes"> + <toggleGroup> + <ToggleGroup fx:id="group3" /> + </toggleGroup> + </RadioButton> + <RadioButton mnemonicParsing="false" selected="true" text="No" toggleGroup="$group3" /> + </children> + </HBox> + <Button mnemonicParsing="false" onAction="#skinSelectionScene" text="Start" /> + <Button mnemonicParsing="false" onAction="#playScene" text="Back"> + <VBox.margin> + <Insets bottom="50.0" /> + </VBox.margin> + </Button> + <Pane VBox.vgrow="ALWAYS" /> + <Pane VBox.vgrow="ALWAYS" /> + </children> +</VBox> diff --git a/src/main/resources/fxml/MainMenu.fxml b/src/main/resources/fxml/MainMenu.fxml index 593ebfedde7527d354af67c063ffcfc078a2472e..385eeb92c0ed4cce0d84e17363a2007d4a6c648b 100644 --- a/src/main/resources/fxml/MainMenu.fxml +++ b/src/main/resources/fxml/MainMenu.fxml @@ -1,23 +1,25 @@ <?xml version="1.0" encoding="UTF-8"?> +<?import javafx.geometry.Insets?> <?import javafx.scene.control.Button?> -<?import javafx.scene.layout.AnchorPane?> -<?import javafx.scene.layout.BorderPane?> +<?import javafx.scene.layout.Pane?> <?import javafx.scene.layout.VBox?> +<?import javafx.scene.text.Text?> - -<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.hdm_stuttgart.battlearena.Controller.MainMenuController"> - <children> - <BorderPane prefHeight="400.0" prefWidth="600.0"> - <center> - <VBox alignment="CENTER" prefHeight="200.0" prefWidth="100.0" spacing="30.0" BorderPane.alignment="CENTER"> - <children> - <Button mnemonicParsing="false" text="Button" /> - <Button mnemonicParsing="false" text="Button" /> - <Button mnemonicParsing="false" text="Button" /> - </children> - </VBox> - </center> - </BorderPane> - </children> -</AnchorPane> +<VBox fx:id="parent" alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" spacing="50.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.hdm_stuttgart.battlearena.Controller.MainMenuController"> + <children> + <Pane VBox.vgrow="ALWAYS" /> + <Text id="gameTitle" strokeType="OUTSIDE" strokeWidth="0.0" text="Battlearena" /> + <Button mnemonicParsing="false" onAction="#playScene" text="Play" VBox.vgrow="ALWAYS"> + <VBox.margin> + <Insets top="20.0" /> + </VBox.margin> + </Button> + <Button mnemonicParsing="false" text="Map Creator" VBox.vgrow="ALWAYS" /> + <Button mnemonicParsing="false" onAction="#statisticsScene" text="Statistics" VBox.vgrow="ALWAYS" /> + <Button mnemonicParsing="false" onAction="#optionsScene" text="Options" /> + <Button fx:id="exitButton" alignment="CENTER" mnemonicParsing="false" onAction="#exit" text="Exit" /> + <Pane VBox.vgrow="ALWAYS" /> + <Pane layoutX="10.0" layoutY="395.0" VBox.vgrow="ALWAYS" /> + </children> +</VBox> diff --git a/src/main/resources/fxml/MenuBorderPane.fxml b/src/main/resources/fxml/MenuBorderPane.fxml new file mode 100644 index 0000000000000000000000000000000000000000..3d57e01ff6b3502f741c6c780cf56e6c04bf6419 --- /dev/null +++ b/src/main/resources/fxml/MenuBorderPane.fxml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.scene.control.Button?> +<?import javafx.scene.image.Image?> +<?import javafx.scene.image.ImageView?> +<?import javafx.scene.layout.BorderPane?> + +<BorderPane id="mainMenu" fx:id="parent" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" 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.MenuBorderPaneController"> + <right> + <Button fx:id="btnRight" mnemonicParsing="false" onAction="#easterEgg" prefWidth="111.0" BorderPane.alignment="BOTTOM_CENTER"> + <graphic> + <ImageView fx:id="imgRight" fitHeight="845.0" fitWidth="799.0" pickOnBounds="true" preserveRatio="true"> + <image> + <Image url="@../textures/images/gear_with_shadow.png" /> + </image> + </ImageView> + </graphic> + </Button> + </right> + <left> + <Button mnemonicParsing="false" BorderPane.alignment="BOTTOM_CENTER"> + <graphic> + <ImageView fx:id="imgLeft" fitHeight="904.0" fitWidth="856.0" pickOnBounds="true" preserveRatio="true"> + <image> + <Image url="@../textures/images/dont_delete_or_ui_will_break.png" /> + </image> + </ImageView> + </graphic> + </Button> + </left> +</BorderPane> diff --git a/src/main/resources/fxml/Multiplayer.fxml b/src/main/resources/fxml/Multiplayer.fxml new file mode 100644 index 0000000000000000000000000000000000000000..690769c28f168b253fbfe41f6e5e559e0decc270 --- /dev/null +++ b/src/main/resources/fxml/Multiplayer.fxml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.geometry.Insets?> +<?import javafx.scene.control.Button?> +<?import javafx.scene.layout.Pane?> +<?import javafx.scene.layout.VBox?> + + +<VBox fx:id="parent" alignment="CENTER" prefHeight="400.0" prefWidth="600.0" spacing="50.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.hdm_stuttgart.battlearena.Controller.MultiplayerController"> + <children> + <Pane maxHeight="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" VBox.vgrow="ALWAYS" /> + <Button mnemonicParsing="false" onAction="#multiplayerCreateScene" text="Create" VBox.vgrow="ALWAYS"> + <VBox.margin> + <Insets top="20.0" /> + </VBox.margin> + </Button> + <Button mnemonicParsing="false" onAction="#multiplayerJoinScene" text="Join" VBox.vgrow="ALWAYS"> + <VBox.margin> + <Insets bottom="50.0" /> + </VBox.margin> + </Button> + <Button alignment="CENTER" mnemonicParsing="false" onAction="#playScene" text="Back"> + <VBox.margin> + <Insets /> + </VBox.margin> + </Button> + <Pane VBox.vgrow="ALWAYS" /> + <Pane VBox.vgrow="ALWAYS" /> + </children> +</VBox> diff --git a/src/main/resources/fxml/MultiplayerCreate.fxml b/src/main/resources/fxml/MultiplayerCreate.fxml new file mode 100644 index 0000000000000000000000000000000000000000..b0909c0079e798d74543c95dfcb6c6f19d6cf72e --- /dev/null +++ b/src/main/resources/fxml/MultiplayerCreate.fxml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.geometry.Insets?> +<?import javafx.scene.control.Button?> +<?import javafx.scene.control.RadioButton?> +<?import javafx.scene.control.TextField?> +<?import javafx.scene.layout.AnchorPane?> +<?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.MultiplayerCreateController"> + <children> + <Pane VBox.vgrow="ALWAYS" /> + <HBox alignment="TOP_CENTER" spacing="20.0"> + <children> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Text:" /> + <TextField /> + </children> + <VBox.margin> + <Insets top="50.0" /> + </VBox.margin> + </HBox> + <HBox alignment="TOP_CENTER" maxWidth="-Infinity" minWidth="-Infinity" prefHeight="25.0" prefWidth="213.0" spacing="20.0"> + <children> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Text:" /> + <TextField /> + </children> + </HBox> + <HBox alignment="TOP_CENTER" spacing="10.0"> + <children> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Text:" /> + <RadioButton mnemonicParsing="false" text="Yes" /> + <RadioButton mnemonicParsing="false" text="No" /> + </children> + </HBox> + <AnchorPane minHeight="-Infinity" prefHeight="39.0" prefWidth="600.0"> + <children> + <VBox alignment="TOP_CENTER" layoutX="250.0" prefHeight="200.0" prefWidth="100.0" AnchorPane.leftAnchor="250.0" AnchorPane.rightAnchor="250.0"> + <children> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Text" /> + </children> + </VBox> + </children> + <VBox.margin> + <Insets top="20.0" /> + </VBox.margin> + </AnchorPane> + <Button mnemonicParsing="false" text="Start" /> + <Button mnemonicParsing="false" onAction="#multiplayerScene" text="Back" /> + <Pane VBox.vgrow="ALWAYS" /> + <Pane VBox.vgrow="ALWAYS" /> + </children> +</VBox> diff --git a/src/main/resources/fxml/MultiplayerJoin.fxml b/src/main/resources/fxml/MultiplayerJoin.fxml new file mode 100644 index 0000000000000000000000000000000000000000..e8a48e621d53819dee9b9bf53b9440b4bbd1bb9a --- /dev/null +++ b/src/main/resources/fxml/MultiplayerJoin.fxml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.scene.control.Button?> +<?import javafx.scene.control.TextField?> +<?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="50.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.hdm_stuttgart.battlearena.Controller.MultiplayerJoinController"> + <children> + <Pane maxHeight="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" /> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="IP Adress:" /> + <TextField maxWidth="-Infinity" /> + <Button mnemonicParsing="false" text="Connect" VBox.vgrow="ALWAYS" /> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="[Error Message]" /> + <Pane maxHeight="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" VBox.vgrow="ALWAYS" /> + <Button alignment="CENTER" mnemonicParsing="false" onAction="#multiplayerScene" text="Back" /> + <Pane maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="20.0" VBox.vgrow="ALWAYS" /> + </children> +</VBox> diff --git a/src/main/resources/fxml/Options.fxml b/src/main/resources/fxml/Options.fxml new file mode 100644 index 0000000000000000000000000000000000000000..79f14cd61fc942bff138bc3a22443bdf8f9ef2a0 --- /dev/null +++ b/src/main/resources/fxml/Options.fxml @@ -0,0 +1,25 @@ +<?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.OptionsController"> + <children> + <HBox alignment="CENTER"> + <children> + <VBox alignment="TOP_CENTER" spacing="10.0"> + <children> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Volume:" /> + <Slider fx:id="volumeSlider" blockIncrement="25.0" majorTickUnit="100.0" minorTickCount="1" prefHeight="14.0" prefWidth="480.0" showTickLabels="true" value="75.0" VBox.vgrow="NEVER" /> + </children> + </VBox> + </children> + </HBox> + <Button mnemonicParsing="false" onAction="#creditScene" text="Credits" /> + <Button mnemonicParsing="false" onAction="#mainMenuScene" text="Back" /> + </children> +</VBox> diff --git a/src/main/resources/fxml/Play.fxml b/src/main/resources/fxml/Play.fxml new file mode 100644 index 0000000000000000000000000000000000000000..1cdd69e375cc8a700854d3e66b5caa1a8b9d6ad7 --- /dev/null +++ b/src/main/resources/fxml/Play.fxml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.scene.control.Button?> +<?import javafx.scene.layout.Pane?> +<?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.PlayController"> + <children> + <Pane VBox.vgrow="ALWAYS" /> + <Button mnemonicParsing="false" onAction="#localScene" text="Local" /> + <Button mnemonicParsing="false" onAction="#multiplayerScene" text="Multiplayer" /> + <Button alignment="CENTER" mnemonicParsing="false" onAction="#mainMenuScene" text="Back" /> + <Pane VBox.vgrow="ALWAYS" /> + <Pane VBox.vgrow="ALWAYS" /> + </children> +</VBox> diff --git a/src/main/resources/fxml/SkinSelection.fxml b/src/main/resources/fxml/SkinSelection.fxml new file mode 100644 index 0000000000000000000000000000000000000000..97773771860f208bdfa49f51c5219c0e89e16ef3 --- /dev/null +++ b/src/main/resources/fxml/SkinSelection.fxml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.scene.control.Button?> +<?import javafx.scene.control.ToggleButton?> +<?import javafx.scene.control.ToggleGroup?> +<?import javafx.scene.image.Image?> +<?import javafx.scene.image.ImageView?> +<?import javafx.scene.layout.HBox?> +<?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.SkinSelectionController"> + <children> + <HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0" spacing="40.0"> + <children> + <ToggleButton contentDisplay="TOP" mnemonicParsing="false" text="Elias"> + <graphic> + <ImageView fitHeight="700.0" fitWidth="700.0" pickOnBounds="true" preserveRatio="true"> + <image> + <Image url="@../textures/images/elias.png" /> + </image> + </ImageView> + </graphic> + <toggleGroup> + <ToggleGroup fx:id="selectionButton" /> + </toggleGroup> + </ToggleButton> + <ToggleButton contentDisplay="TOP" mnemonicParsing="false" text="Erzan" toggleGroup="$selectionButton"> + <graphic> + <ImageView fitHeight="700.0" fitWidth="700.0" pickOnBounds="true" preserveRatio="true"> + <image> + <Image url="@../textures/images/erzan.png" /> + </image> + </ImageView> + </graphic> + </ToggleButton> + <ToggleButton contentDisplay="TOP" mnemonicParsing="false" text="Martin" toggleGroup="$selectionButton"> + <graphic> + <ImageView fitHeight="700.0" fitWidth="700.0" pickOnBounds="true" preserveRatio="true"> + <image> + <Image url="@../textures/images/martin.png" /> + </image> + </ImageView> + </graphic> + </ToggleButton> + </children> + </HBox> + <Button mnemonicParsing="false" onAction="#gameScene" text="Start" /> + <Button mnemonicParsing="false" onAction="#back" text="Back" /> + </children> +</VBox> diff --git a/src/main/resources/fxml/Statistics.fxml b/src/main/resources/fxml/Statistics.fxml new file mode 100644 index 0000000000000000000000000000000000000000..cb429d7b51d3d377a00e0495feee430c61cd7998 --- /dev/null +++ b/src/main/resources/fxml/Statistics.fxml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.geometry.Insets?> +<?import javafx.scene.chart.PieChart?> +<?import javafx.scene.control.Button?> +<?import javafx.scene.layout.HBox?> +<?import javafx.scene.layout.VBox?> +<?import javafx.scene.text.Text?> + + +<VBox fx:id="parent" alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" spacing="50.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.hdm_stuttgart.battlearena.Controller.StatisticsController"> + <children> + <HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0" spacing="30.0"> + <children> + <VBox alignment="CENTER_RIGHT" prefHeight="200.0" prefWidth="100.0" spacing="10.0" HBox.hgrow="ALWAYS"> + <children> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Kills:" /> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Deaths:" /> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Blocks Destroyed:" /> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Games won:" /> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Games lost:" /> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Ingame time:" /> + </children> + </VBox> + <VBox alignment="CENTER_LEFT" prefHeight="200.0" prefWidth="100.0" spacing="10.0" HBox.hgrow="ALWAYS"> + <children> + <Text fx:id="kills" strokeType="OUTSIDE" strokeWidth="0.0" text="Text" /> + <Text fx:id="deaths" strokeType="OUTSIDE" strokeWidth="0.0" text="Text" /> + <Text fx:id="blocks" strokeType="OUTSIDE" strokeWidth="0.0" text="Text" /> + <Text fx:id="gamesWon" strokeType="OUTSIDE" strokeWidth="0.0" text="Text" /> + <Text fx:id="gamesLost" strokeType="OUTSIDE" strokeWidth="0.0" text="Text" /> + <Text fx:id="gameTime" strokeType="OUTSIDE" strokeWidth="0.0" text="Text" /> + </children> + <HBox.margin> + <Insets /> + </HBox.margin> + </VBox> + <VBox prefHeight="200.0" prefWidth="100.0"> + <children> + <PieChart fx:id="kd" /> + <PieChart fx:id="wl" /> + </children> + </VBox> + </children> + </HBox> + <Button mnemonicParsing="false" onAction="#mainMenuScene" text="Back" /> + </children> +</VBox> diff --git a/src/main/resources/sound/music/cocBackgroundMusicTest.mp3 b/src/main/resources/sound/music/cocBackgroundMusicTest.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..e916ecb6c0b6487e9bcb8ca6c3d54f6259eac9dc Binary files /dev/null and b/src/main/resources/sound/music/cocBackgroundMusicTest.mp3 differ diff --git a/src/main/resources/sound/music/spongeBob.mp3 b/src/main/resources/sound/music/spongeBob.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..cd919cc16ea0c103c0cc1c095f4a19ce5c88960c Binary files /dev/null and b/src/main/resources/sound/music/spongeBob.mp3 differ diff --git a/src/main/resources/sound/music/stadiumRave.mp3 b/src/main/resources/sound/music/stadiumRave.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..990274fd88b95bfc5fe584184f838cbc54c2dbdc Binary files /dev/null and b/src/main/resources/sound/music/stadiumRave.mp3 differ diff --git a/src/main/resources/sound/music/wii.mp3 b/src/main/resources/sound/music/wii.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..8b471420a2a4fbb8ff28b6ff2f8cfee463670097 Binary files /dev/null and b/src/main/resources/sound/music/wii.mp3 differ diff --git a/src/main/resources/styles/style.css b/src/main/resources/styles/style.css new file mode 100644 index 0000000000000000000000000000000000000000..bb2a6b5c6f0ed83f68a407a24e34124a8caec3fe --- /dev/null +++ b/src/main/resources/styles/style.css @@ -0,0 +1,65 @@ +* { + -fx-dark-brown: #3c2014; + -fx-brown: #956233; +} + +.root { + -fx-font-family: "Starship Shadow"; + -fx-text-fill: -fx-brown; + -fx-font-size: 50; + -fx-background-color: black; +} + +#mainMenu{ + -fx-background-image: url("../textures/images/background.png"); + -fx-background-size: cover; +} + +#gameTitle { + -fx-font-size: 100; +} + +.button { + -fx-text-fill: -fx-brown; + -fx-background-color: none; + -fx-skin: "de.hdm_stuttgart.battlearena.Controller.ButtonTransition"; +} + +.accordion { + -fx-font-size: 30; +} + +/* https://dx.dragan.ba/javafx-radiobutton-custom-css/ */ +.radio-button .radio { + -fx-border-width: 1px; + -fx-border-color: -fx-dark-brown; + -fx-background-color: none; + -fx-background-image: null; + -fx-border-radius: 15px; + -fx-padding: 3px; +} + +.radio-button .dot { + -fx-padding: 8px; +} + +.radio-button:selected .dot { + -fx-background-color: -fx-dark-brown; + -fx-background-insets: 0; +} + +.slider .track { + -fx-background-color: rgba(0, 0, 0, 0.5); + -fx-pref-height: 0.2em; + } + +.slider .thumb { + -fx-pref-height: 0.6em; + -fx-pref-width: 0.4em; + -fx-background-color: -fx-brown; +} + +.toggle-button { + -fx-skin: "de.hdm_stuttgart.battlearena.Controller.ToggleButtonTransition"; + -fx-background-color: none; +} diff --git a/src/main/resources/textures/images/background.png b/src/main/resources/textures/images/background.png new file mode 100644 index 0000000000000000000000000000000000000000..67ec5faee876e21cc496b5a4a265deed0a14a7cf Binary files /dev/null and b/src/main/resources/textures/images/background.png differ diff --git a/src/main/resources/textures/images/dont_delete_or_ui_will_break.png b/src/main/resources/textures/images/dont_delete_or_ui_will_break.png new file mode 100644 index 0000000000000000000000000000000000000000..271b72c9c2ea827a6a7b74b5612f4eba34b9253d Binary files /dev/null and b/src/main/resources/textures/images/dont_delete_or_ui_will_break.png differ diff --git a/src/main/resources/textures/images/elias.png b/src/main/resources/textures/images/elias.png new file mode 100644 index 0000000000000000000000000000000000000000..92a45fea76f21bc5eadeef287d5126c8a1278ef7 Binary files /dev/null and b/src/main/resources/textures/images/elias.png differ diff --git a/src/main/resources/textures/images/erzan.png b/src/main/resources/textures/images/erzan.png new file mode 100644 index 0000000000000000000000000000000000000000..2101d8665fa6cfe21d1eb1d94a4da796034f71c9 Binary files /dev/null and b/src/main/resources/textures/images/erzan.png differ diff --git a/src/main/resources/textures/images/gear_with_shadow.png b/src/main/resources/textures/images/gear_with_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..7dad227dd915ca1907589a15b55cecd734d03cb9 Binary files /dev/null and b/src/main/resources/textures/images/gear_with_shadow.png differ diff --git a/src/main/resources/textures/images/martin.png b/src/main/resources/textures/images/martin.png new file mode 100644 index 0000000000000000000000000000000000000000..fdaa4de0ea064ae8da30cc1a1e97799db9cb20aa Binary files /dev/null and b/src/main/resources/textures/images/martin.png differ diff --git a/src/main/resources/textures/images/rusty_metal.png b/src/main/resources/textures/images/rusty_metal.png new file mode 100644 index 0000000000000000000000000000000000000000..2b2ff5687299d78376613202e79447537f36ec9e Binary files /dev/null and b/src/main/resources/textures/images/rusty_metal.png differ diff --git a/src/main/resources/textures/images/vintage_paper_with_drawings.png b/src/main/resources/textures/images/vintage_paper_with_drawings.png new file mode 100644 index 0000000000000000000000000000000000000000..862a0ac453b013ad66807f109c987c1c85dbaae9 Binary files /dev/null and b/src/main/resources/textures/images/vintage_paper_with_drawings.png differ diff --git a/src/main/resources/videos/allMyFellas.mp4 b/src/main/resources/videos/allMyFellas.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..4234d4da1c07a7e775bced2e4e44c2329c8be972 Binary files /dev/null and b/src/main/resources/videos/allMyFellas.mp4 differ diff --git a/src/main/resources/videos/bobama.mp4 b/src/main/resources/videos/bobama.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..2052b4d842a398ac1788025ed579c5054fdad680 Binary files /dev/null and b/src/main/resources/videos/bobama.mp4 differ diff --git a/src/main/resources/videos/credits.mp4 b/src/main/resources/videos/credits.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..310acc2c75039d7bdad7f3d642e2d0e828573811 Binary files /dev/null and b/src/main/resources/videos/credits.mp4 differ diff --git a/src/main/resources/videos/gameboy.mp4 b/src/main/resources/videos/gameboy.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..91a1eaa78366adbb3686a07594417fd9c8832126 Binary files /dev/null and b/src/main/resources/videos/gameboy.mp4 differ diff --git a/src/main/resources/videos/gamecube.mp4 b/src/main/resources/videos/gamecube.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..135416e7b63fc25ed1e3e2b744c6d14a78692b99 Binary files /dev/null and b/src/main/resources/videos/gamecube.mp4 differ diff --git a/src/main/resources/videos/lifeCouldBeMonke.mp4 b/src/main/resources/videos/lifeCouldBeMonke.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..67a0106470b6e00d968f9930b5081d517545b3e4 Binary files /dev/null and b/src/main/resources/videos/lifeCouldBeMonke.mp4 differ diff --git a/src/main/resources/videos/monke.mp4 b/src/main/resources/videos/monke.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..c6d5f3c2e7f390276d22b26e46f462bb1e281d98 Binary files /dev/null and b/src/main/resources/videos/monke.mp4 differ diff --git a/src/main/resources/videos/pepe.mp4 b/src/main/resources/videos/pepe.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..51a5f0763924b4c623ac2b198d50b272b4758b15 Binary files /dev/null and b/src/main/resources/videos/pepe.mp4 differ diff --git a/src/main/resources/videos/russianKid.mp4 b/src/main/resources/videos/russianKid.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..08a7fe2015e28dc08e1ca6fbe907e46f691cec21 Binary files /dev/null and b/src/main/resources/videos/russianKid.mp4 differ diff --git a/src/main/resources/videos/sony.mp4 b/src/main/resources/videos/sony.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9d96aebfc39a033d379d613070c97e6122f8a175 Binary files /dev/null and b/src/main/resources/videos/sony.mp4 differ