From 50efd9eebeaebbec4f784d71e5a81185693ad40f Mon Sep 17 00:00:00 2001 From: Maaack Date: Thu, 30 Nov 2023 17:05:58 -0800 Subject: [PATCH 1/6] Adds resolution options to video menu. --- .../OptionsMenu/Video/VideoOptionsMenu.gd | 47 ++++++++++++++++--- .../OptionsMenu/Video/VideoOptionsMenu.tscn | 17 ++++++- App/Scripts/AppSettings.gd | 12 ++++- 3 files changed, 68 insertions(+), 8 deletions(-) diff --git a/App/Scenes/Menus/OptionsMenu/Video/VideoOptionsMenu.gd b/App/Scenes/Menus/OptionsMenu/Video/VideoOptionsMenu.gd index 48d5618..1dca5b5 100644 --- a/App/Scenes/Menus/OptionsMenu/Video/VideoOptionsMenu.gd +++ b/App/Scenes/Menus/OptionsMenu/Video/VideoOptionsMenu.gd @@ -1,16 +1,51 @@ extends Control -const FULLSCREEN_ENABLED = 'FullscreenEnabled' -const VIDEO_SECTION = 'VideoSettings' +@export var resolutions_array : Array[Vector2i] = [ + Vector2i(640, 360), + Vector2i(960, 540), + Vector2i(1024, 576), + Vector2i(1280, 720), + Vector2i(1600, 900), + Vector2i(1920, 1080), + Vector2i(2048, 1152), + Vector2i(2560, 1440), + Vector2i(3200, 1800), +] -@onready var fullscreen_button = $VBoxContainer/FullscreenControl/FullscreenButton +@onready var fullscreen_button = %FullscreenButton +@onready var resolution_options = %ResolutionOptions +@onready var user_resolutions_array : Array[Vector2i] = resolutions_array.duplicate() + +func _preselect_resolution(window : Window): + var current_resolution : Vector2i = window.size + if not current_resolution in user_resolutions_array: + user_resolutions_array.append(current_resolution) + user_resolutions_array.sort() + resolution_options.clear() + for resolution in user_resolutions_array: + var resolution_string : String = "%d x %d" % [resolution.x, resolution.y] + resolution_options.add_item(resolution_string) + if not resolution in resolutions_array: + var last_index : int = resolution_options.item_count - 1 + resolution_options.set_item_disabled(last_index, true) + var current_resolution_index : int = user_resolutions_array.find(current_resolution) + resolution_options.select(current_resolution_index) func _update_ui(): - fullscreen_button.button_pressed = ((get_window().mode == Window.MODE_EXCLUSIVE_FULLSCREEN) or (get_window().mode == Window.MODE_FULLSCREEN)) + var window : Window = get_window() + var current_resolution : Vector2i = window.size + fullscreen_button.button_pressed = AppSettings.is_fullscreen(window) + _preselect_resolution(window) func _ready(): _update_ui() + var window : Window = get_window() + window.connect("size_changed", _preselect_resolution.bind(window)) -func _on_FullscreenButton_toggled(button_pressed): - AppSettings.set_fullscreen_enabled(button_pressed, get_window()) +func _on_fullscreen_button_toggled(toggled_on): + AppSettings.set_fullscreen_enabled(toggled_on, get_window()) +func _on_resolution_options_item_selected(index): + if index < 0 or index >= user_resolutions_array.size(): + return + AppSettings.set_resolution(user_resolutions_array[index], get_window()) diff --git a/App/Scenes/Menus/OptionsMenu/Video/VideoOptionsMenu.tscn b/App/Scenes/Menus/OptionsMenu/Video/VideoOptionsMenu.tscn index e573a0a..83a9f84 100644 --- a/App/Scenes/Menus/OptionsMenu/Video/VideoOptionsMenu.tscn +++ b/App/Scenes/Menus/OptionsMenu/Video/VideoOptionsMenu.tscn @@ -29,6 +29,21 @@ size_flags_horizontal = 3 text = "Fullscreen :" [node name="FullscreenButton" type="CheckButton" parent="VBoxContainer/FullscreenControl"] +unique_name_in_owner = true layout_mode = 2 -[connection signal="toggled" from="VBoxContainer/FullscreenControl/FullscreenButton" to="." method="_on_FullscreenButton_toggled"] +[node name="ResolutionControl" type="HBoxContainer" parent="VBoxContainer"] +custom_minimum_size = Vector2(0, 40) +layout_mode = 2 + +[node name="ResolutionLabel" type="Label" parent="VBoxContainer/ResolutionControl"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Resolution :" + +[node name="ResolutionOptions" type="OptionButton" parent="VBoxContainer/ResolutionControl"] +unique_name_in_owner = true +layout_mode = 2 + +[connection signal="toggled" from="VBoxContainer/FullscreenControl/FullscreenButton" to="." method="_on_fullscreen_button_toggled"] +[connection signal="item_selected" from="VBoxContainer/ResolutionControl/ResolutionOptions" to="." method="_on_resolution_options_item_selected"] diff --git a/App/Scripts/AppSettings.gd b/App/Scripts/AppSettings.gd index a4200bb..7d9a983 100644 --- a/App/Scripts/AppSettings.gd +++ b/App/Scripts/AppSettings.gd @@ -6,6 +6,7 @@ const AUDIO_SECTION = 'AudioSettings' const VIDEO_SECTION = 'VideoSettings' const FULLSCREEN_ENABLED = 'FullscreenEnabled' +const SCREEN_RESOLUTION = 'ScreenResolution' const MUTE_SETTING = 'Mute' const MASTER_BUS_INDEX = 0 @@ -114,6 +115,12 @@ static func set_fullscreen_enabled(value : bool, window : Window) -> void: window.mode = Window.MODE_EXCLUSIVE_FULLSCREEN if (value) else Window.MODE_WINDOWED Config.set_config(VIDEO_SECTION, FULLSCREEN_ENABLED, value) +static func set_resolution(value : Vector2i, window : Window) -> void: + if value.x == 0 or value.y == 0: + return + window.size = value + Config.set_config(VIDEO_SECTION, SCREEN_RESOLUTION, value) + static func reset_video_config(window : Window) -> void: Config.set_config(VIDEO_SECTION, FULLSCREEN_ENABLED, ((window.mode == Window.MODE_EXCLUSIVE_FULLSCREEN) or (window.mode == Window.MODE_FULLSCREEN))) @@ -121,9 +128,12 @@ static func is_fullscreen(window : Window) -> bool: return (window.mode == Window.MODE_EXCLUSIVE_FULLSCREEN) or (window.mode == Window.MODE_FULLSCREEN) static func set_video_from_config(window : Window) -> void: - var fullscreen_enabled : bool = (window.mode == Window.MODE_EXCLUSIVE_FULLSCREEN) or (window.mode == Window.MODE_FULLSCREEN) + var fullscreen_enabled : bool = is_fullscreen(window) + var current_resolution : Vector2i = window.size fullscreen_enabled = Config.get_config(VIDEO_SECTION, FULLSCREEN_ENABLED, fullscreen_enabled) + current_resolution = Config.get_config(VIDEO_SECTION, SCREEN_RESOLUTION, current_resolution) window.mode = Window.MODE_EXCLUSIVE_FULLSCREEN if (fullscreen_enabled) else Window.MODE_WINDOWED + window.size = current_resolution # All From 4f075f5eca1f480aea87c890c078a184a5a749e1 Mon Sep 17 00:00:00 2001 From: Maaack Date: Thu, 30 Nov 2023 17:06:47 -0800 Subject: [PATCH 2/6] Sets project resolution to a standard 16:9. --- project.godot | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/project.godot b/project.godot index cc4a27d..39eadeb 100644 --- a/project.godot +++ b/project.godot @@ -20,6 +20,11 @@ config/icon="res://icon.png" InGameMenuController="*res://App/Scripts/InGameMenuController.gd" SceneLoader="*res://App/Scripts/SceneLoader.gd" +[display] + +window/size/viewport_width=1280 +window/size/viewport_height=720 + [gui] theme/custom="res://App/Themes/BaseTheme.tres" From bb0d188352d93d40c92bb262a42c4e7b64b294b8 Mon Sep 17 00:00:00 2001 From: Maaack Date: Thu, 30 Nov 2023 17:07:55 -0800 Subject: [PATCH 3/6] Updates credits spaceing for resolution. --- App/Scenes/Credits/Credits.tscn | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/App/Scenes/Credits/Credits.tscn b/App/Scenes/Credits/Credits.tscn index 691cecd..2c1a773 100644 --- a/App/Scenes/Credits/Credits.tscn +++ b/App/Scenes/Credits/Credits.tscn @@ -29,11 +29,11 @@ layout_mode = 2 size_flags_horizontal = 3 [node name="HeaderSpace" type="Control" parent="ScrollContainer/VBoxContainer"] -custom_minimum_size = Vector2(0, 648) +custom_minimum_size = Vector2(0, 720) layout_mode = 2 [node name="RichTextLabel" type="RichTextLabel" parent="ScrollContainer/VBoxContainer"] -custom_minimum_size = Vector2(1152, 0) +custom_minimum_size = Vector2(1280, 0) layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 5 @@ -60,7 +60,7 @@ fit_content = true scroll_active = false [node name="FooterSpace" type="Control" parent="ScrollContainer/VBoxContainer"] -custom_minimum_size = Vector2(0, 648) +custom_minimum_size = Vector2(0, 720) layout_mode = 2 [node name="ScrollResetTimer" type="Timer" parent="."] From d58fc6e8f673dae54cdb6cf67210bb74bd509e7b Mon Sep 17 00:00:00 2001 From: Maaack Date: Thu, 30 Nov 2023 18:52:53 -0800 Subject: [PATCH 4/6] Disables resolution selection for web. --- App/Scenes/Menus/OptionsMenu/Video/VideoOptionsMenu.gd | 3 +++ 1 file changed, 3 insertions(+) diff --git a/App/Scenes/Menus/OptionsMenu/Video/VideoOptionsMenu.gd b/App/Scenes/Menus/OptionsMenu/Video/VideoOptionsMenu.gd index 1dca5b5..bddb571 100644 --- a/App/Scenes/Menus/OptionsMenu/Video/VideoOptionsMenu.gd +++ b/App/Scenes/Menus/OptionsMenu/Video/VideoOptionsMenu.gd @@ -36,6 +36,9 @@ func _update_ui(): var current_resolution : Vector2i = window.size fullscreen_button.button_pressed = AppSettings.is_fullscreen(window) _preselect_resolution(window) + if OS.has_feature("web"): + resolution_options.disabled = true + resolution_options.tooltip_text = "Disabled for web" func _ready(): _update_ui() From 50ca20390b311960b6cb08fbc28f901a7934e1f9 Mon Sep 17 00:00:00 2001 From: Maaack Date: Thu, 30 Nov 2023 20:09:08 -0800 Subject: [PATCH 5/6] Disables changing resolution on web or fullscreen. --- .../OptionsMenu/Video/VideoOptionsMenu.gd | 24 +++++++++++++------ App/Scripts/AppSettings.gd | 15 ++++++++---- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/App/Scenes/Menus/OptionsMenu/Video/VideoOptionsMenu.gd b/App/Scenes/Menus/OptionsMenu/Video/VideoOptionsMenu.gd index bddb571..54917cd 100644 --- a/App/Scenes/Menus/OptionsMenu/Video/VideoOptionsMenu.gd +++ b/App/Scenes/Menus/OptionsMenu/Video/VideoOptionsMenu.gd @@ -31,22 +31,32 @@ func _preselect_resolution(window : Window): var current_resolution_index : int = user_resolutions_array.find(current_resolution) resolution_options.select(current_resolution_index) -func _update_ui(): - var window : Window = get_window() - var current_resolution : Vector2i = window.size - fullscreen_button.button_pressed = AppSettings.is_fullscreen(window) - _preselect_resolution(window) +func _update_resolution_options_enabled(window : Window): if OS.has_feature("web"): resolution_options.disabled = true resolution_options.tooltip_text = "Disabled for web" + elif AppSettings.is_fullscreen(window): + resolution_options.disabled = true + resolution_options.tooltip_text = "Disabled for fullscreen" + else: + resolution_options.disabled = false + resolution_options.tooltip_text = "Select a screen size" + +func _update_ui(window : Window): + var current_resolution : Vector2i = window.size + fullscreen_button.button_pressed = AppSettings.is_fullscreen(window) + _preselect_resolution(window) + _update_resolution_options_enabled(window) func _ready(): - _update_ui() var window : Window = get_window() + _update_ui(window) window.connect("size_changed", _preselect_resolution.bind(window)) func _on_fullscreen_button_toggled(toggled_on): - AppSettings.set_fullscreen_enabled(toggled_on, get_window()) + var window : Window = get_window() + AppSettings.set_fullscreen_enabled(toggled_on, window) + _update_resolution_options_enabled(window) func _on_resolution_options_item_selected(index): if index < 0 or index >= user_resolutions_array.size(): diff --git a/App/Scripts/AppSettings.gd b/App/Scripts/AppSettings.gd index 7d9a983..01cbdbd 100644 --- a/App/Scripts/AppSettings.gd +++ b/App/Scripts/AppSettings.gd @@ -127,14 +127,19 @@ static func reset_video_config(window : Window) -> void: static func is_fullscreen(window : Window) -> bool: return (window.mode == Window.MODE_EXCLUSIVE_FULLSCREEN) or (window.mode == Window.MODE_FULLSCREEN) -static func set_video_from_config(window : Window) -> void: - var fullscreen_enabled : bool = is_fullscreen(window) +static func get_resolution(window : Window) -> Vector2i: var current_resolution : Vector2i = window.size - fullscreen_enabled = Config.get_config(VIDEO_SECTION, FULLSCREEN_ENABLED, fullscreen_enabled) current_resolution = Config.get_config(VIDEO_SECTION, SCREEN_RESOLUTION, current_resolution) - window.mode = Window.MODE_EXCLUSIVE_FULLSCREEN if (fullscreen_enabled) else Window.MODE_WINDOWED - window.size = current_resolution + return current_resolution +static func set_video_from_config(window : Window) -> void: + var fullscreen_enabled : bool = is_fullscreen(window) + fullscreen_enabled = Config.get_config(VIDEO_SECTION, FULLSCREEN_ENABLED, fullscreen_enabled) + set_fullscreen_enabled(fullscreen_enabled, window) + if not (fullscreen_enabled or OS.has_feature("web")): + var current_resolution : Vector2i = get_resolution(window) + set_resolution(current_resolution, window) + # All static func set_from_config() -> void: From 471a7066143297f4107c9660de5f2ab5f179c395 Mon Sep 17 00:00:00 2001 From: Maaack Date: Thu, 30 Nov 2023 20:12:00 -0800 Subject: [PATCH 6/6] Make projects fullscreen by default. --- project.godot | 1 + 1 file changed, 1 insertion(+) diff --git a/project.godot b/project.godot index 39eadeb..0b36f62 100644 --- a/project.godot +++ b/project.godot @@ -24,6 +24,7 @@ SceneLoader="*res://App/Scripts/SceneLoader.gd" window/size/viewport_width=1280 window/size/viewport_height=720 +window/size/mode=3 [gui]