aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/net/sowgro/npehero/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/net/sowgro/npehero/gui')
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/gui/GameOver.java124
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/gui/Leaderboard.java72
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/gui/LevelDetails.java137
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/gui/LevelSelector.java98
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/gui/LevelSurround.java150
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/gui/MainMenu.java70
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/gui/Settings.java131
7 files changed, 782 insertions, 0 deletions
diff --git a/src/main/java/net/sowgro/npehero/gui/GameOver.java b/src/main/java/net/sowgro/npehero/gui/GameOver.java
new file mode 100755
index 0000000..68ce3ea
--- /dev/null
+++ b/src/main/java/net/sowgro/npehero/gui/GameOver.java
@@ -0,0 +1,124 @@
+package net.sowgro.npehero.gui;
+
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import javafx.geometry.Insets;
+import javafx.geometry.Pos;
+import javafx.scene.control.Button;
+import javafx.scene.control.TextField;
+import javafx.scene.layout.BorderPane;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.Pane;
+import javafx.scene.layout.VBox;
+import javafx.scene.text.Text;
+import net.sowgro.npehero.Driver;
+import net.sowgro.npehero.main.Difficulty;
+import net.sowgro.npehero.main.Level;
+
+public class GameOver extends Pane
+{
+ /*
+ * this class is a layout class, most of its purpose is to place UI elements like Buttons within Panes like VBoxes.
+ * the creation of these UI elements are mostly not commented due to their repetitive and self explanatory nature.
+ * style classes are defined in the style.css file.
+ */
+ public GameOver(Level level, Difficulty diff, Pane lastMenu, int score2)
+ {
+ Text topText = new Text();
+ topText.setText("Level Complete");
+ topText.getStyleClass().add("t11");
+
+ Text levelName = new Text();
+ levelName.setText(level.getTitle());
+ levelName.getStyleClass().add("t2");
+
+ Text levelArtist = new Text();
+ levelArtist.setText(level.getArtist()+" - "+diff.title);
+ levelArtist.getStyleClass().add("t3");
+
+ VBox levelDetailsBox = new VBox();
+ levelDetailsBox.getChildren().addAll(levelName,levelArtist);
+ levelDetailsBox.getStyleClass().add("box");
+ levelDetailsBox.setPadding(new Insets(5));
+
+
+ Text scoreLabel = new Text();
+ scoreLabel.setText("Final score");
+ scoreLabel.getStyleClass().add("t3");
+
+ Text score = new Text();
+ score.setText(score2+"");
+ score.getStyleClass().add("t2");
+ score.setStyle("-fx-font-size: 30;");
+
+ VBox scoreBox = new VBox();
+ scoreBox.getStyleClass().add("box");
+ scoreBox.getChildren().addAll(scoreLabel,score);
+ scoreBox.setPadding(new Insets(5));
+
+
+ Text nameLabel = new Text();
+ nameLabel.setText("Leaderboard entry");
+ nameLabel.getStyleClass().add("t3");
+
+ TextField name = new TextField();
+ name.getStyleClass().remove("text-feild");
+ name.getStyleClass().add("button");
+ name.setText("name");
+
+ Button save = new Button();
+ save.setText("Add");
+ save.setOnAction(new EventHandler<ActionEvent>() { //this is the same as the "e ->" thing but it allows more than one line to be added
+ @Override
+ public void handle(ActionEvent event) {
+ Driver.soundController.playSfx("forward");
+ save.setDisable(true);
+ name.setDisable(true);
+ diff.addToLeaderboard(name.getText(), score2);
+ }
+ });
+
+ BorderPane b = new BorderPane();
+ b.setRight(save);
+ b.setCenter(name);
+
+ VBox nameBox = new VBox();
+ nameBox.getChildren().addAll(nameLabel,b);
+ nameBox.getStyleClass().add("box");
+ nameBox.setSpacing(5);
+ nameBox.setPadding(new Insets(5));
+
+
+ Button exit = new Button();
+ exit.setText("Back");
+ exit.setOnAction(e -> {
+ Driver.soundController.playSfx("backward");
+ Driver.setMenu(lastMenu);
+ });
+
+ Button replay = new Button();
+ replay.setText("Replay");
+ replay.setOnAction(e -> {
+ Driver.soundController.playSfx("forward");
+ Driver.setMenu(new LevelSurround(level, diff, lastMenu));
+ });
+
+ BorderPane buttonBox = new BorderPane();
+ buttonBox.setLeft(exit);
+ buttonBox.setRight(replay);
+
+
+ VBox centerBox = new VBox();
+ centerBox.getChildren().addAll(topText,levelDetailsBox,scoreBox,nameBox,buttonBox);
+ centerBox.setSpacing(10);
+ centerBox.setAlignment(Pos.CENTER);
+
+ HBox rootBox = new HBox();
+ rootBox.getChildren().add(centerBox);
+ rootBox.setAlignment(Pos.CENTER);
+ rootBox.prefWidthProperty().bind(super.prefWidthProperty());
+ rootBox.prefHeightProperty().bind(super.prefHeightProperty());
+
+ super.getChildren().add(rootBox);
+ }
+}
diff --git a/src/main/java/net/sowgro/npehero/gui/Leaderboard.java b/src/main/java/net/sowgro/npehero/gui/Leaderboard.java
new file mode 100755
index 0000000..a8e54d1
--- /dev/null
+++ b/src/main/java/net/sowgro/npehero/gui/Leaderboard.java
@@ -0,0 +1,72 @@
+package net.sowgro.npehero.gui;
+
+import javafx.beans.property.ReadOnlyStringWrapper;
+import javafx.geometry.Pos;
+import javafx.scene.control.Button;
+import javafx.scene.control.TableColumn;
+import javafx.scene.control.TableView;
+import javafx.scene.control.TableColumn.SortType;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.Pane;
+import javafx.scene.layout.VBox;
+import net.sowgro.npehero.Driver;
+import net.sowgro.npehero.main.Difficulty;
+import net.sowgro.npehero.main.LeaderboardEntry;
+import net.sowgro.npehero.main.Level;
+
+public class Leaderboard extends Pane
+{
+ /*
+ * this class is a layout class, most of its purpose is to place UI elements like Buttons within Panes like VBoxes.
+ * the creation of these UI elements are mostly not commented due to their repetitive and self explanatory nature.
+ * style classes are defined in the style.css file.
+ */
+ public Leaderboard(Level level, Difficulty diff, Pane prev)
+ {
+ //sets up table view: requires java bean getters, setters and constructors to work
+ TableView<LeaderboardEntry> scores = new TableView<LeaderboardEntry>();
+
+ TableColumn<LeaderboardEntry, String> nameCol = new TableColumn<LeaderboardEntry, String>("Name");
+ TableColumn<LeaderboardEntry, String> scoreCol = new TableColumn<LeaderboardEntry, String>("Score");
+ TableColumn<LeaderboardEntry, String> dateCol = new TableColumn<LeaderboardEntry, String>("Date");
+
+ scores.getColumns().add(nameCol);
+ scores.getColumns().add(scoreCol);
+ scores.getColumns().add(dateCol);
+
+ nameCol.setCellValueFactory(data -> new ReadOnlyStringWrapper(data.getValue().getName()));
+ scoreCol.setCellValueFactory(data -> new ReadOnlyStringWrapper(data.getValue().getScore() + ""));
+ dateCol.setCellValueFactory(data -> new ReadOnlyStringWrapper(data.getValue().getDate()));
+
+ scores.setItems(diff.getLeaderboard());
+
+ scores.getStyleClass().add("unselectable");
+
+ scores.prefWidthProperty().bind(super.prefWidthProperty().multiply(0.25));
+ scores.prefHeightProperty().bind(super.prefHeightProperty().multiply(0.75));
+
+ scoreCol.setSortType(SortType.DESCENDING);
+ scores.getSortOrder().add(scoreCol);
+
+ Button exit = new Button();
+ exit.setText("Back");
+ exit.setOnAction(e -> {
+ Driver.soundController.playSfx("backward");
+ Driver.setMenu(prev);
+ });
+
+ VBox centerBox = new VBox();
+ centerBox.setAlignment(Pos.CENTER);
+ centerBox.setSpacing(10);
+ centerBox.getChildren().addAll(scores,exit);
+ centerBox.setMinWidth(400);
+
+ HBox rootBox = new HBox();
+ rootBox.prefWidthProperty().bind(super.prefWidthProperty());
+ rootBox.prefHeightProperty().bind(super.prefHeightProperty());
+ rootBox.getChildren().add(centerBox);
+ rootBox.setAlignment(Pos.CENTER);
+
+ super.getChildren().add(rootBox);
+ }
+}
diff --git a/src/main/java/net/sowgro/npehero/gui/LevelDetails.java b/src/main/java/net/sowgro/npehero/gui/LevelDetails.java
new file mode 100755
index 0000000..25d96c8
--- /dev/null
+++ b/src/main/java/net/sowgro/npehero/gui/LevelDetails.java
@@ -0,0 +1,137 @@
+package net.sowgro.npehero.gui;
+
+import javafx.geometry.Insets;
+import javafx.geometry.Pos;
+import javafx.scene.control.Button;
+import javafx.scene.control.RadioButton;
+import javafx.scene.control.ScrollPane;
+import javafx.scene.control.ToggleGroup;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.scene.layout.FlowPane;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.VBox;
+import javafx.scene.text.Text;
+import javafx.scene.text.TextAlignment;
+import javafx.scene.text.TextFlow;
+import net.sowgro.npehero.Driver;
+import net.sowgro.npehero.main.Difficulty;
+import net.sowgro.npehero.main.Level;
+
+public class LevelDetails extends VBox
+{
+ /**
+ * this class is a layout class, most of its purpose is to place UI elements like Buttons within Panes like VBoxes.
+ * the creation of these UI elements are mostly not commented due to their repetitive and self explanatory nature.
+ * style classes are defined in the style.css file.
+ *
+ * @param level: the selected level on the right side
+ */
+ public LevelDetails(Level level)
+ {
+ VBox rightBox = new VBox();
+ rightBox.prefWidthProperty().bind(super.prefWidthProperty());
+ rightBox.prefHeightProperty().bind(super.prefHeightProperty().multiply(0.75));
+ rightBox.setMinWidth(350);
+ rightBox.getStyleClass().add("box");
+
+ Button play = new Button();
+ play.setDisable(true);
+ play.setText("Play");
+
+ Button leaderboard = new Button();
+ leaderboard.setDisable(true);
+ leaderboard.setText("Leaderboard");
+
+ if (level == null) //if no level is selected from the list on the left
+ {
+ Text desc = new Text();
+ desc.setText("Select a level from the left pane");
+ desc.getStyleClass().add("t3");
+ desc.wrappingWidthProperty().bind(super.prefWidthProperty().subtract(10));
+ desc.setTextAlignment(TextAlignment.CENTER);
+
+ rightBox.setAlignment(Pos.CENTER);
+ rightBox.getChildren().addAll(desc);
+ }
+
+ else
+ {
+ VBox details = new VBox();
+
+ ScrollPane detailsScroll = new ScrollPane(details);
+ detailsScroll.prefHeightProperty().bind(rightBox.prefHeightProperty());
+ detailsScroll.prefWidthProperty().bind(rightBox.prefWidthProperty());
+ detailsScroll.getStyleClass().remove("scroll-pane");
+
+ Text title = new Text();
+ title.setText(level.getTitle());
+ title.getStyleClass().add("t1");
+
+ Text artist = new Text();
+ artist.setText(level.getArtist());
+ artist.getStyleClass().add("t2");
+
+ Text desc = new Text();
+ desc.setText(level.desc);
+ desc.getStyleClass().add("t3");
+
+ ImageView previewView = new ImageView();
+ Image preview = level.preview;
+ previewView.setImage(preview);
+ previewView.fitWidthProperty().bind(super.prefWidthProperty().multiply(0.5));
+ previewView.setPreserveRatio(true);
+
+ FlowPane diffSelector = new FlowPane();
+ diffSelector.setAlignment(Pos.CENTER);
+ ToggleGroup diffToggleGroup = new ToggleGroup(); //allows only one to be selected at a time
+ for (Difficulty diff : level.getValidDiffList()) //adds a button for each diff
+ {
+ RadioButton temp = new RadioButton();
+ temp.getStyleClass().remove("radio-button"); //makes the buttons not look like a radio button and instead a normal button
+ temp.getStyleClass().add("button");
+ temp.setText(diff.title);
+ temp.setUserData(diff); //allows the data and text to be seperate
+ diffToggleGroup.getToggles().add(temp);
+ diffSelector.getChildren().add(temp);
+ }
+ play.disableProperty().bind(diffToggleGroup.selectedToggleProperty().isNull()); //disables play button when no difficulty is selected
+ play.setOnAction(e -> {
+ Driver.soundController.playSfx("forward");
+ Driver.setMenu(new LevelSurround(level, (Difficulty)diffToggleGroup.getSelectedToggle().getUserData(), Driver.getMenu()));
+ });
+
+ leaderboard.disableProperty().bind(diffToggleGroup.selectedToggleProperty().isNull());
+ leaderboard.setOnAction(e -> {
+ Driver.soundController.playSfx("forward");
+ Driver.setMenu(new Leaderboard(level, (Difficulty)diffToggleGroup.getSelectedToggle().getUserData(), Driver.getMenu()));
+ });
+
+
+ HBox diffBox = new HBox();
+ diffSelector.prefWidthProperty().bind(diffBox.widthProperty());
+ diffBox.getChildren().add(diffSelector);
+
+ details.setSpacing(10);
+ details.getChildren().addAll(new TextFlow(title), new TextFlow(artist), new TextFlow(desc), previewView, diffBox);
+ detailsScroll.setFitToWidth(true);
+
+ rightBox.getChildren().add(detailsScroll);
+ rightBox.setPadding(new Insets(5));
+ }
+
+ VBox rightSide = new VBox();
+ rightSide.setAlignment(Pos.CENTER_RIGHT);
+ rightSide.setSpacing(10);
+
+ HBox buttonBox = new HBox();
+ buttonBox.getChildren().addAll(leaderboard,play);
+ buttonBox.setSpacing(5);
+ buttonBox.setAlignment(Pos.CENTER_RIGHT);
+
+ rightSide.getChildren().addAll(rightBox,buttonBox);
+
+ super.setAlignment(Pos.CENTER_RIGHT);
+ super.getChildren().add(rightSide);
+ }
+}
diff --git a/src/main/java/net/sowgro/npehero/gui/LevelSelector.java b/src/main/java/net/sowgro/npehero/gui/LevelSelector.java
new file mode 100755
index 0000000..6d3442e
--- /dev/null
+++ b/src/main/java/net/sowgro/npehero/gui/LevelSelector.java
@@ -0,0 +1,98 @@
+package net.sowgro.npehero.gui;
+
+import javafx.beans.property.ReadOnlyStringWrapper;
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+import javafx.geometry.Pos;
+import javafx.scene.control.Button;
+import javafx.scene.control.TableColumn;
+import javafx.scene.control.TableView;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.Pane;
+import javafx.scene.layout.VBox;
+import net.sowgro.npehero.Driver;
+import net.sowgro.npehero.main.Level;
+import net.sowgro.npehero.main.LevelController;
+
+public class LevelSelector extends Pane
+{
+ /*
+ * this class is a layout class, most of its purpose is to place UI elements like Buttons within Panes like VBoxes.
+ * the creation of these UI elements are mostly not commented due to their repetitive and self explanatory nature.
+ * style classes are defined in the style.css file.
+ */
+ public LevelSelector()
+ {
+ //sets up table view: requires special getters, setters and constructors to work
+ TableView<Level> levels = new TableView<Level>();
+
+ TableColumn<Level,String> titleCol = new TableColumn<Level,String>("Title");
+ TableColumn<Level,String> artistCol = new TableColumn<Level,String>("Artist");
+
+ levels.getColumns().add(titleCol);
+ levels.getColumns().add(artistCol);
+
+ titleCol.setCellValueFactory(data -> new ReadOnlyStringWrapper(data.getValue().getTitle()));
+ artistCol.setCellValueFactory(data -> new ReadOnlyStringWrapper(data.getValue().getArtist()));
+
+ levels.setItems(LevelController.getValidLevelList());
+
+ levels.prefWidthProperty().bind(super.prefWidthProperty().multiply(0.25));
+ levels.prefHeightProperty().bind(super.prefHeightProperty().multiply(0.75));
+ levels.setMinWidth(300);
+
+
+ Button exit = new Button();
+ exit.setText("Back");
+ exit.setOnAction(e -> {
+ Driver.setMenu(new MainMenu());
+ Driver.soundController.playSfx("backward");
+ });
+
+ VBox leftBox = new VBox();
+ leftBox.setAlignment(Pos.CENTER_LEFT);
+ leftBox.setSpacing(10);
+ leftBox.getChildren().addAll(levels,exit);
+
+ Pane rightBox = new Pane();
+ addDetails(rightBox, levels);
+
+
+ HBox rootBox = new HBox();
+ rootBox.prefWidthProperty().bind(super.prefWidthProperty());
+ rootBox.prefHeightProperty().bind(super.prefHeightProperty());
+ rootBox.getChildren().addAll(leftBox, rightBox);
+ rootBox.setAlignment(Pos.CENTER);
+ rootBox.setSpacing(10);
+
+ levels.getStyleClass().remove("list-view");
+ levels.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Level>() { //listens for change in selected item of the list
+
+ @Override
+ public void changed(ObservableValue<? extends Level> arg0, Level arg1, Level arg2) {
+ addDetails(rightBox, levels);
+ }
+ });
+ super.getChildren().add(rootBox);
+ }
+
+ /**
+ * adds corresponding level details pane to the right side
+ * @param rightBox
+ * @param levels
+ */
+ private void addDetails(Pane rightBox, TableView<Level> levels)
+ {
+ VBox details = new LevelDetails(levels.getSelectionModel().getSelectedItem());
+ if (! rightBox.getChildren().isEmpty())
+ {
+ rightBox.getChildren().remove(0);
+ }
+ rightBox.getChildren().add(details);
+ details.prefWidthProperty().bind(super.prefWidthProperty().multiply(0.37));
+ details.prefHeightProperty().bind(super.prefHeightProperty());
+ details.maxWidthProperty().bind(super.prefWidthProperty().multiply(0.37));
+ details.maxHeightProperty().bind(super.prefHeightProperty());
+ }
+
+}
diff --git a/src/main/java/net/sowgro/npehero/gui/LevelSurround.java b/src/main/java/net/sowgro/npehero/gui/LevelSurround.java
new file mode 100755
index 0000000..08baf9e
--- /dev/null
+++ b/src/main/java/net/sowgro/npehero/gui/LevelSurround.java
@@ -0,0 +1,150 @@
+package net.sowgro.npehero.gui;
+
+import net.sowgro.npehero.Driver;
+import net.sowgro.npehero.gameplay.SongPlayer;
+import javafx.geometry.Insets;
+import javafx.geometry.Pos;
+import javafx.scene.control.Button;
+import javafx.scene.layout.AnchorPane;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.Pane;
+import javafx.scene.layout.StackPane;
+import javafx.scene.layout.VBox;
+import javafx.scene.text.Text;
+import net.sowgro.npehero.main.Difficulty;
+import net.sowgro.npehero.main.Level;
+import net.sowgro.npehero.main.ScoreController;
+
+public class LevelSurround extends Pane
+{
+ /*
+ * this class is a layout class, most of its purpose is to place UI elements like Buttons within Panes like VBoxes.
+ * the creation of these UI elements are mostly not commented due to their repetitive and self explanatory nature.
+ * style classes are defined in the style.css file.
+ */
+ public LevelSurround(Level level, Difficulty difficulty, Pane prev)
+ {
+ ScoreController sc = new ScoreController();
+ SongPlayer game = new SongPlayer(level, difficulty, prev, sc);
+
+ Button exit = new Button();
+ exit.setText("Back");
+ exit.setOnAction(e -> {
+ Driver.setMenu(prev);
+ Driver.soundController.playSfx("backward");
+ game.cancel();
+ });
+
+ HBox buttonBox = new HBox();
+ buttonBox.getChildren().addAll(exit);
+ buttonBox.setAlignment(Pos.TOP_LEFT);
+ buttonBox.setSpacing(10);
+
+ Text title = new Text();
+ title.setText(level.getTitle());
+ title.getStyleClass().add("t2");
+
+ Text artist = new Text();
+ artist.setText(level.getArtist()+" - "+difficulty.title);
+ artist.getStyleClass().add("t3");
+
+ VBox titleTextBox = new VBox();
+ titleTextBox.setAlignment(Pos.TOP_RIGHT);
+ titleTextBox.getChildren().addAll(title, artist);
+ titleTextBox.getStyleClass().add("box");
+ titleTextBox.setPadding(new Insets(10));
+
+ AnchorPane topBar = new AnchorPane();
+ topBar.getChildren().addAll(buttonBox,titleTextBox);
+ topBar.setLeftAnchor(buttonBox, 0.0);
+ topBar.setRightAnchor(titleTextBox, 0.0);
+ topBar.setTopAnchor(buttonBox, 0.0);
+ topBar.setTopAnchor(titleTextBox, 0.0);
+ topBar.setPadding(new Insets(10));
+
+
+ Text scoreLabel = new Text();
+ scoreLabel.setText("Score:");
+ scoreLabel.getStyleClass().add("t3");
+
+ Text scoreDisplay = new Text();
+ scoreDisplay.textProperty().bind(sc.scoreProperty);
+ scoreDisplay.getStyleClass().add("t1");
+
+ VBox scoreTextBox = new VBox();
+ scoreTextBox.setAlignment(Pos.BOTTOM_LEFT);
+ scoreTextBox.getChildren().addAll(scoreLabel,scoreDisplay);
+ scoreTextBox.setPadding(new Insets(10));
+ scoreTextBox.getStyleClass().add("box");
+ scoreTextBox.minWidthProperty().bind(scoreTextBox.heightProperty());
+
+ AnchorPane scoreBox = new AnchorPane();
+ scoreBox.getChildren().add(scoreTextBox);
+ scoreBox.setLeftAnchor(scoreTextBox, 0.0);
+ scoreBox.setBottomAnchor(scoreTextBox, 0.0);
+ scoreBox.setPadding(new Insets(10));
+
+ Text comboLabel = new Text();
+ comboLabel.setText("Combo:");
+ comboLabel.getStyleClass().add("t3");
+
+ Text comboDisplay = new Text();
+ comboDisplay.textProperty().bind(sc.comboProperty);
+ comboDisplay.getStyleClass().add("t1");
+
+ VBox comboTextBox = new VBox();
+ comboTextBox.setAlignment(Pos.BOTTOM_RIGHT);
+ comboTextBox.getChildren().addAll(comboLabel,comboDisplay);
+ comboTextBox.setPadding(new Insets(10));
+ comboTextBox.getStyleClass().add("box");
+ comboTextBox.minWidthProperty().bind(comboTextBox.heightProperty());
+
+ AnchorPane comboBox = new AnchorPane();
+ comboBox.getChildren().add(comboTextBox);
+ comboBox.setRightAnchor(comboTextBox, 0.0);
+ comboBox.setBottomAnchor(comboTextBox, 0.0);
+ comboBox.setPadding(new Insets(10));
+
+ game.minWidthProperty().bind(super.prefHeightProperty().multiply(0.66));
+ game.minHeightProperty().bind(super.prefHeightProperty());
+ game.getStyleClass().add("box");
+
+
+ comboBox.minWidthProperty().bind(super.prefWidthProperty().subtract(game.minWidthProperty()).divide(2));
+ scoreBox.minWidthProperty().bind(super.prefWidthProperty().subtract(game.minWidthProperty()).divide(2));
+
+ HBox centerBox = new HBox();
+ centerBox.getChildren().addAll(comboBox, game, scoreBox);
+ centerBox.setAlignment(Pos.BOTTOM_CENTER);
+
+ StackPane root = new StackPane();
+ root.getChildren().addAll(centerBox, topBar);
+
+ super.getChildren().add(root);
+ root.prefWidthProperty().bind(super.prefWidthProperty());
+ root.prefHeightProperty().bind(super.prefHeightProperty());
+
+ //for debug menu
+ Button addScore = new Button();
+ addScore.setText(level.getTitle() + " addscore");
+ addScore.setOnAction(e -> sc.setScore(sc.getScore()+1));
+// Driver.debug.addButton(addScore);
+
+ Button addCombo = new Button();
+ addCombo.setText(level.getTitle() + " addcombo");
+ addCombo.setOnAction(e -> sc.setCombo(sc.getCombo()+1));
+// Driver.debug.addButton(addCombo);
+
+ Button printD = new Button();
+ printD.setText(level.getTitle() + " print debug");
+ printD.setOnAction(e -> sc.print());
+// Driver.debug.addButton(printD);
+
+ Button testfinish = new Button();
+ testfinish.setText(level.getTitle() + "launch game end");
+ testfinish.setOnAction(e -> Driver.setMenu(new GameOver(level, difficulty, prev, sc.getScore())));
+// Driver.debug.addButton(testfinish);
+
+ game.start();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/net/sowgro/npehero/gui/MainMenu.java b/src/main/java/net/sowgro/npehero/gui/MainMenu.java
new file mode 100755
index 0000000..bb1970f
--- /dev/null
+++ b/src/main/java/net/sowgro/npehero/gui/MainMenu.java
@@ -0,0 +1,70 @@
+package net.sowgro.npehero.gui;
+
+import javafx.geometry.Pos;
+import javafx.scene.control.Button;
+import javafx.scene.effect.BlurType;
+import javafx.scene.effect.DropShadow;
+import javafx.scene.layout.Pane;
+import javafx.scene.layout.VBox;
+import javafx.scene.paint.Color;
+import javafx.scene.text.Text;
+import net.sowgro.npehero.Driver;
+
+
+public class MainMenu extends Pane
+{
+ /*
+ * this class is a layout class, most of its purpose is to place UI elements like Buttons within Panes like VBoxes.
+ * the creation of these UI elements are mostly not commented due to their repetitive and self explanatory nature.
+ * style classes are defined in the style.css file.
+ */
+ public MainMenu()
+ {
+ DropShadow dropShadow = new DropShadow();
+ dropShadow.setRadius(50.0);
+ dropShadow.setColor(Color.WHITE);
+ dropShadow.setBlurType(BlurType.GAUSSIAN);
+
+ Text title = new Text();
+ title.setText("NPE Hero");
+ title.getStyleClass().add("t0");
+ title.setEffect(dropShadow);
+
+ Button play = new Button();
+ play.setText("Play");
+ play.setOnAction(e -> {
+ Driver.setMenu(new LevelSelector());
+ Driver.soundController.playSfx("forward");
+ });
+
+ Button settings = new Button();
+ settings.setText("Settings");
+ settings.setOnAction(e -> {Driver.setMenu(new Settings());
+ Driver.soundController.playSfx("forward");
+ });
+
+ Button exit = new Button();
+ exit.setText("Quit");
+ exit.setOnAction(e -> {Driver.quit();
+ Driver.soundController.playSfx("backward");
+ });
+
+ VBox buttonBox = new VBox();
+ buttonBox.getChildren().addAll(play, settings, exit);
+ buttonBox.setAlignment(Pos.CENTER);
+ buttonBox.setSpacing(10);
+
+ VBox centerBox = new VBox();
+ centerBox.setAlignment(Pos.CENTER);
+ centerBox.getChildren().addAll(title, buttonBox);
+ centerBox.setSpacing(10);
+
+ VBox rootBox = new VBox();
+ rootBox.prefWidthProperty().bind(super.prefWidthProperty());
+ rootBox.prefHeightProperty().bind(super.prefHeightProperty());
+ rootBox.setAlignment(Pos.CENTER);
+ rootBox.getChildren().add(centerBox);
+
+ super.getChildren().add(rootBox);
+ }
+}
diff --git a/src/main/java/net/sowgro/npehero/gui/Settings.java b/src/main/java/net/sowgro/npehero/gui/Settings.java
new file mode 100755
index 0000000..882eb86
--- /dev/null
+++ b/src/main/java/net/sowgro/npehero/gui/Settings.java
@@ -0,0 +1,131 @@
+package net.sowgro.npehero.gui;
+
+import javafx.geometry.Insets;
+import javafx.geometry.Pos;
+import javafx.scene.control.Button;
+import javafx.scene.control.Slider;
+import javafx.scene.control.ToggleButton;
+import javafx.scene.layout.BorderPane;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.Pane;
+import javafx.scene.layout.VBox;
+import javafx.scene.text.Text;
+import net.sowgro.npehero.Driver;
+import net.sowgro.npehero.devmenu.LevelList;
+
+public class Settings extends Pane
+{
+ /*
+ * this class is a layout class, most of its purpose is to place UI elements like Buttons within Panes like VBoxes.
+ * the creation of these UI elements are mostly not commented due to their repetitive and self explanatory nature.
+ * style classes are defined in the style.css file.
+ */
+ public Settings()
+ {
+ Text musicText = new Text();
+ musicText.setText("Music Volume");
+ musicText.getStyleClass().add("t3");
+
+ Slider musicSlider = new Slider();
+ musicSlider.valueProperty().bindBidirectional(Driver.settingsController.musicVol);
+ musicSlider.setMin(0.0);
+ musicSlider.setMax(1.0);
+
+ VBox musicBox = new VBox();
+ musicBox.getChildren().addAll(musicText, musicSlider);
+ musicBox.getStyleClass().add("box");
+ musicBox.setPadding(new Insets(10));
+
+
+ Text SFXText = new Text();
+ SFXText.setText("Sound Effects Volume");
+ SFXText.getStyleClass().add("t3");
+
+ Slider SFXSlider = new Slider();
+ SFXSlider.valueProperty().bindBidirectional(Driver.settingsController.effectsVol);
+ SFXSlider.setMin(0.0);
+ SFXSlider.setMax(1.0);
+
+ VBox SFXBox = new VBox();
+ SFXBox.getChildren().addAll(SFXText, SFXSlider);
+ SFXBox.getStyleClass().add("box");
+ SFXBox.setPadding(new Insets(10));
+
+
+ Text fullText = new Text();
+ fullText.setText("Fullscreen mode");
+ fullText.getStyleClass().add("t3");
+
+ Button fullscreen = new Button();
+ fullscreen.setText("Toggle (F11)");
+ fullscreen.getStyleClass().remove("toggle-button");
+ fullscreen.getStyleClass().add("button");
+ fullscreen.setOnAction(e -> {
+ Driver.soundController.playSfx("forward");
+ Driver.primaryStage.setFullScreen(!Driver.primaryStage.isFullScreen());
+ });
+
+ VBox fullBox = new VBox();
+ fullBox.getChildren().addAll(fullText,fullscreen);
+ fullBox.getStyleClass().add("box");
+ fullBox.setPadding(new Insets(10));
+
+
+ Text devLabel = new Text("Advanced");
+ devLabel.getStyleClass().add("t3");
+
+ Button levelEdit = new Button("Level Utility");
+ levelEdit.setOnAction(e -> {
+ Driver.soundController.playSfx("forward");
+ new LevelList();
+ });
+
+ Button devMenu = new Button();
+ devMenu.setText("Debug Menu");
+ devMenu.setOnAction(e -> {
+ Driver.soundController.playSfx("forward");
+// Driver.debug.show();
+ });
+
+ VBox devBox = new VBox();
+ devBox.getStyleClass().add("box");
+ devBox.getChildren().addAll(devLabel,levelEdit,devMenu);
+ devBox.setVisible(false);
+ devBox.setManaged(false);
+ devBox.setPadding(new Insets(10));
+
+ ToggleButton advanced = new ToggleButton("Advanced");
+ advanced.getStyleClass().remove("toggle-button");
+ advanced.getStyleClass().add("button");
+ advanced.selectedProperty().bindBidirectional(devBox.managedProperty());
+ advanced.selectedProperty().bindBidirectional(devBox.visibleProperty());
+
+ Button exit = new Button();
+ exit.setText("Back");
+ exit.setOnAction(e -> {
+ Driver.settingsController.write();
+ Driver.soundController.playSfx("backward");
+ Driver.setMenu(new MainMenu());
+ });
+
+ BorderPane buttonBox = new BorderPane();
+ buttonBox.setLeft(exit);
+ buttonBox.setRight(advanced);
+
+
+ VBox options = new VBox();
+ options.setSpacing(10);
+ options.setAlignment(Pos.CENTER);
+ options.getChildren().addAll(musicBox,SFXBox,fullBox,devBox,buttonBox);
+ options.maxWidthProperty().bind(super.prefWidthProperty().multiply(0.25));
+ options.setMinWidth(400);
+ options.prefHeightProperty().bind(super.prefHeightProperty());
+
+ HBox rootBox = new HBox();
+ rootBox.prefWidthProperty().bind(super.prefWidthProperty());
+ rootBox.prefHeightProperty().bind(super.prefHeightProperty());
+ rootBox.getChildren().add(options);
+ rootBox.setAlignment(Pos.CENTER);
+ super.getChildren().add(rootBox);
+ }
+}