diff --git a/autoloads/globals.gd b/autoloads/globals.gd index 3b540a1..8999c9c 100644 --- a/autoloads/globals.gd +++ b/autoloads/globals.gd @@ -2,6 +2,7 @@ extends Node signal graphics_settings_changed(resolution: Vector2, fullscreen: bool, vsync: bool) +signal graphics_fov_changed(fov: int) const BLOCK_PREFAB: PackedScene = preload("res://scenes/blocks/block.tscn") @@ -11,8 +12,10 @@ const DROPPED_BLOCK_PREFAB: PackedScene = preload("res://scenes/blocks/dropped_b var enable_waila: bool = true ## Enable `What Am I Looking At` UI var enable_block_highlight: bool = true +# TODO: Replace the following with a Resource var graphics_settings: Dictionary[String, Variant] = { "resolution": Vector2i.ZERO, + "fov": 75, "fullscreen": false, "vsync": false, } @@ -20,6 +23,7 @@ var graphics_settings: Dictionary[String, Variant] = { func _init() -> void: graphics_settings_changed.connect(_on_graphics_settings_changed) + graphics_fov_changed.connect(_on_graphics_fov_changed) func apply_graphics_settings() -> void: @@ -36,6 +40,9 @@ func apply_graphics_settings() -> void: DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED) +func _on_graphics_fov_changed(fov: int) -> void: + graphics_settings.fov = fov + func _on_graphics_settings_changed(resolution: Vector2i, fullscreen: bool, vsync: bool) -> void: graphics_settings.resolution = resolution graphics_settings.fullscreen = fullscreen diff --git a/scenes/player/player.gd b/scenes/player/player.gd index cbc7c9d..e0e1387 100644 --- a/scenes/player/player.gd +++ b/scenes/player/player.gd @@ -17,6 +17,7 @@ extends CharacterBody3D @export var sprint_toggle: bool = false ## Enables toggle sprint instead of hold. When enabled, sprinting will also be disabled when velocity is zero @export var walk_speed: float = 5.0 +@onready var camera: Camera3D = $Head/Camera3D @onready var head: Node3D = $Head @onready var collision_shape_standing: CollisionShape3D = $CollisionShapeStanding @onready var collision_shape_crouching: CollisionShape3D = $CollisionShapeCrouching @@ -47,6 +48,9 @@ func _physics_process(delta: float) -> void: move_and_slide() +func _ready() -> void: + Globals.graphics_fov_changed.connect(_on_graphics_fov_changed) + func _apply_gravity(delta: float) -> void: if is_on_floor(): return @@ -115,3 +119,7 @@ func _set_is_sprinting() -> void: is_sprinting = false else: is_sprinting = Input.is_action_pressed("run") + + +func _on_graphics_fov_changed(fov: int) -> void: + camera.fov = fov diff --git a/scenes/ui/menus/settings_menu.gd b/scenes/ui/menus/settings_menu.gd index 50c5dfa..6a8cb91 100644 --- a/scenes/ui/menus/settings_menu.gd +++ b/scenes/ui/menus/settings_menu.gd @@ -6,6 +6,8 @@ extends Panel @export var resolution_input: OptionButton @export var fullscreen_input: CheckBox @export var vsync_input: CheckBox +@export var fov_slider: HSlider +@export var fov_value_label: Label #region Game Settings @@ -17,6 +19,9 @@ func _on_enable_waila_toggled(toggled_on: bool) -> void: #endregion #region Graphics Settings +func _on_fov_slider_changed(value: float) -> void: + fov_value_label.text = str(int(value)) + func _on_graphics_apply_button_pressed() -> void: var values: Array = resolution_input.text.split_floats("x") Globals.graphics_settings_changed.emit( @@ -24,6 +29,7 @@ func _on_graphics_apply_button_pressed() -> void: fullscreen_input.button_pressed, vsync_input.button_pressed ) + Globals.graphics_fov_changed.emit(int(fov_slider.value)) #endregion #region Audio Settings diff --git a/scenes/ui/menus/settings_menu.tscn b/scenes/ui/menus/settings_menu.tscn index aeaf7fa..cf91166 100644 --- a/scenes/ui/menus/settings_menu.tscn +++ b/scenes/ui/menus/settings_menu.tscn @@ -14,7 +14,7 @@ corner_radius_top_right = 2 corner_radius_bottom_right = 2 corner_radius_bottom_left = 2 -[node name="SettingsMenu" type="Panel" node_paths=PackedStringArray("resolution_input", "fullscreen_input", "vsync_input")] +[node name="SettingsMenu" type="Panel" node_paths=PackedStringArray("resolution_input", "fullscreen_input", "vsync_input", "fov_slider", "fov_value_label")] process_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -25,6 +25,8 @@ script = ExtResource("1_qwcqe") resolution_input = NodePath("Background/MarginContainer/VBoxContainer/TabContainer/Graphics/Resolution/OptionButton") fullscreen_input = NodePath("Background/MarginContainer/VBoxContainer/TabContainer/Graphics/Fullscreen/CheckBox") vsync_input = NodePath("Background/MarginContainer/VBoxContainer/TabContainer/Graphics/VSync/CheckBox") +fov_slider = NodePath("Background/MarginContainer/VBoxContainer/TabContainer/Graphics/FOV/HSlider") +fov_value_label = NodePath("Background/MarginContainer/VBoxContainer/TabContainer/Graphics/FOV/Value") metadata/_edit_vertical_guides_ = [349.0] [node name="Background" type="ColorRect" parent="."] @@ -148,6 +150,27 @@ text = "VSync" [node name="CheckBox" type="CheckBox" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics/VSync"] layout_mode = 2 +[node name="FOV" type="HBoxContainer" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics"] +layout_mode = 2 + +[node name="Label" type="Label" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics/FOV"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "FOV" + +[node name="HSlider" type="HSlider" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics/FOV"] +layout_mode = 2 +size_flags_horizontal = 3 +min_value = 60.0 +max_value = 120.0 +value = 75.0 +rounded = true +ticks_on_borders = true + +[node name="Value" type="Label" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics/FOV"] +layout_mode = 2 +text = "75" + [node name="HSeparator" type="HSeparator" parent="Background/MarginContainer/VBoxContainer/TabContainer/Graphics"] layout_mode = 2 theme_override_constants/separation = 20 @@ -191,5 +214,6 @@ text = "Close Settings" [connection signal="toggled" from="Background/MarginContainer/VBoxContainer/TabContainer/Game/BlockHighlight/CheckButton" to="." method="_on_block_highlighting_toggled"] [connection signal="toggled" from="Background/MarginContainer/VBoxContainer/TabContainer/Game/Waila/CheckButton" to="." method="_on_enable_waila_toggled"] +[connection signal="value_changed" from="Background/MarginContainer/VBoxContainer/TabContainer/Graphics/FOV/HSlider" to="." method="_on_fov_slider_changed"] [connection signal="pressed" from="Background/MarginContainer/VBoxContainer/TabContainer/Graphics/CenterContainer/ApplyButton" to="." method="_on_graphics_apply_button_pressed"] [connection signal="pressed" from="Background/BottomRow/CloseButton" to="." method="_on_close_button_pressed"]