diff --git a/README.md b/README.md index d351a7e1c76dec53336acb562d9f67b5c8075daf..36649891de9120708f42d1e77509733f2abd6a23 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ ## Hier könnte ihre Werbung stehn -### Known issues - - Videos sometimes don't load in windows 11 especially on weaker systems +### Known issues: + - Videos sometimes don't load in Windows 11 especially on weaker systems + - SQL server is very slow (thanks Oracle) diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/CreateAccountController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/CreateAccountController.java new file mode 100644 index 0000000000000000000000000000000000000000..826cb76c7ba083c1cd0608fe5d6d83e28ef68733 --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/CreateAccountController.java @@ -0,0 +1,86 @@ +package de.hdm_stuttgart.battlearena.Controller; + +import de.hdm_stuttgart.battlearena.Controller.Utilities.SceneLoader; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.AccountType; +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.Label; +import javafx.scene.control.RadioButton; +import javafx.scene.control.TextField; +import javafx.scene.control.ToggleGroup; +import javafx.scene.layout.VBox; + +import java.net.URL; +import java.util.ResourceBundle; + +public class CreateAccountController implements Initializable { + @FXML + private VBox parent; + @FXML + private RadioButton local; + @FXML + private ToggleGroup statistics; + @FXML + private TextField playerName, password; + @FXML + private Label errorMessage, passwordLabel; + + String selectedButton; + SceneLoader sceneLoader = new SceneLoader(); + Persistence persistence = Persistence.getInstance(); + + @Override + public void initialize(URL url, ResourceBundle resourceBundle) { + getSelected(); + } + + private void getSelected() { + statistics.selectedToggleProperty().addListener((observableValue, toggle, t1) -> { + if (statistics.getSelectedToggle() != null) { + RadioButton selectedToggle = (RadioButton) statistics.getSelectedToggle(); + selectedButton = selectedToggle.getText(); + System.out.println(selectedButton); + } + if (local.isSelected()) { + password.setEditable(false); + password.setText(""); + passwordLabel.setStyle("-fx-text-fill: rgba(0, 0, 0, 0.3)"); + password.setStyle("-fx-border-color: rgba(0, 0, 0, 0.3)"); + } else { + passwordLabel.setStyle("-fx-text-fill: black"); + password.setEditable(true); + password.setStyle("-fx-border-color: black"); + } + }); + } + + private void switchScene(String name) { + parent.getChildren().clear(); + parent.getChildren().add(sceneLoader.loadScene(name)); + } + + @FXML + private void create() { + AccountType accountType; + if (selectedButton.equals("Local")) { + accountType = AccountType.LOCAL; + } else { + accountType = AccountType.ONLINE; + } + try { + persistence.createAccount(playerName.getText(), password.getText(), accountType); + persistence.resetPlayerStatistics(); + persistence.loadPlayerStatistics(); + switchScene("MainMenu"); + } catch (DatabaseException e) { + errorMessage.setText(e.getMessage()); + } + } + + @FXML + private void back() { + switchScene("PlayerCreateScene"); + } +} 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 0ee284ce321557aafe682c4accff45c12625da6c..6a99c538617e193578e4a80332c60baa7c0bcf5e 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/IntroController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/IntroController.java @@ -1,9 +1,7 @@ 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; @@ -40,7 +38,6 @@ public class IntroController implements Initializable { introParent.setStyle("-fx-background-color: black;"); introParent.setCursor(Cursor.NONE); createMediaPlayer(); - new StartupThread().run(); } private void createMediaPlayer() { @@ -50,11 +47,7 @@ public class IntroController implements Initializable { mediaPlayer.setOnEndOfMedia(() -> { if (counter == videos.length - 1) { - try { - videoEnd(); - } catch (IOException e) { - throw new RuntimeException(e); - } + videoEnd(); } else { nextVideo(); } @@ -63,42 +56,20 @@ public class IntroController implements Initializable { // TODO: make any button pressed work introParent.setOnMouseClicked((mouseEvent) -> { if (counter == videos.length - 1) { - try { - videoEnd(); - } catch (IOException e) { - throw new RuntimeException(e); - } + videoEnd(); } else { nextVideo(); } }); } - 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); - } + private void videoEnd() { + try { + mediaPlayer.dispose(); + introParent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/LoadingScreen.fxml")))); + } catch (IOException e) { + throw new RuntimeException(); } - 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/LoadingScreenController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/LoadingScreenController.java new file mode 100644 index 0000000000000000000000000000000000000000..a7aa8a685f37286da95ba3edda224fc8c78f30d4 --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/LoadingScreenController.java @@ -0,0 +1,143 @@ +package de.hdm_stuttgart.battlearena.Controller; + +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.AccountType; +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.ThreadStartup1; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ThreadStartup2; +import javafx.application.Platform; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.fxml.Initializable; +import javafx.geometry.Rectangle2D; +import javafx.scene.control.Label; +import javafx.scene.image.ImageView; +import javafx.scene.layout.BorderPane; +import javafx.stage.Screen; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.IOException; +import java.net.URL; +import java.util.*; + +public class LoadingScreenController implements Initializable { + @FXML + private Label tips; + @FXML + private BorderPane parent; + @FXML + private ImageView logo, throbber; + + boolean isReady = false; + private int counter = 0; + private boolean statsLoaded = false; + private final String[] loadingTips = { + "Did you know, that since 2009, Martin isn't on the FBI list?", + "BattleArena is actually derived from the combination of the words 'Battle' and 'Arena'.", + "Yannik ist over 1,80m tall.", + "Electricity is a vital part to play this game.", + "There is a typo in one of the tips.", + "Over 1000 people play games every day.", + "A lot of people believe Nikola Tesla was the first to invent electricity but some clouds beat him to it.", + "Monkeys usually don't have keys.", + "While you're reading this, you've wasted 2 seconds.", + "If you die, you're dead.", + "If you take damage, you loose hp.", + "Did you know that Java is also an Island?", + "This loading screen might never end.", + "Get the BattleArena Ultimate-Edition for only 420,69€.", + "To move left, press one of the keys on your keyboard.", + "To use the gravity-gun, close the game and start Half Life 2.", + "Buying this game was a good decision! (no refunds)." + }; + + private final List<String> shuffledTips = Arrays.asList(loadingTips); + private static final Logger log = LogManager.getLogger(Persistence.class); + Rectangle2D screen = Screen.getPrimary().getVisualBounds(); + ThreadStartup1 thread1 = new ThreadStartup1(); + ThreadStartup2 thread2 = new ThreadStartup2(); + Persistence persistence = Persistence.getInstance(); + + Thread tipsThread = new Thread(() -> { + try { + setLoadingTips(); + } catch (InterruptedException e) { + log.info("Data finished loading"); + } + }); + + Thread loadingDataThread = new Thread(() -> { + try { + Thread.sleep(4000); + loadData(); + } catch (IOException e) { + throw new RuntimeException(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + }); + + @Override + public void initialize(URL url, ResourceBundle resourceBundle) { + Collections.shuffle(shuffledTips); + setImages(); + + tipsThread.start(); + thread1.start(); + + boolean threadOneIsRunning = true, threadTwoIsRunning = false; + while (!isReady) { + if (!thread1.isAlive() && threadOneIsRunning) { + thread2.start(); + threadTwoIsRunning = true; + threadOneIsRunning = false; + } + if (!thread2.isAlive() && threadTwoIsRunning) { + isReady = true; + } + } + loadingDataThread.start(); + } + + private void setImages() { + logo.setTranslateY(screen.getHeight() * 0.08); + System.out.println(screen.getHeight()); + logo.setFitWidth(screen.getWidth() * 0.3); + throbber.setFitWidth(screen.getWidth() * 0.07); + logo.setPreserveRatio(true); + throbber.setPreserveRatio(true); + } + + private void setLoadingTips() throws InterruptedException { + while (!statsLoaded && counter < loadingTips.length) { + String nextTip = shuffledTips.get(counter); + Platform.runLater(() -> tips.setText(nextTip)); // JavaFX method to queue a task that needs to be executed on the JavaFX application thread (update ui components) + counter++; + +// check if statsLoaded is still false before sleeping + if (!statsLoaded) { + if (nextTip.length() > 60) { + Thread.sleep(6000); + } else { + Thread.sleep(3500); + } + setLoadingTips(); + } + } + } + + private void loadData() throws IOException { + if (persistence.getAccount().getAccountType() != AccountType.NONE) { + try { + persistence.loadPlayerStatistics(); + statsLoaded = true; + } catch (DatabaseException e) { + log.error(e); + } + } + + Platform.runLater(tipsThread::interrupt); + parent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/MenuBorderPane.fxml")))); + } +} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/LoginController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/LoginController.java new file mode 100644 index 0000000000000000000000000000000000000000..bb09e4518c634f517185a5dbd2ce4f3691b4fa6b --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/LoginController.java @@ -0,0 +1,52 @@ +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.application.Platform; +import javafx.fxml.FXML; +import javafx.scene.control.Label; +import javafx.scene.control.TextField; +import javafx.scene.layout.VBox; + +import java.security.NoSuchAlgorithmException; + +public class LoginController { + @FXML + private VBox parent; + @FXML + private TextField playerName, password; + @FXML + private Label errorMessage; + + SceneLoader sceneLoader = new SceneLoader(); + Persistence persistence = Persistence.getInstance(); + + private void switchScene(String name) { + parent.getChildren().clear(); + parent.getChildren().add(sceneLoader.loadScene(name)); + } + + @FXML + private void login() { + errorMessage.setText("Loading an eternity because of slow SQL server..."); + thread.start(); + } + + Thread thread = new Thread(() -> { + try { + persistence.login(playerName.getText(), password.getText()); + Platform.runLater(() -> switchScene("MainMenu")); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } catch (DatabaseException e) { + Platform.runLater(() -> errorMessage.setText(e.getMessage())); + } + }); + + @FXML + private void back() { + thread.interrupt(); + switchScene("PlayerCreateScene"); + } +} 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 392326c31e7e700ca491b955e92531d125bf9e5f..75315ab525f8037751af3070d1402fe0c9ed7f71 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.ENUMs.AccountType; import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence; import javafx.fxml.FXML; import javafx.fxml.Initializable; @@ -34,7 +35,7 @@ public class MenuBorderPaneController implements Initializable { private MediaPlayer musicPlayer, mediaPlayer; private MediaView mediaView; 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", + "kangaroo", "lifeCouldBeMonke", "seal", "rolling", "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", "catJump", "bear", "pancake", "frog", "gtfo", "carl", "dog2", "slippery", "wolf", "legCat", "sad", "waaahhh"}; @@ -44,7 +45,11 @@ public class MenuBorderPaneController implements Initializable { @Override public void initialize(URL url, ResourceBundle resourceBundle) { - center.getChildren().add(sceneLoader.loadScene("MainMenu")); + if (Persistence.getInstance().getAccount().getAccountType() == AccountType.NONE) { + center.getChildren().add(sceneLoader.loadScene("PlayerCreateScene")); + } else { + center.getChildren().add(sceneLoader.loadScene("MainMenu")); + } // set size for rusty gear image depending on screen resolution final double imageWidth = screen.getWidth() / 6; imgRight.setFitWidth(imageWidth); diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/PlaceholderController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/PlaceholderController.java new file mode 100644 index 0000000000000000000000000000000000000000..a018d9e82ae12e61b22762484397f479597ff0c1 --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/PlaceholderController.java @@ -0,0 +1,51 @@ +package de.hdm_stuttgart.battlearena.Controller; + +import de.hdm_stuttgart.battlearena.Controller.Utilities.CreateMediaPlayer; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.fxml.Initializable; +import javafx.scene.control.Button; +import javafx.scene.layout.BorderPane; +import javafx.scene.media.Media; +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 PlaceholderController implements Initializable { + @FXML + private BorderPane parent; + @FXML + private MediaView mediaView; + @FXML + private Button button; + private MediaPlayer mediaPlayer, musicPlayer; + + @Override + public void initialize(URL url, ResourceBundle resourceBundle) { + File file = new File("src/main/resources/videos/construction.mp4"); + mediaPlayer = new CreateMediaPlayer().getMediaPlayer(mediaView, file, true, parent); + mediaView.setMediaPlayer(mediaPlayer); + mediaPlayer.setCycleCount(MediaPlayer.INDEFINITE); + parent.setStyle("-fx-font-size: 50; -fx-text-fill: white; -fx-font-family: 'Arial Black'"); + + Media musicMedia = new Media(new File("src/main/resources/sound/music/constructionJazz.mp3").toURI().toString()); + musicPlayer = new MediaPlayer(musicMedia); + musicPlayer.setCycleCount(MediaPlayer.INDEFINITE); + musicPlayer.setAutoPlay(true); + + button.setOnMouseClicked(mouseEvent -> { + try { + mediaPlayer.dispose(); + musicPlayer.dispose(); + 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/PlayerCreateController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/PlayerCreateController.java index 68dfd4029aad7452c5d19d82fdfcaec3f0e8435e..56f73045145a2c36b567f177e7423cd86f0bcd07 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/PlayerCreateController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/PlayerCreateController.java @@ -1,51 +1,34 @@ package de.hdm_stuttgart.battlearena.Controller; -import de.hdm_stuttgart.battlearena.Controller.Utilities.CreateMediaPlayer; +import de.hdm_stuttgart.battlearena.Controller.Utilities.SceneLoader; import javafx.fxml.FXML; -import javafx.fxml.FXMLLoader; -import javafx.fxml.Initializable; -import javafx.scene.control.Button; -import javafx.scene.layout.BorderPane; -import javafx.scene.media.Media; -import javafx.scene.media.MediaPlayer; -import javafx.scene.media.MediaView; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; -import java.io.File; -import java.io.IOException; -import java.net.URL; -import java.util.Objects; -import java.util.ResourceBundle; - -public class PlayerCreateController implements Initializable { - @FXML - private BorderPane parent; - @FXML - private MediaView mediaView; +public class PlayerCreateController { @FXML - private Button button; - private MediaPlayer mediaPlayer, musicPlayer; + private VBox parent; - @Override - public void initialize(URL url, ResourceBundle resourceBundle) { - File file = new File("src/main/resources/videos/construction.mp4"); - mediaPlayer = new CreateMediaPlayer().getMediaPlayer(mediaView, file, true, parent); - mediaView.setMediaPlayer(mediaPlayer); - mediaPlayer.setCycleCount(MediaPlayer.INDEFINITE); - parent.setStyle("-fx-font-size: 50; -fx-text-fill: white; -fx-font-family: 'Arial Black'"); + SceneLoader sceneLoader = new SceneLoader(); - Media musicMedia = new Media(new File("src/main/resources/sound/music/constructionJazz.mp3").toURI().toString()); - musicPlayer = new MediaPlayer(musicMedia); - musicPlayer.setCycleCount(MediaPlayer.INDEFINITE); - musicPlayer.setAutoPlay(true); + private void switchScene(String name) { + parent.getChildren().clear(); + parent.getChildren().add(sceneLoader.loadScene(name)); + } - button.setOnMouseClicked(mouseEvent -> { - try { - mediaPlayer.dispose(); - musicPlayer.dispose(); - parent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/MenuBorderPane.fxml")))); - } catch (IOException e) { - throw new RuntimeException(); - } - }); + @FXML + private void createScene() { + switchScene("CreateAccount"); + } + + @FXML + private void loginScene() { + switchScene("Login"); + } + + @FXML + private void exit() { + Stage stage = (Stage) parent.getScene().getWindow(); + stage.close(); } } 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 a04eb1c6d84b615f3eff95b33d86485cb0ef5b51..836c9cf9df4f8f17b7633fac1c0867d9b00bac02 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/SettingsController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/SettingsController.java @@ -38,8 +38,17 @@ public class SettingsController implements Initializable { @FXML private void backButton() { + switchScene("MainMenu"); + } + + @FXML + private void account() { + switchScene("PlayerCreateScene"); + } + + private void switchScene(String name) { parent.getChildren().clear(); - parent.getChildren().add(sceneLoader.loadScene("MainMenu")); + parent.getChildren().add(sceneLoader.loadScene(name)); } private void setMusicVolume() { diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/ButtonTransition.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/ButtonTransition.java index b129d469320cdd8549e234a3a5d6fae8901187ea..8e59516428834ab48bf7a9b2cfebb1760ad63308 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/ButtonTransition.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/ButtonTransition.java @@ -1,6 +1,7 @@ package de.hdm_stuttgart.battlearena.Controller.Utilities; import javafx.animation.ScaleTransition; +import javafx.application.Platform; import javafx.scene.control.Button; import javafx.scene.control.skin.ButtonSkin; import javafx.util.Duration; @@ -13,14 +14,20 @@ public class ButtonTransition extends ButtonSkin { fadeIn.setNode(button); fadeIn.setToX(1.1); fadeIn.setToY(1.1); - button.setOnMouseEntered(e -> fadeIn.playFromStart()); + +// this ensures that any JavaFX related code is run on the JavaFX application thread + button.setOnMouseEntered(e -> { + Platform.runLater(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.setOnMouseExited(e -> { + Platform.runLater(fadeOut::playFromStart); + }); button.setScaleX(1.0); button.setScaleY(1.0); diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Main/Driver.java b/src/main/java/de/hdm_stuttgart/battlearena/Main/Driver.java new file mode 100644 index 0000000000000000000000000000000000000000..66f93ada9d0e18cccb86262356517c4f79d881e3 --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Main/Driver.java @@ -0,0 +1,75 @@ +package de.hdm_stuttgart.battlearena.Main; + + +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; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.image.Image; +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; + +import java.util.Objects; + +public class Driver extends Application { + + private static final Logger log = LogManager.getLogger(Driver.class); + Rectangle2D screen = Screen.getPrimary().getVisualBounds(); + + InputHandler inputHandler = InputHandler.getInstance(); + + SoundManager soundManager = new SoundManager(); + + @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); + Font.loadFont(getClass().getResourceAsStream("/fonts/AmaticSC-Bold.ttf"), 50); + Font.loadFont(getClass().getResourceAsStream("/fonts/Arthemis-mLA22.ttf"), 50); + Font.loadFont(getClass().getResourceAsStream("/fonts/ShadowsIntoLight-Regular.ttf"), 50); + + Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/LoadingScreen.fxml"))); + + Scene scene = new Scene(root); + + scene.setOnKeyPressed(inputHandler::handleKeyPress); + scene.setOnKeyReleased(inputHandler::handleKeyRelease); + + stage.setTitle("BattleArena"); + stage.getIcons().add(new Image("file:src/main/resources/textures/images/icon.png")); + 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.setOnCloseRequest(event -> { + if (soundManager != null) { + soundManager.stopMusic(); + } + }); + + stage.show(); + log.debug("Project started successfully!"); + +// Exiting program if an exception occurs +// Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { +// log.error(throwable.getMessage()); +// System.exit(1); +// }); + } +} \ No newline at end of file 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 dd93c23719f1f4cb260c6b9da8a0f1f1fac2b475..77261800125e391620b0facc16c47a6ee3217f79 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Main/Main.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Main/Main.java @@ -1,76 +1,9 @@ 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; -import javafx.scene.Parent; -import javafx.scene.Scene; -import javafx.scene.image.Image; -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; - -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(); +public class Main { public static void main(String[] args) { - launch(args); - } - - @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); - -// TODO: revert back to intro scene - Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/Intro.fxml"))); - - Scene scene = new Scene(root); - - scene.setOnKeyPressed(inputHandler::handleKeyPress); - scene.setOnKeyReleased(inputHandler::handleKeyRelease); - - stage.setTitle("BattleArena"); - stage.getIcons().add(new Image("file:src/main/resources/textures/images/icon.png")); - 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); - - - SoundManager soundManager = new SoundManager(); - - stage.setOnCloseRequest(event -> { - if (soundManager != null) { - soundManager.stopMusic(); - } - }); - - soundManager.playMusic(MusicType.GAME); - - stage.show(); - log.debug("Project started successfully!"); + Application.launch(Driver.class, args); } -} \ No newline at end of file +} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/ThreadStatus.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/ThreadStatus.java index fb75fb7eef6bf215cb9545b3e455c243d5ef4123..48ef20b9c36ce3e1758460adb489b643a7175c8e 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/ThreadStatus.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/ThreadStatus.java @@ -4,6 +4,7 @@ public enum ThreadStatus { RUNNING, FAILED, - FINISHED + FINISHED, + NONE } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Persistence.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Persistence.java index a27908ba0c61f640c24d0b1b8b788bfa0a52b8be..ed590c689081da1173a70e2c12f920f7e9489148 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Persistence.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Persistence.java @@ -11,6 +11,7 @@ import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Utilities.Parser; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import java.security.NoSuchAlgorithmException; import java.util.ArrayList; public class Persistence { @@ -454,4 +455,20 @@ public class Persistence { } } + public void login(String userName, String password) throws NoSuchAlgorithmException, RuntimeException, DatabaseException { + try { + String hash = HashGenerator.hashAndHex(password); + if (hash.equals(db.checkCredentials(userName))) { + PlayerAccount playerAccount = new PlayerAccount(userName, hash, AccountType.ONLINE); + gsonHandler.saveAccount(playerAccount); + db.getStatistics(userName); + } else { + throw new DatabaseException(); + } + } catch (GSONException | SQLException e) { + throw new RuntimeException(e); + } catch (DatabaseException e) { + throw new DatabaseException("Wrong password"); + } + } } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup2.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup2.java index 4d9a3a57c6c76bf29425ecd0ce5f62a1dcc43d40..4fc52e8654ba4827ef5bf22993ade103e6f44eb8 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup2.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup2.java @@ -1,5 +1,6 @@ package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes; +import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.AccountType; import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.ThreadStatus; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -18,6 +19,9 @@ public class ThreadStartup2 extends Thread{ runtimeInfoInst.setThreadStartup2Msg(""); runtimeInfoInst.setThreadStartup2(ThreadStatus.RUNNING); persistenceInst.loadPlayerAccount(); + if (persistenceInst.getAccount().getAccountType() != AccountType.NONE) { + persistenceInst.verifyPlayerAccount(); + } log.info("Startup routine part2 complete!"); runtimeInfoInst.setThreadStartup2(ThreadStatus.FINISHED); } catch (Exception e) { diff --git a/src/main/resources/fonts/AmaticSC-Bold.ttf b/src/main/resources/fonts/AmaticSC-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..63cd7ae5be0bce367f8c0aa0e30702d065680923 Binary files /dev/null and b/src/main/resources/fonts/AmaticSC-Bold.ttf differ diff --git a/src/main/resources/fonts/AmaticSC-Regular.ttf b/src/main/resources/fonts/AmaticSC-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b860368bec2246d3c268c075167c9d7333d454d0 Binary files /dev/null and b/src/main/resources/fonts/AmaticSC-Regular.ttf differ diff --git a/src/main/resources/fonts/Arthemis-mLA22.ttf b/src/main/resources/fonts/Arthemis-mLA22.ttf new file mode 100644 index 0000000000000000000000000000000000000000..165d0d21fda6832a71ff683dcfafe042a5d2d016 Binary files /dev/null and b/src/main/resources/fonts/Arthemis-mLA22.ttf differ diff --git a/src/main/resources/fonts/ShadowsIntoLight-Regular.ttf b/src/main/resources/fonts/ShadowsIntoLight-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d20640513b188b6627c3b11383721eba624f1b26 Binary files /dev/null and b/src/main/resources/fonts/ShadowsIntoLight-Regular.ttf differ diff --git a/src/main/resources/fxml/CreateAccount.fxml b/src/main/resources/fxml/CreateAccount.fxml new file mode 100644 index 0000000000000000000000000000000000000000..b75267745fd38367a38728324cf4b7a0aefa720c --- /dev/null +++ b/src/main/resources/fxml/CreateAccount.fxml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.scene.control.Button?> +<?import javafx.scene.control.Label?> +<?import javafx.scene.control.RadioButton?> +<?import javafx.scene.control.TextField?> +<?import javafx.scene.control.ToggleGroup?> +<?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.CreateAccountController"> + <children> + <Pane VBox.vgrow="ALWAYS" /> + <VBox alignment="CENTER" VBox.vgrow="ALWAYS"> + <children> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Tracking statistics:" /> + <HBox alignment="CENTER" spacing="30.0" VBox.vgrow="ALWAYS"> + <children> + <RadioButton fx:id="local" mnemonicParsing="false" text="Local"> + <toggleGroup> + <ToggleGroup fx:id="statistics" /> + </toggleGroup> + </RadioButton> + <RadioButton mnemonicParsing="false" text="Online" toggleGroup="$statistics" /> + </children> + </HBox> + </children> + </VBox> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Player Name:" /> + <TextField fx:id="playerName" alignment="CENTER" /> + <Label fx:id="passwordLabel" text="Password:" /> + <TextField fx:id="password" alignment="CENTER" /> + <Label fx:id="errorMessage" /> + <Button mnemonicParsing="false" onAction="#create" text="Create" /> + <Button mnemonicParsing="false" onAction="#back" text="Back" /> + <Pane VBox.vgrow="ALWAYS" /> + </children> +</VBox> diff --git a/src/main/resources/fxml/LoadingScreen.fxml b/src/main/resources/fxml/LoadingScreen.fxml new file mode 100644 index 0000000000000000000000000000000000000000..4e242f48920d3c22e5351886ead0da65eaa80b44 --- /dev/null +++ b/src/main/resources/fxml/LoadingScreen.fxml @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.geometry.Insets?> +<?import javafx.scene.control.Label?> +<?import javafx.scene.image.Image?> +<?import javafx.scene.image.ImageView?> +<?import javafx.scene.layout.BorderPane?> +<?import javafx.scene.layout.HBox?> +<?import javafx.scene.layout.Pane?> +<?import javafx.scene.shape.Rectangle?> +<?import javafx.scene.text.Font?> + +<BorderPane id="loadingScreen" 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.LoadingScreenController"> + <bottom> + <HBox alignment="BOTTOM_CENTER" BorderPane.alignment="BOTTOM_CENTER"> + <children> + <Rectangle arcHeight="5.0" arcWidth="5.0" fill="#ffffff00" height="180.0" stroke="TRANSPARENT" strokeType="INSIDE" width="180.0" HBox.hgrow="NEVER"> + <HBox.margin> + <Insets bottom="50.0" left="50.0" right="50.0" /> + </HBox.margin> + </Rectangle> + <Pane HBox.hgrow="ALWAYS" /> + <Label fx:id="tips" alignment="CENTER" contentDisplay="CENTER" text="If you see this, then something went wrong lmao" textFill="WHITE" wrapText="true"> + <font> + <Font name="Helvetica Neue LT Com 53 Extended" size="40.0" /> + </font> + <HBox.margin> + <Insets bottom="50.0" /> + </HBox.margin> + </Label> + <Pane HBox.hgrow="ALWAYS" /> + <ImageView fx:id="throbber" fitHeight="180.0" fitWidth="180.0" pickOnBounds="true" preserveRatio="true"> + <image> + <Image url="@../textures/images/throbber.gif" /> + </image> + <HBox.margin> + <Insets bottom="50.0" left="50.0" right="50.0" /> + </HBox.margin> + </ImageView> + </children> + <BorderPane.margin> + <Insets /> + </BorderPane.margin> + </HBox> + </bottom> + <center> + <ImageView fx:id="logo" fitHeight="800.0" fitWidth="900.0" pickOnBounds="true" preserveRatio="true" BorderPane.alignment="CENTER"> + <image> + <Image url="@../textures/images/logo_transparent.png" /> + </image> + </ImageView> + </center> +</BorderPane> diff --git a/src/main/resources/fxml/Login.fxml b/src/main/resources/fxml/Login.fxml new file mode 100644 index 0000000000000000000000000000000000000000..a63c7c127ff2c30d0499ffc963851e061324bf58 --- /dev/null +++ b/src/main/resources/fxml/Login.fxml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.scene.control.Button?> +<?import javafx.scene.control.Label?> +<?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="20.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.hdm_stuttgart.battlearena.Controller.LoginController"> + <children> + <Pane VBox.vgrow="ALWAYS" /> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Login with existing online account" /> + <Pane VBox.vgrow="ALWAYS" /> + <Pane VBox.vgrow="ALWAYS" /> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Player Name:" /> + <TextField fx:id="playerName" alignment="CENTER" /> + <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Password:" /> + <TextField fx:id="password" alignment="CENTER" /> + <Label fx:id="errorMessage" /> + <Button mnemonicParsing="false" onAction="#login" text="Login" /> + <Button mnemonicParsing="false" onAction="#back" text="Back" /> + <Pane VBox.vgrow="ALWAYS" /> + </children> +</VBox> diff --git a/src/main/resources/fxml/Placeholder.fxml b/src/main/resources/fxml/Placeholder.fxml new file mode 100644 index 0000000000000000000000000000000000000000..5b08cde3dfdf168d0e09cc1f005c3f62ac8e09c5 --- /dev/null +++ b/src/main/resources/fxml/Placeholder.fxml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.scene.control.Button?> +<?import javafx.scene.layout.BorderPane?> +<?import javafx.scene.layout.StackPane?> +<?import javafx.scene.layout.VBox?> +<?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.PlaceholderController"> + <center> + <StackPane BorderPane.alignment="CENTER"> + <children> + <MediaView fx:id="mediaView" fitHeight="200.0" fitWidth="200.0" /> + <VBox alignment="CENTER" prefHeight="200.0" prefWidth="100.0" spacing="10.0"> + <children> + <Text fill="WHITE" strokeType="OUTSIDE" strokeWidth="0.0" text="WELCOME!" /> + <Text fill="WHITE" strokeType="OUTSIDE" strokeWidth="0.0" text="This page is still under construction" /> + <Text fill="WHITE" strokeType="OUTSIDE" strokeWidth="0.0" text="please have some patience" /> + <Text fill="WHITE" strokeType="OUTSIDE" strokeWidth="0.0" text="Thank you" /> + <Button fx:id="button" mnemonicParsing="false" text="Get me out of here" /> + </children> + </VBox> + </children> + </StackPane> + </center> +</BorderPane> diff --git a/src/main/resources/fxml/PlayerCreateScene.fxml b/src/main/resources/fxml/PlayerCreateScene.fxml index 5200c6495466b6bf62772664a6f3a093ac2f5453..9a7e5e347bd49fc7a87467f5700922cbf3fdb937 100644 --- a/src/main/resources/fxml/PlayerCreateScene.fxml +++ b/src/main/resources/fxml/PlayerCreateScene.fxml @@ -1,27 +1,17 @@ <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.Button?> -<?import javafx.scene.layout.BorderPane?> -<?import javafx.scene.layout.StackPane?> +<?import javafx.scene.layout.Pane?> <?import javafx.scene.layout.VBox?> -<?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"> - <children> - <MediaView fx:id="mediaView" fitHeight="200.0" fitWidth="200.0" /> - <VBox alignment="CENTER" prefHeight="200.0" prefWidth="100.0" spacing="10.0"> - <children> - <Text fill="WHITE" strokeType="OUTSIDE" strokeWidth="0.0" text="WELCOME!" /> - <Text fill="WHITE" strokeType="OUTSIDE" strokeWidth="0.0" text="This page is still under construction" /> - <Text fill="WHITE" strokeType="OUTSIDE" strokeWidth="0.0" text="please have some patience" /> - <Text fill="WHITE" strokeType="OUTSIDE" strokeWidth="0.0" text="Thank you" /> - <Button fx:id="button" mnemonicParsing="false" text="Get me out of here" /> - </children> - </VBox> - </children> - </StackPane> - </center> -</BorderPane> + +<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.PlayerCreateController"> + <children> + <Pane prefHeight="200.0" prefWidth="200.0" /> + <Button mnemonicParsing="false" onAction="#createScene" text="Create Account" /> + <Button mnemonicParsing="false" onAction="#loginScene" text="Login" /> + <Pane prefHeight="200.0" prefWidth="200.0" /> + <Button mnemonicParsing="false" onAction="#exit" text="Exit" /> + <Pane prefHeight="200.0" prefWidth="200.0" /> + </children> +</VBox> diff --git a/src/main/resources/fxml/Settings.fxml b/src/main/resources/fxml/Settings.fxml index 7b8950fc2664c2e1e041ce2d05b7b46986f01d64..3f84b3167228690e174a053e4d5ba4128fc44e72 100644 --- a/src/main/resources/fxml/Settings.fxml +++ b/src/main/resources/fxml/Settings.fxml @@ -28,6 +28,7 @@ </VBox> </children> </HBox> + <Button mnemonicParsing="false" onAction="#account" text="Account" /> <Button mnemonicParsing="false" onAction="#creditScene" text="Credits" /> <Button mnemonicParsing="false" onAction="#backButton" text="Back" /> </children> diff --git a/src/main/resources/fxml/Statistics.fxml b/src/main/resources/fxml/Statistics.fxml index 6c98b4e5e5aa7e8efd880b6945b8c7091aa04d32..42b8646af9788053e25149e8a04a9d3d8f0bfb1f 100644 --- a/src/main/resources/fxml/Statistics.fxml +++ b/src/main/resources/fxml/Statistics.fxml @@ -7,11 +7,11 @@ <?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"> +<VBox fx:id="parent" alignment="CENTER" 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.StatisticsController"> <children> - <HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0" spacing="30.0" VBox.vgrow="ALWAYS"> + <HBox alignment="CENTER" prefHeight="411.0" prefWidth="677.0" spacing="30.0" VBox.vgrow="ALWAYS"> <children> - <VBox alignment="CENTER_RIGHT" prefHeight="200.0" prefWidth="100.0" spacing="10.0" HBox.hgrow="ALWAYS"> + <VBox alignment="CENTER_RIGHT" spacing="10.0" HBox.hgrow="ALWAYS"> <children> <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Kills:" /> <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Deaths:" /> @@ -21,7 +21,7 @@ <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"> + <VBox alignment="CENTER_LEFT" 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" /> @@ -38,11 +38,11 @@ <children> <PieChart fx:id="kd" minHeight="-Infinity" minWidth="-Infinity" VBox.vgrow="ALWAYS"> <VBox.margin> - <Insets bottom="-200.0" /> + <Insets bottom="-200.0" top="-250.0" /> </VBox.margin></PieChart> <PieChart fx:id="wl" minHeight="-Infinity" minWidth="-Infinity" VBox.vgrow="ALWAYS"> <VBox.margin> - <Insets top="-40.0" /> + <Insets bottom="-250.0" top="-40.0" /> </VBox.margin></PieChart> </children> </VBox> diff --git a/src/main/resources/player/appSettings.json b/src/main/resources/player/appSettings.json index ec5bc62a909f2065d81be4cfd6c494b9e10715fb..f7d371619fa1db8dd4701e6607908135293b820c 100644 --- a/src/main/resources/player/appSettings.json +++ b/src/main/resources/player/appSettings.json @@ -1,4 +1,4 @@ { - "sfxVolume": 50, + "sfxVolume": 100, "musicVolume": 0 } \ No newline at end of file diff --git a/src/main/resources/player/playerStatsLocal.json b/src/main/resources/player/playerStatsLocal.json index e51de779c74b6c93fe347b5bf263508c23fff2c9..4db3d0788fb3ff0fe8d593e5baed84279916821b 100644 --- a/src/main/resources/player/playerStatsLocal.json +++ b/src/main/resources/player/playerStatsLocal.json @@ -1,8 +1,8 @@ { - "gamesLost": 5, - "gamesWon": 9, - "kills": 30, - "deaths": 20, - "blocksDestroyed": 200, - "gameTime": 3966480 + "gamesLost": 0, + "gamesWon": 0, + "kills": 0, + "deaths": 0, + "blocksDestroyed": 0, + "gameTime": 0 } \ No newline at end of file diff --git a/src/main/resources/styles/style.css b/src/main/resources/styles/style.css index e676c8daadf56536c73d3bf8dd515a7c5a7533cd..0389e5bbbcc594716ff89c2a3d73e0dfd7fc61a3 100644 --- a/src/main/resources/styles/style.css +++ b/src/main/resources/styles/style.css @@ -8,18 +8,39 @@ } .root { - -fx-font-family: "Starship Shadow"; + -fx-font-family: "Arthemis"; -fx-text-fill: white; -fx-background-color: black; + -fx-font-size: 50 px; +} + +#tips { + -fx-font-family: "Amatic SC Bold"; + -fx-font-size: 40 px; +} + +#loadingScreen { + -fx-background-color: radial-gradient(focus-distance 0% , center 50% 50% , radius 45% , #a31c31, #542b27); +} + +.text-field { + -fx-background-color: transparent; + -fx-text-fill: black; + -fx-border-color: black; + -fx-border-width: 0 0 2 0; + -fx-prompt-text-fill: rgba(0, 0, 0, 0.5); + -fx-font-family: "Shadows Into Light"; } + #mainMenu{ -fx-background-image: url("../textures/images/background.png"); -fx-background-size: cover; } #gameTitle { - -fx-font-size: 100; + -fx-font-size: 100 px; + -fx-font-family: "Starship Shadow"; } .button { @@ -30,7 +51,7 @@ #btnLeft { -fx-skin: none; - -fx-text-fill: white; + -fx-text-fill: #7a7a7a; } .accordion { diff --git a/src/main/resources/textures/images/logo_transparent.png b/src/main/resources/textures/images/logo_transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa46908f9c28d66b837bfc3d073aab080759127 Binary files /dev/null and b/src/main/resources/textures/images/logo_transparent.png differ diff --git a/src/main/resources/textures/images/logo_transparent_alt.png b/src/main/resources/textures/images/logo_transparent_alt.png new file mode 100644 index 0000000000000000000000000000000000000000..817ba0a2f3103c351277b8598614836c377ce058 Binary files /dev/null and b/src/main/resources/textures/images/logo_transparent_alt.png differ diff --git a/src/main/resources/textures/images/throbber.gif b/src/main/resources/textures/images/throbber.gif new file mode 100644 index 0000000000000000000000000000000000000000..45caf1ef603429f181feebcc5505f4b01f512728 Binary files /dev/null and b/src/main/resources/textures/images/throbber.gif differ diff --git a/src/main/resources/videos/rolling.mp4 b/src/main/resources/videos/rolling.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..07dd01a89cbc742e3a449aa8dae9c99b3f631e43 Binary files /dev/null and b/src/main/resources/videos/rolling.mp4 differ