diff options
author | George L. Albany <Megacake1234@gmail.com> | 2024-05-07 01:15:50 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-07 01:15:50 +0200 |
commit | c29cc0dabe3e3c7d03280e74d2d10fc3cc479c7f (patch) | |
tree | 059fe3b320d6ed41416aee3853c5eb8e8ca36583 /game/src/Game | |
parent | 8c8ee1524f51d44acd1d1894eda5984956cba9a6 (diff) | |
parent | 7def4dd2e7987c20163c6a419bcc0506b5a670d9 (diff) |
Merge pull request #226 from Spartan322/click-mask-guinodes
Improve map view and game panel user experience
Diffstat (limited to 'game/src/Game')
-rw-r--r-- | game/src/Game/GameSession/GameSession.tscn | 70 | ||||
-rw-r--r-- | game/src/Game/GameSession/GameSessionMenu.tscn | 1 | ||||
-rw-r--r-- | game/src/Game/GameSession/MapControlPanel/MapControlPanel.tscn | 2 | ||||
-rw-r--r-- | game/src/Game/GameSession/MapView.gd | 85 | ||||
-rw-r--r-- | game/src/Game/GameSession/ProvinceOverviewPanel.gd | 6 | ||||
-rw-r--r-- | game/src/Game/GameSession/Topbar.gd | 6 | ||||
-rw-r--r-- | game/src/Game/Menu/SaveLoadMenu/SaveLoadMenu.tscn | 1 | ||||
-rw-r--r-- | game/src/Game/MusicConductor/MusicPlayer.tscn | 1 |
8 files changed, 97 insertions, 75 deletions
diff --git a/game/src/Game/GameSession/GameSession.tscn b/game/src/Game/GameSession/GameSession.tscn index d2fc3a3..343ddfe 100644 --- a/game/src/Game/GameSession/GameSession.tscn +++ b/game/src/Game/GameSession/GameSession.tscn @@ -28,63 +28,76 @@ grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 script = ExtResource("1_eklvp") -_game_session_menu = NodePath("GameSessionMenu") +_game_session_menu = NodePath("UICanvasLayer/UI/GameSessionMenu") [node name="MapView" parent="." instance=ExtResource("4_xkg5j")] -[node name="ProvinceOverviewPanel" type="GUINode" parent="."] +[node name="UICanvasLayer" type="CanvasLayer" parent="."] + +[node name="UI" type="Control" parent="UICanvasLayer"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="ProvinceOverviewPanel" type="GUINode" parent="UICanvasLayer/UI"] layout_mode = 1 anchors_preset = 15 +mouse_force_pass_scroll_events = false script = ExtResource("5_lfv8l") -[node name="Topbar" type="GUINode" parent="."] +[node name="Topbar" type="GUINode" parent="UICanvasLayer/UI"] layout_mode = 1 anchors_preset = 15 +mouse_force_pass_scroll_events = false script = ExtResource("4_2kbih") -[node name="ProductionMenu" type="GUINode" parent="Topbar"] +[node name="ProductionMenu" type="GUINode" parent="UICanvasLayer/UI/Topbar"] layout_mode = 1 anchors_preset = 15 script = ExtResource("5_16755") -[node name="BudgetMenu" type="GUINode" parent="Topbar"] +[node name="BudgetMenu" type="GUINode" parent="UICanvasLayer/UI/Topbar"] layout_mode = 1 anchors_preset = 15 script = ExtResource("6_vninv") -[node name="TechnologyMenu" type="GUINode" parent="Topbar"] +[node name="TechnologyMenu" type="GUINode" parent="UICanvasLayer/UI/Topbar"] layout_mode = 1 anchors_preset = 15 script = ExtResource("7_r712c") -[node name="PoliticsMenu" type="GUINode" parent="Topbar"] +[node name="PoliticsMenu" type="GUINode" parent="UICanvasLayer/UI/Topbar"] layout_mode = 1 anchors_preset = 15 script = ExtResource("8_ppdek") -[node name="PopulationMenu" type="GUINode" parent="Topbar"] +[node name="PopulationMenu" type="GUINode" parent="UICanvasLayer/UI/Topbar"] layout_mode = 1 anchors_preset = 15 script = ExtResource("10_laee7") -[node name="TradeMenu" type="GUINode" parent="Topbar"] +[node name="TradeMenu" type="GUINode" parent="UICanvasLayer/UI/Topbar"] layout_mode = 1 anchors_preset = 15 script = ExtResource("10_mv1r6") -[node name="DiplomacyMenu" type="GUINode" parent="Topbar"] +[node name="DiplomacyMenu" type="GUINode" parent="UICanvasLayer/UI/Topbar"] layout_mode = 1 anchors_preset = 15 script = ExtResource("11_fu7ys") -[node name="MilitaryMenu" type="GUINode" parent="Topbar"] +[node name="MilitaryMenu" type="GUINode" parent="UICanvasLayer/UI/Topbar"] layout_mode = 1 anchors_preset = 15 script = ExtResource("12_6h6nc") -[node name="MapControlPanel" parent="." instance=ExtResource("3_afh6d")] +[node name="MapControlPanel" parent="UICanvasLayer/UI" instance=ExtResource("3_afh6d")] layout_mode = 1 -anchors_preset = 3 +anchors_preset = -1 anchor_left = 1.0 anchor_top = 1.0 anchor_right = 1.0 @@ -92,7 +105,7 @@ anchor_bottom = 1.0 grow_horizontal = 0 grow_vertical = 0 -[node name="GameSessionMenu" parent="." instance=ExtResource("3_bvmqh")] +[node name="GameSessionMenu" parent="UICanvasLayer/UI" instance=ExtResource("3_bvmqh")] visible = false layout_mode = 1 anchors_preset = 8 @@ -107,11 +120,12 @@ offset_bottom = 165.0 grow_horizontal = 2 grow_vertical = 2 -[node name="OptionsMenu" parent="." instance=ExtResource("6_p5mnx")] +[node name="OptionsMenu" parent="UICanvasLayer/UI" instance=ExtResource("6_p5mnx")] visible = false layout_mode = 1 +mouse_force_pass_scroll_events = false -[node name="SaveLoadMenu" parent="." instance=ExtResource("8_4g7ko")] +[node name="SaveLoadMenu" parent="UICanvasLayer/UI" instance=ExtResource("8_4g7ko")] visible = false layout_mode = 1 anchors_preset = -1 @@ -120,7 +134,7 @@ anchor_right = 0.5 offset_left = -640.0 offset_right = 640.0 -[node name="MusicPlayer" parent="." instance=ExtResource("2_kt6aa")] +[node name="MusicPlayer" parent="UICanvasLayer/UI" instance=ExtResource("2_kt6aa")] layout_mode = 1 anchors_preset = 1 anchor_left = 1.0 @@ -129,15 +143,13 @@ offset_left = -150.0 offset_right = 0.0 grow_horizontal = 0 -[connection signal="map_view_camera_changed" from="MapView" to="MapControlPanel" method="_on_map_view_camera_changed"] -[connection signal="game_session_menu_button_pressed" from="MapControlPanel" to="." method="_on_game_session_menu_button_pressed"] -[connection signal="minimap_clicked" from="MapControlPanel" to="MapView" method="_on_minimap_clicked"] -[connection signal="mouse_entered" from="MapControlPanel" to="MapView" method="_on_mouse_exited_viewport"] -[connection signal="mouse_exited" from="MapControlPanel" to="MapView" method="_on_mouse_entered_viewport"] -[connection signal="zoom_in_button_pressed" from="MapControlPanel" to="MapView" method="zoom_in"] -[connection signal="zoom_out_button_pressed" from="MapControlPanel" to="MapView" method="zoom_out"] -[connection signal="load_button_pressed" from="GameSessionMenu" to="SaveLoadMenu" method="show_for_load"] -[connection signal="options_button_pressed" from="GameSessionMenu" to="OptionsMenu" method="show"] -[connection signal="save_button_pressed" from="GameSessionMenu" to="SaveLoadMenu" method="show_for_save"] -[connection signal="back_button_pressed" from="OptionsMenu" to="MapView" method="enable_processing"] -[connection signal="back_button_pressed" from="OptionsMenu" to="OptionsMenu" method="hide"] +[connection signal="map_view_camera_changed" from="MapView" to="UICanvasLayer/UI/MapControlPanel" method="_on_map_view_camera_changed"] +[connection signal="game_session_menu_button_pressed" from="UICanvasLayer/UI/MapControlPanel" to="." method="_on_game_session_menu_button_pressed"] +[connection signal="minimap_clicked" from="UICanvasLayer/UI/MapControlPanel" to="MapView" method="_on_minimap_clicked"] +[connection signal="zoom_in_button_pressed" from="UICanvasLayer/UI/MapControlPanel" to="MapView" method="zoom_in"] +[connection signal="zoom_out_button_pressed" from="UICanvasLayer/UI/MapControlPanel" to="MapView" method="zoom_out"] +[connection signal="load_button_pressed" from="UICanvasLayer/UI/GameSessionMenu" to="UICanvasLayer/UI/SaveLoadMenu" method="show_for_load"] +[connection signal="options_button_pressed" from="UICanvasLayer/UI/GameSessionMenu" to="UICanvasLayer/UI/OptionsMenu" method="show"] +[connection signal="save_button_pressed" from="UICanvasLayer/UI/GameSessionMenu" to="UICanvasLayer/UI/SaveLoadMenu" method="show_for_save"] +[connection signal="back_button_pressed" from="UICanvasLayer/UI/OptionsMenu" to="MapView" method="enable_processing"] +[connection signal="back_button_pressed" from="UICanvasLayer/UI/OptionsMenu" to="UICanvasLayer/UI/OptionsMenu" method="hide"] diff --git a/game/src/Game/GameSession/GameSessionMenu.tscn b/game/src/Game/GameSession/GameSessionMenu.tscn index af81f09..9885c7b 100644 --- a/game/src/Game/GameSession/GameSessionMenu.tscn +++ b/game/src/Game/GameSession/GameSessionMenu.tscn @@ -7,6 +7,7 @@ [node name="GameSessionMenu" type="PanelContainer" node_paths=PackedStringArray("_main_menu_dialog", "_quit_dialog")] process_mode = 3 editor_description = "UI-68" +mouse_force_pass_scroll_events = false theme = ExtResource("1_2onog") theme_type_variation = &"SessionPanel" script = ExtResource("1_usq6o") diff --git a/game/src/Game/GameSession/MapControlPanel/MapControlPanel.tscn b/game/src/Game/GameSession/MapControlPanel/MapControlPanel.tscn index 6731358..7578c82 100644 --- a/game/src/Game/GameSession/MapControlPanel/MapControlPanel.tscn +++ b/game/src/Game/GameSession/MapControlPanel/MapControlPanel.tscn @@ -17,7 +17,7 @@ events = [SubResource("InputEventAction_5nck3")] [node name="MapControlPanel" type="PanelContainer" node_paths=PackedStringArray("_mapmodes_grid")] editor_description = "SS-103, UI-548" -mouse_filter = 1 +mouse_force_pass_scroll_events = false script = ExtResource("1_ign64") _mapmodes_grid = NodePath("MapPanelMargin/MapPanelList/MapDisplayList/MapmodesGrid") diff --git a/game/src/Game/GameSession/MapView.gd b/game/src/Game/GameSession/MapView.gd index 2ab7c34..a83c790 100644 --- a/game/src/Game/GameSession/MapView.gd +++ b/game/src/Game/GameSession/MapView.gd @@ -16,14 +16,13 @@ const _action_click : StringName = &"map_click" @export var _camera : Camera3D -@export var _cardinal_move_speed : float = 1.0 +@export var _cardinal_move_speed : float = 2.5 @export var _edge_move_threshold: float = 0.01 @export var _edge_move_speed: float = 2.5 var _drag_anchor : Vector2 var _drag_active : bool = false var _mouse_over_viewport : bool = true -var _window_in_focus : bool = true @export var _zoom_target_min : float = 0.10 @export var _zoom_target_max : float = 5.0 @@ -122,17 +121,6 @@ func _ready() -> void: _map_text.generate_map_names() -func _notification(what : int) -> void: - match what: - NOTIFICATION_WM_MOUSE_ENTER: # Mouse inside window - _on_mouse_entered_viewport() - NOTIFICATION_WM_MOUSE_EXIT: # Mouse out of window - _on_mouse_exited_viewport() - NOTIFICATION_WM_WINDOW_FOCUS_IN: # Window comes into focus - _on_window_entered_focus() - NOTIFICATION_WM_WINDOW_FOCUS_OUT: # Window goes out of focus - _on_window_exited_focus() - func _world_to_map_coords(pos : Vector3) -> Vector2: return (Vector2(pos.x, pos.z) - _map_mesh_corner) / _map_mesh_dims @@ -163,14 +151,34 @@ func zoom_out() -> void: # cursor location. I'm not sure if we want to preserve this behavior. _zoom_position = Vector2() +func set_hovered_province_index(hover_index : int) -> void: + _map_shader_material.set_shader_parameter(GameLoader.ShaderManager.param_hover_index, hover_index) + +func set_hovered_province_at(pos : Vector2) -> void: + var hover_index := GameSingleton.get_province_index_from_uv_coords(pos) + set_hovered_province_index(hover_index) + +func unset_hovered_province() -> void: + set_hovered_province_index(0) + func _on_province_selected(index : int) -> void: _map_shader_material.set_shader_parameter(GameLoader.ShaderManager.param_selected_index, index) print("Province selected with index: ", index) +func _input(event : InputEvent) -> void: + if event is InputEventMouseMotion: + _mouse_pos_viewport = get_window().get_mouse_position() + elif _drag_active and event.is_action_released(_action_drag): + _drag_active = false + # REQUIREMENTS # * SS-31 func _unhandled_input(event : InputEvent) -> void: - if event.is_action_pressed(_action_click): + if event is InputEventMouseMotion: + _mouse_over_viewport = true + set_hovered_province_at(_viewport_to_map_coords(_mouse_pos_viewport)) + + elif event.is_action_pressed(_action_click): if _mouse_over_viewport: # Check if the mouse is outside of bounds if _map_mesh.is_valid_uv_coord(_mouse_pos_map): @@ -182,17 +190,16 @@ func _unhandled_input(event : InputEvent) -> void: push_warning("Drag being activated while already active!") _drag_active = true _drag_anchor = _mouse_pos_map - elif event.is_action_released(_action_drag): - if not _drag_active: - push_warning("Drag being deactivated while already not active!") - _drag_active = false elif event.is_action_pressed(_action_zoom_in, true): zoom_in() elif event.is_action_pressed(_action_zoom_out, true): zoom_out() -func _physics_process(delta : float) -> void: - _mouse_pos_viewport = get_viewport().get_mouse_position() +func _process(delta : float) -> void: + if _is_viewport_inactive(): + _mouse_over_viewport = false + unset_hovered_province() + _viewport_dims = Vector2(Resolution.get_current_resolution()) # Process movement _movement_process(delta) @@ -222,7 +229,7 @@ func _movement_process(delta : float) -> void: # REQUIREMENTS # * UIFUN-125 func _edge_scrolling_vector() -> Vector2: - if not _window_in_focus: + if _is_viewport_inactive(): return Vector2() var mouse_vector := _mouse_pos_viewport * GuiScale.get_current_guiscale() / _viewport_dims - Vector2(0.5, 0.5) # Only scroll if outside the move threshold. @@ -233,11 +240,12 @@ func _edge_scrolling_vector() -> Vector2: # REQUIREMENTS # * SS-75 func _cardinal_movement_vector() -> Vector2: - var move := Vector2( - float(Input.is_action_pressed(_action_east)) - float(Input.is_action_pressed(_action_west)), - float(Input.is_action_pressed(_action_south)) - float(Input.is_action_pressed(_action_north)) - ) - return move * _cardinal_move_speed + return Input.get_vector( + _action_west, + _action_east, + _action_north, + _action_south + ) * _cardinal_move_speed func _clamp_over_map() -> void: _camera.position.x = _map_mesh_corner.x + fposmod(_camera.position.x - _map_mesh_corner.x, _map_mesh_dims.x) @@ -291,23 +299,7 @@ func _update_minimap_viewport() -> void: map_view_camera_changed.emit(near_left, far_left, far_right, near_right) func _update_mouse_map_position() -> void: - if _mouse_over_viewport: - _mouse_pos_map = _viewport_to_map_coords(_mouse_pos_viewport) - var hover_index := GameSingleton.get_province_index_from_uv_coords(_mouse_pos_map) - _map_shader_material.set_shader_parameter(GameLoader.ShaderManager.param_hover_index, hover_index) - -func _on_mouse_entered_viewport() -> void: - _mouse_over_viewport = true - -func _on_mouse_exited_viewport() -> void: - _mouse_over_viewport = false - _map_shader_material.set_shader_parameter(GameLoader.ShaderManager.param_hover_index, 0) - -func _on_window_entered_focus() -> void: - _window_in_focus = true - -func _on_window_exited_focus() -> void: - _window_in_focus = false + _mouse_pos_map = _viewport_to_map_coords(_mouse_pos_viewport) func _on_minimap_clicked(pos_clicked : Vector2) -> void: pos_clicked *= _map_mesh_dims @@ -315,10 +307,13 @@ func _on_minimap_clicked(pos_clicked : Vector2) -> void: _camera.position.z = pos_clicked.y _clamp_over_map() +func _is_viewport_inactive() -> bool: + return not get_window().has_focus() or get_window().is_input_handled() + func enable_processing() -> void: set_process_unhandled_input(true) - set_physics_process(true) + set_process(true) func disable_processing() -> void: set_process_unhandled_input(false) - set_physics_process(false) + set_process(false) diff --git a/game/src/Game/GameSession/ProvinceOverviewPanel.gd b/game/src/Game/GameSession/ProvinceOverviewPanel.gd index 13e7111..42f6765 100644 --- a/game/src/Game/GameSession/ProvinceOverviewPanel.gd +++ b/game/src/Game/GameSession/ProvinceOverviewPanel.gd @@ -125,6 +125,12 @@ func _ready() -> void: push_error("Failed to generate province overview panel!") return + # Disables all consuming invisible panel + var prov_view := get_panel_from_nodepath(^"./province_view") + if prov_view: + prov_view.mouse_filter = Control.MOUSE_FILTER_IGNORE + set_click_mask_from_nodepaths([^"./province_view/background"]) + var close_button : Button = get_button_from_nodepath(^"./province_view/close_button") if close_button: close_button.pressed.connect(_on_close_button_pressed) diff --git a/game/src/Game/GameSession/Topbar.gd b/game/src/Game/GameSession/Topbar.gd index 92ee75a..8da15e0 100644 --- a/game/src/Game/GameSession/Topbar.gd +++ b/game/src/Game/GameSession/Topbar.gd @@ -27,6 +27,12 @@ func _ready() -> void: const player_country : String = "SLV" + # Disables all consuming invisible panel + var topbar := get_panel_from_nodepath(^"./topbar") + if topbar: + topbar.mouse_filter = Control.MOUSE_FILTER_IGNORE + set_click_mask_from_nodepaths([^"./topbar/topbar_bg", ^"./topbar/topbar_paper"]) + # Player country info var player_flag_texture : GFXMaskedFlagTexture = get_gfx_masked_flag_texture_from_nodepath(^"./topbar/player_flag") if player_flag_texture: diff --git a/game/src/Game/Menu/SaveLoadMenu/SaveLoadMenu.tscn b/game/src/Game/Menu/SaveLoadMenu/SaveLoadMenu.tscn index adc9bdc..38b915c 100644 --- a/game/src/Game/Menu/SaveLoadMenu/SaveLoadMenu.tscn +++ b/game/src/Game/Menu/SaveLoadMenu/SaveLoadMenu.tscn @@ -33,6 +33,7 @@ _overwrite_dialog = NodePath("OverwriteDialog") [node name="SaveLoadPanel" type="PanelContainer" parent="."] layout_mode = 2 +mouse_force_pass_scroll_events = false [node name="SaveLoadList" type="VBoxContainer" parent="SaveLoadPanel"] layout_mode = 2 diff --git a/game/src/Game/MusicConductor/MusicPlayer.tscn b/game/src/Game/MusicConductor/MusicPlayer.tscn index 27bb476..ef57eac 100644 --- a/game/src/Game/MusicConductor/MusicPlayer.tscn +++ b/game/src/Game/MusicConductor/MusicPlayer.tscn @@ -21,6 +21,7 @@ editor_description = "UI-105, UI-107, UI-110, UIFUN-92" custom_minimum_size = Vector2(150, 0) layout_mode = 2 focus_mode = 0 +mouse_force_pass_scroll_events = false alignment = 1 text_overrun_behavior = 3 fit_to_longest_item = false |