diff options
Diffstat (limited to 'src/main/java/net/sowgro/npehero/gui')
-rwxr-xr-x | src/main/java/net/sowgro/npehero/gui/GameOver.java | 124 | ||||
-rwxr-xr-x | src/main/java/net/sowgro/npehero/gui/Leaderboard.java | 72 | ||||
-rwxr-xr-x | src/main/java/net/sowgro/npehero/gui/LevelDetails.java | 137 | ||||
-rwxr-xr-x | src/main/java/net/sowgro/npehero/gui/LevelSelector.java | 98 | ||||
-rwxr-xr-x | src/main/java/net/sowgro/npehero/gui/LevelSurround.java | 150 | ||||
-rwxr-xr-x | src/main/java/net/sowgro/npehero/gui/MainMenu.java | 70 | ||||
-rwxr-xr-x | src/main/java/net/sowgro/npehero/gui/Settings.java | 131 |
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); + } +} |