From 81061bd22ddf54690107b2e658d46e746935154e Mon Sep 17 00:00:00 2001 From: jamesmosey Date: Tue, 7 Apr 2026 21:19:44 +0100 Subject: [PATCH 1/3] feat: added option to select difficulty in main menu --- .../main/java/intermediate/MenuSample.java | 2 +- .../kotlin/com/almasb/fxgl/app/Settings.kt | 7 +++- .../almasb/fxgl/app/scene/FXGLDefaultMenu.kt | 31 +++++++++++++++++ .../resources/fxglassets/ui/css/fxgl_dark.css | 34 +++++++++++++++++++ 4 files changed, 72 insertions(+), 2 deletions(-) diff --git a/fxgl-samples/src/main/java/intermediate/MenuSample.java b/fxgl-samples/src/main/java/intermediate/MenuSample.java index 1ad3dab48d..05155e1a3e 100644 --- a/fxgl-samples/src/main/java/intermediate/MenuSample.java +++ b/fxgl-samples/src/main/java/intermediate/MenuSample.java @@ -29,7 +29,7 @@ protected void initSettings(GameSettings settings) { settings.setMainMenuEnabled(true); settings.setGameMenuEnabled(true); settings.setFullScreenAllowed(true); - settings.setEnabledMenuItems(EnumSet.of(MenuItem.EXTRA)); + settings.setEnabledMenuItems(EnumSet.of(MenuItem.DIFFICULTY)); settings.getCredits().addAll(Arrays.asList( "Short Name - Lead Programmer", "LongLongLongLongLongLongLong Name - Programmer", diff --git a/fxgl/src/main/kotlin/com/almasb/fxgl/app/Settings.kt b/fxgl/src/main/kotlin/com/almasb/fxgl/app/Settings.kt index cccb706595..04857da02e 100644 --- a/fxgl/src/main/kotlin/com/almasb/fxgl/app/Settings.kt +++ b/fxgl/src/main/kotlin/com/almasb/fxgl/app/Settings.kt @@ -60,7 +60,12 @@ enum class MenuItem { /** * Enables ONLINE (multiplayer). */ - ONLINE + ONLINE, + + /** + * Enables DIFFICULTY -> EASY, MEDIUM, HARD, CUSTOM + */ + DIFFICULTY, } /** diff --git a/fxgl/src/main/kotlin/com/almasb/fxgl/app/scene/FXGLDefaultMenu.kt b/fxgl/src/main/kotlin/com/almasb/fxgl/app/scene/FXGLDefaultMenu.kt index 229818d73f..b1e2d96390 100644 --- a/fxgl/src/main/kotlin/com/almasb/fxgl/app/scene/FXGLDefaultMenu.kt +++ b/fxgl/src/main/kotlin/com/almasb/fxgl/app/scene/FXGLDefaultMenu.kt @@ -16,6 +16,7 @@ import com.almasb.fxgl.dsl.* import com.almasb.fxgl.dsl.FXGL.Companion.animationBuilder import com.almasb.fxgl.dsl.FXGL.Companion.random import com.almasb.fxgl.dsl.FXGL.Companion.texture +import com.almasb.fxgl.gameplay.GameDifficulty import com.almasb.fxgl.input.Input import com.almasb.fxgl.input.InputModifier import com.almasb.fxgl.input.Trigger @@ -258,6 +259,12 @@ open class FXGLDefaultMenu(type: MenuType) : FXGLMenu(type) { itemOptions.setChild(createOptionsMenu()) box.add(itemOptions) + if (enabledItems.contains(MenuItem.DIFFICULTY)) { + val itemDifficulty = MenuButton("menu.difficulty") + itemDifficulty.setMenuContent({ createContentDifficulty() }) + box.add(itemDifficulty) + } + if (enabledItems.contains(MenuItem.EXTRA)) { val itemExtra = MenuButton("menu.extra") itemExtra.setChild(createExtraMenu()) @@ -316,6 +323,30 @@ open class FXGLDefaultMenu(type: MenuType) : FXGLMenu(type) { return box } + private fun createContentDifficulty(): MenuContent { + val difficultyBox = getUIFactoryService().newChoiceBox( + FXCollections.observableArrayList(GameDifficulty.entries) + ) + + difficultyBox.styleClass.add("fxgl-difficulty-menu-choicebox") + + difficultyBox.value = getSettings().gameDifficulty + getSettings().gameDifficultyProperty().bindBidirectional(difficultyBox.valueProperty()) + + difficultyBox.valueProperty().addListener { _, _, _ -> + switchMenuContentTo(EMPTY) + } + + val row = HBox( + 25.0, + getUIFactoryService().newText(localizedStringProperty("menu.difficulty").concat(":")), + difficultyBox + ) + row.alignment = Pos.CENTER + + return MenuContent(row) + } + private fun createOptionsMenu(): MenuBox { log.debug("createOptionsMenu()") diff --git a/fxgl/src/main/resources/fxglassets/ui/css/fxgl_dark.css b/fxgl/src/main/resources/fxglassets/ui/css/fxgl_dark.css index 2f1ba79f59..d41b184230 100644 --- a/fxgl/src/main/resources/fxglassets/ui/css/fxgl_dark.css +++ b/fxgl/src/main/resources/fxglassets/ui/css/fxgl_dark.css @@ -309,6 +309,40 @@ } +/* + * Styling for the difficulty choice box + */ +.fxgl-difficulty-menu-choicebox { + -fx-background-color: rgba(0, 0, 0, 0.35); + -fx-background-radius: 4; + -fx-background-insets: 0; + -fx-border-color: rgba(255, 255, 255, 0.25); + -fx-border-radius: 4; + -fx-font-size: 18px; +} + +.fxgl-difficulty-menu-choicebox:hover, +.fxgl-difficulty-menu-choicebox:focused, +.fxgl-difficulty-menu-choicebox:focused:hover, +.fxgl-difficulty-menu-choicebox:armed { + -fx-background-color: rgba(0, 0, 0, 0.45); + -fx-background-radius: 4; + -fx-background-insets: 0; + -fx-border-color: rgba(255, 255, 255, 0.35); +} + +.fxgl-difficulty-menu-choicebox .label { + -fx-text-fill: white; + -fx-background-color: transparent; +} + +.fxgl-difficulty-menu-choicebox .context-menu { + -fx-background-color: rgba(20, 20, 20, 0.9); +} + +.fxgl-difficulty-menu-choicebox .menu-item:focused { + -fx-background-color: rgba(255, 255, 255, 0.15); +} /* From c23efdcc4e9f4a6f38c1aa51890951fcbee8b3ed Mon Sep 17 00:00:00 2001 From: jamesmosey Date: Wed, 8 Apr 2026 18:48:07 +0100 Subject: [PATCH 2/3] feat: added option to select difficulty in main menu --- .../main/java/intermediate/MenuSample.java | 2 +- .../almasb/fxgl/app/scene/FXGLDefaultMenu.kt | 56 ++++++++++--------- .../resources/fxglassets/ui/css/fxgl_dark.css | 16 +++--- 3 files changed, 40 insertions(+), 34 deletions(-) diff --git a/fxgl-samples/src/main/java/intermediate/MenuSample.java b/fxgl-samples/src/main/java/intermediate/MenuSample.java index 05155e1a3e..db7e39a891 100644 --- a/fxgl-samples/src/main/java/intermediate/MenuSample.java +++ b/fxgl-samples/src/main/java/intermediate/MenuSample.java @@ -29,7 +29,7 @@ protected void initSettings(GameSettings settings) { settings.setMainMenuEnabled(true); settings.setGameMenuEnabled(true); settings.setFullScreenAllowed(true); - settings.setEnabledMenuItems(EnumSet.of(MenuItem.DIFFICULTY)); + settings.setEnabledMenuItems(EnumSet.of(MenuItem.DIFFICULTY, MenuItem.EXTRA)); settings.getCredits().addAll(Arrays.asList( "Short Name - Lead Programmer", "LongLongLongLongLongLongLong Name - Programmer", diff --git a/fxgl/src/main/kotlin/com/almasb/fxgl/app/scene/FXGLDefaultMenu.kt b/fxgl/src/main/kotlin/com/almasb/fxgl/app/scene/FXGLDefaultMenu.kt index b1e2d96390..9cf2710c3c 100644 --- a/fxgl/src/main/kotlin/com/almasb/fxgl/app/scene/FXGLDefaultMenu.kt +++ b/fxgl/src/main/kotlin/com/almasb/fxgl/app/scene/FXGLDefaultMenu.kt @@ -261,7 +261,7 @@ open class FXGLDefaultMenu(type: MenuType) : FXGLMenu(type) { if (enabledItems.contains(MenuItem.DIFFICULTY)) { val itemDifficulty = MenuButton("menu.difficulty") - itemDifficulty.setMenuContent({ createContentDifficulty() }) + itemDifficulty.setMenuContent({ createDifficultyMenu() }) box.add(itemDifficulty) } @@ -304,6 +304,12 @@ open class FXGLDefaultMenu(type: MenuType) : FXGLMenu(type) { itemOptions.setChild(createOptionsMenu()) box.add(itemOptions) + if (enabledItems.contains(MenuItem.DIFFICULTY)) { + val itemDifficulty = MenuButton("menu.difficulty") + itemDifficulty.setMenuContent({ createDifficultyMenu() }) + box.add(itemDifficulty) + } + if (enabledItems.contains(MenuItem.EXTRA)) { val itemExtra = MenuButton("menu.extra") itemExtra.setChild(createExtraMenu()) @@ -323,30 +329,6 @@ open class FXGLDefaultMenu(type: MenuType) : FXGLMenu(type) { return box } - private fun createContentDifficulty(): MenuContent { - val difficultyBox = getUIFactoryService().newChoiceBox( - FXCollections.observableArrayList(GameDifficulty.entries) - ) - - difficultyBox.styleClass.add("fxgl-difficulty-menu-choicebox") - - difficultyBox.value = getSettings().gameDifficulty - getSettings().gameDifficultyProperty().bindBidirectional(difficultyBox.valueProperty()) - - difficultyBox.valueProperty().addListener { _, _, _ -> - switchMenuContentTo(EMPTY) - } - - val row = HBox( - 25.0, - getUIFactoryService().newText(localizedStringProperty("menu.difficulty").concat(":")), - difficultyBox - ) - row.alignment = Pos.CENTER - - return MenuContent(row) - } - private fun createOptionsMenu(): MenuBox { log.debug("createOptionsMenu()") @@ -374,6 +356,30 @@ open class FXGLDefaultMenu(type: MenuType) : FXGLMenu(type) { return MenuBox(itemGameplay, itemControls, itemVideo, itemAudio, btnRestore) } + private fun createDifficultyMenu(): MenuContent { + val difficultyBox = getUIFactoryService().newChoiceBox( + FXCollections.observableArrayList(GameDifficulty.entries) + ) + + difficultyBox.styleClass.add("fxgl-difficulty-choice-box") + + difficultyBox.value = getSettings().gameDifficulty + getSettings().gameDifficultyProperty().bindBidirectional(difficultyBox.valueProperty()) + + difficultyBox.valueProperty().addListener { _, _, _ -> + switchMenuContentTo(EMPTY) + } + + val row = HBox( + 25.0, + getUIFactoryService().newText(localizedStringProperty("menu.difficulty").concat(":")), + difficultyBox + ) + row.alignment = Pos.CENTER + + return MenuContent(row) + } + private fun createExtraMenu(): MenuBox { log.debug("createExtraMenu()") diff --git a/fxgl/src/main/resources/fxglassets/ui/css/fxgl_dark.css b/fxgl/src/main/resources/fxglassets/ui/css/fxgl_dark.css index d41b184230..11d3b68394 100644 --- a/fxgl/src/main/resources/fxglassets/ui/css/fxgl_dark.css +++ b/fxgl/src/main/resources/fxglassets/ui/css/fxgl_dark.css @@ -312,7 +312,7 @@ /* * Styling for the difficulty choice box */ -.fxgl-difficulty-menu-choicebox { +.fxgl-difficulty-choice-box { -fx-background-color: rgba(0, 0, 0, 0.35); -fx-background-radius: 4; -fx-background-insets: 0; @@ -321,26 +321,26 @@ -fx-font-size: 18px; } -.fxgl-difficulty-menu-choicebox:hover, -.fxgl-difficulty-menu-choicebox:focused, -.fxgl-difficulty-menu-choicebox:focused:hover, -.fxgl-difficulty-menu-choicebox:armed { +.fxgl-difficulty-choice-box:hover, +.fxgl-difficulty-choice-box:focused, +.fxgl-difficulty-choice-box:focused:hover, +.fxgl-difficulty-choice-box:armed { -fx-background-color: rgba(0, 0, 0, 0.45); -fx-background-radius: 4; -fx-background-insets: 0; -fx-border-color: rgba(255, 255, 255, 0.35); } -.fxgl-difficulty-menu-choicebox .label { +.fxgl-difficulty-choice-box .label { -fx-text-fill: white; -fx-background-color: transparent; } -.fxgl-difficulty-menu-choicebox .context-menu { +.fxgl-difficulty-choice-box .context-menu { -fx-background-color: rgba(20, 20, 20, 0.9); } -.fxgl-difficulty-menu-choicebox .menu-item:focused { +.fxgl-difficulty-choice-box .menu-item:focused { -fx-background-color: rgba(255, 255, 255, 0.15); } From 24c10bc5dd42a348132416deeb8a13b21c225d8c Mon Sep 17 00:00:00 2001 From: jamesmosey Date: Wed, 8 Apr 2026 18:53:21 +0100 Subject: [PATCH 3/3] feat: added option to select difficulty in main menu --- fxgl/src/main/kotlin/com/almasb/fxgl/app/Settings.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fxgl/src/main/kotlin/com/almasb/fxgl/app/Settings.kt b/fxgl/src/main/kotlin/com/almasb/fxgl/app/Settings.kt index 04857da02e..bf3ae00e21 100644 --- a/fxgl/src/main/kotlin/com/almasb/fxgl/app/Settings.kt +++ b/fxgl/src/main/kotlin/com/almasb/fxgl/app/Settings.kt @@ -63,7 +63,7 @@ enum class MenuItem { ONLINE, /** - * Enables DIFFICULTY -> EASY, MEDIUM, HARD, CUSTOM + * Enables DIFFICULTY -> EASY, MEDIUM, HARD, NIGHTMARE */ DIFFICULTY, }