Add real pause menu
This commit is contained in:
		
							parent
							
								
									c2103b2810
								
							
						
					
					
						commit
						19335709e3
					
				| @ -15,6 +15,10 @@ run/main_scene="res://scenes/demo/demo.tscn" | ||||
| config/features=PackedStringArray("4.3", "C#", "Forward Plus") | ||||
| config/icon="res://misc/icon.svg" | ||||
| 
 | ||||
| [autoload] | ||||
| 
 | ||||
| UserSettings="*res://scripts/UserSettings.cs" | ||||
| 
 | ||||
| [display] | ||||
| 
 | ||||
| window/size/viewport_width=1920 | ||||
| @ -42,6 +46,14 @@ texture={ | ||||
| 
 | ||||
| [input] | ||||
| 
 | ||||
| ui_accept={ | ||||
| "deadzone": 0.5, | ||||
| "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194309,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) | ||||
| , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194310,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) | ||||
| , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null) | ||||
| , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":false,"script":null) | ||||
| ] | ||||
| } | ||||
| move_forward={ | ||||
| "deadzone": 0.5, | ||||
| "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null) | ||||
| @ -103,6 +115,12 @@ sprint={ | ||||
| , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":3,"pressure":0.0,"pressed":true,"script":null) | ||||
| ] | ||||
| } | ||||
| toggle_pause_menu={ | ||||
| "deadzone": 0.5, | ||||
| "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) | ||||
| , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":6,"pressure":0.0,"pressed":true,"script":null) | ||||
| ] | ||||
| } | ||||
| 
 | ||||
| [internationalization] | ||||
| 
 | ||||
|  | ||||
| @ -1,8 +1,12 @@ | ||||
| [gd_scene load_steps=2 format=3 uid="uid://c670g1qg5gaug"] | ||||
| [gd_scene load_steps=3 format=3 uid="uid://c670g1qg5gaug"] | ||||
| 
 | ||||
| [ext_resource type="Script" path="res://scripts/PauseMenu.cs" id="1_p5jo3"] | ||||
| 
 | ||||
| [node name="PauseMenu" type="Control"] | ||||
| [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_he4q6"] | ||||
| bg_color = Color(0.109074, 0.275986, 0.806965, 1) | ||||
| 
 | ||||
| [node name="PauseMenu" type="Control" node_paths=PackedStringArray("InitialFocusTarget", "VolumeSlider", "CameraSensitivityX", "CameraSensitivityY", "CameraInvertX", "CameraInvertY")] | ||||
| process_mode = 3 | ||||
| layout_mode = 3 | ||||
| anchors_preset = 15 | ||||
| anchor_right = 1.0 | ||||
| @ -10,8 +14,15 @@ anchor_bottom = 1.0 | ||||
| grow_horizontal = 2 | ||||
| grow_vertical = 2 | ||||
| script = ExtResource("1_p5jo3") | ||||
| InitialFocusTarget = NodePath("CenterContainer/PanelContainer/MarginContainer/Option List/ContinueButton") | ||||
| VolumeSlider = NodePath("CenterContainer/PanelContainer/MarginContainer/Option List/GridContainer/VolumeSlider") | ||||
| CameraSensitivityX = NodePath("CenterContainer/PanelContainer/MarginContainer/Option List/GridContainer/CameraXSlider") | ||||
| CameraSensitivityY = NodePath("CenterContainer/PanelContainer/MarginContainer/Option List/GridContainer/CameraYSlider") | ||||
| CameraInvertX = NodePath("CenterContainer/PanelContainer/MarginContainer/Option List/GridContainer/CameraXInvCheck") | ||||
| CameraInvertY = NodePath("CenterContainer/PanelContainer/MarginContainer/Option List/GridContainer/CameraYInvCheck") | ||||
| 
 | ||||
| [node name="CenterContainer" type="CenterContainer" parent="."] | ||||
| process_mode = 2 | ||||
| layout_mode = 1 | ||||
| anchors_preset = 15 | ||||
| anchor_right = 1.0 | ||||
| @ -19,9 +30,84 @@ anchor_bottom = 1.0 | ||||
| grow_horizontal = 2 | ||||
| grow_vertical = 2 | ||||
| 
 | ||||
| [node name="Button" type="Button" parent="CenterContainer"] | ||||
| [node name="PanelContainer" type="PanelContainer" parent="CenterContainer"] | ||||
| layout_mode = 2 | ||||
| theme_override_font_sizes/font_size = 50 | ||||
| theme_override_styles/panel = SubResource("StyleBoxFlat_he4q6") | ||||
| 
 | ||||
| [node name="MarginContainer" type="MarginContainer" parent="CenterContainer/PanelContainer"] | ||||
| layout_mode = 2 | ||||
| theme_override_constants/margin_left = 20 | ||||
| theme_override_constants/margin_top = 20 | ||||
| theme_override_constants/margin_right = 20 | ||||
| theme_override_constants/margin_bottom = 20 | ||||
| 
 | ||||
| [node name="Option List" type="VBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer"] | ||||
| layout_mode = 2 | ||||
| theme_override_constants/separation = 16 | ||||
| 
 | ||||
| [node name="ContinueButton" type="Button" parent="CenterContainer/PanelContainer/MarginContainer/Option List"] | ||||
| layout_mode = 2 | ||||
| focus_neighbor_top = NodePath("../QuitButton") | ||||
| text = "Continue" | ||||
| 
 | ||||
| [connection signal="pressed" from="CenterContainer/Button" to="." method="Close"] | ||||
| [node name="GridContainer" type="GridContainer" parent="CenterContainer/PanelContainer/MarginContainer/Option List"] | ||||
| layout_mode = 2 | ||||
| theme_override_constants/h_separation = 14 | ||||
| theme_override_constants/v_separation = 9 | ||||
| columns = 2 | ||||
| 
 | ||||
| [node name="VolumeLabel" type="Label" parent="CenterContainer/PanelContainer/MarginContainer/Option List/GridContainer"] | ||||
| layout_mode = 2 | ||||
| text = "Volume" | ||||
| 
 | ||||
| [node name="VolumeSlider" type="HSlider" parent="CenterContainer/PanelContainer/MarginContainer/Option List/GridContainer"] | ||||
| custom_minimum_size = Vector2(100, 0) | ||||
| layout_mode = 2 | ||||
| size_flags_horizontal = 3 | ||||
| size_flags_vertical = 1 | ||||
| max_value = 1.0 | ||||
| step = 0.1 | ||||
| 
 | ||||
| [node name="CameraXLabel" type="Label" parent="CenterContainer/PanelContainer/MarginContainer/Option List/GridContainer"] | ||||
| layout_mode = 2 | ||||
| text = "Camera yaw speed" | ||||
| 
 | ||||
| [node name="CameraXSlider" type="HSlider" parent="CenterContainer/PanelContainer/MarginContainer/Option List/GridContainer"] | ||||
| layout_mode = 2 | ||||
| size_flags_vertical = 1 | ||||
| max_value = 10.0 | ||||
| step = 0.25 | ||||
| 
 | ||||
| [node name="CameraXInvLabel" type="Label" parent="CenterContainer/PanelContainer/MarginContainer/Option List/GridContainer"] | ||||
| layout_mode = 2 | ||||
| text = "Camera invert yaw" | ||||
| 
 | ||||
| [node name="CameraXInvCheck" type="CheckButton" parent="CenterContainer/PanelContainer/MarginContainer/Option List/GridContainer"] | ||||
| layout_mode = 2 | ||||
| action_mode = 0 | ||||
| 
 | ||||
| [node name="CameraYLabel" type="Label" parent="CenterContainer/PanelContainer/MarginContainer/Option List/GridContainer"] | ||||
| layout_mode = 2 | ||||
| text = "Camera pitch speed" | ||||
| 
 | ||||
| [node name="CameraYSlider" type="HSlider" parent="CenterContainer/PanelContainer/MarginContainer/Option List/GridContainer"] | ||||
| layout_mode = 2 | ||||
| size_flags_vertical = 1 | ||||
| max_value = 10.0 | ||||
| step = 0.25 | ||||
| 
 | ||||
| [node name="CameraYInvLabel" type="Label" parent="CenterContainer/PanelContainer/MarginContainer/Option List/GridContainer"] | ||||
| layout_mode = 2 | ||||
| text = "Camera invert pitch" | ||||
| 
 | ||||
| [node name="CameraYInvCheck" type="CheckButton" parent="CenterContainer/PanelContainer/MarginContainer/Option List/GridContainer"] | ||||
| layout_mode = 2 | ||||
| action_mode = 0 | ||||
| 
 | ||||
| [node name="QuitButton" type="Button" parent="CenterContainer/PanelContainer/MarginContainer/Option List"] | ||||
| layout_mode = 2 | ||||
| focus_neighbor_bottom = NodePath("../ContinueButton") | ||||
| text = "Quit" | ||||
| 
 | ||||
| [connection signal="pressed" from="CenterContainer/PanelContainer/MarginContainer/Option List/ContinueButton" to="." method="Close"] | ||||
| [connection signal="pressed" from="CenterContainer/PanelContainer/MarginContainer/Option List/QuitButton" to="." method="Quit"] | ||||
|  | ||||
| @ -2,15 +2,39 @@ using Godot; | ||||
| 
 | ||||
| namespace Gmtk24 { | ||||
|     public partial class PauseMenu : Control { | ||||
|         [Export] | ||||
|         public Control InitialFocusTarget; | ||||
|         [ExportCategory("Setting controls")] | ||||
|         [Export] | ||||
|         public Range VolumeSlider; | ||||
|         [Export] | ||||
|         public Range CameraSensitivityX; | ||||
|         [Export] | ||||
|         public Range CameraSensitivityY; | ||||
|         [Export] | ||||
|         public BaseButton CameraInvertX; | ||||
|         [Export] | ||||
|         public BaseButton CameraInvertY; | ||||
| 
 | ||||
|         private bool Opened = false; | ||||
| 
 | ||||
|         public override void _Ready() { | ||||
|             VolumeSlider.Value = UserSettings.Singleton.Volume; | ||||
|             VolumeSlider.ValueChanged += (value) => UserSettings.Singleton.Volume = (float)value; | ||||
|             CameraSensitivityX.Value = UserSettings.Singleton.CameraSensitivityX; | ||||
|             CameraSensitivityX.ValueChanged += (value) => UserSettings.Singleton.CameraSensitivityX = (float)value; | ||||
|             CameraSensitivityY.Value = UserSettings.Singleton.CameraSensitivityY; | ||||
|             CameraSensitivityY.ValueChanged += (value) => UserSettings.Singleton.CameraSensitivityY = (float)value; | ||||
|             CameraInvertX.ButtonPressed = UserSettings.Singleton.CameraInvertX; | ||||
|             CameraInvertX.Toggled += (on) => UserSettings.Singleton.CameraInvertX = on; | ||||
|             CameraInvertY.ButtonPressed = UserSettings.Singleton.CameraInvertY; | ||||
|             CameraInvertY.Toggled += (on) => UserSettings.Singleton.CameraInvertY = on; | ||||
| 
 | ||||
|             Close(); | ||||
|         } | ||||
| 
 | ||||
|         public override void _Input(InputEvent @event) { | ||||
|             if (@event is InputEventKey keyEvent) { | ||||
|                 if (keyEvent.Pressed && keyEvent.Keycode == Key.Escape) { | ||||
|             if (@event.IsActionPressed("toggle_pause_menu")) { | ||||
|                 if (Opened) { | ||||
|                     Close(); | ||||
|                 } else { | ||||
| @ -18,18 +42,26 @@ namespace Gmtk24 { | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         } | ||||
| 
 | ||||
|         public void Open() { | ||||
|             Visible = true; | ||||
|             Input.MouseMode = Input.MouseModeEnum.Visible; | ||||
|             GetTree().Paused = true; | ||||
|             if (IsInstanceValid(InitialFocusTarget)) { | ||||
|                 InitialFocusTarget.GrabFocus(); | ||||
|             } | ||||
|             Opened = true; | ||||
|         } | ||||
| 
 | ||||
|         public void Close() { | ||||
|             GetTree().Paused = false; | ||||
|             Input.MouseMode = Input.MouseModeEnum.Captured; | ||||
|             Visible = false; | ||||
|             Opened = false; | ||||
|         } | ||||
| 
 | ||||
|         public void Quit() { | ||||
|             GetTree().Quit(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -22,11 +22,10 @@ namespace Gmtk24 { | ||||
| 
 | ||||
|         public override void _UnhandledInput(InputEvent @event) { | ||||
|             if (@event is InputEventMouseMotion mouseMotion && Input.MouseMode == Input.MouseModeEnum.Captured) { | ||||
|                 var cameraSensitivityX = 2f; // FIXME: use camera sensitivity and invert settings | ||||
|                 var cameraSensitivityY = 2f; // FIXME: use camera sensitivity and invert settings | ||||
|                 var cameraSensitivity = UserSettings.Singleton.GetCameraSpeedMultipliers(); | ||||
|                 var mouseMultiplier = 0.0003f; | ||||
|                 CurrentYaw -= mouseMotion.ScreenRelative.X * mouseMultiplier * cameraSensitivityX; | ||||
|                 CurrentPitch -= mouseMotion.ScreenRelative.Y * mouseMultiplier * cameraSensitivityY; | ||||
|                 CurrentYaw -= mouseMotion.ScreenRelative.X * mouseMultiplier * cameraSensitivity.X; | ||||
|                 CurrentPitch -= mouseMotion.ScreenRelative.Y * mouseMultiplier * cameraSensitivity.Y; | ||||
|                 GetViewport().SetInputAsHandled(); | ||||
|             } | ||||
| 
 | ||||
| @ -38,11 +37,10 @@ namespace Gmtk24 { | ||||
|         public override void _Process(double delta) { | ||||
|             var yawInput = Input.GetActionStrength("look_left") - Input.GetActionStrength("look_right"); | ||||
|             var pitchInput = Input.GetActionStrength("look_up") - Input.GetActionStrength("look_down"); | ||||
|             var cameraSensitivityX = 2f; // FIXME: use camera sensitivity and invert settings | ||||
|             var cameraSensitivityY = 2f; // FIXME: use camera sensitivity and invert settings | ||||
|             CurrentYaw += yawInput * cameraSensitivityX * (float)delta; | ||||
|             var cameraSensitivity = UserSettings.Singleton.GetCameraSpeedMultipliers(); | ||||
|             CurrentYaw += yawInput * cameraSensitivity.X * (float)delta; | ||||
|             if (Eye != null) { | ||||
|                 CurrentPitch += pitchInput * cameraSensitivityY * (float)delta; | ||||
|                 CurrentPitch += pitchInput * cameraSensitivity.Y * (float)delta; | ||||
|                 CurrentPitch = Mathf.Clamp(CurrentPitch, -Mathf.Pi * 0.49f, Mathf.Pi * 0.49f); | ||||
|             } | ||||
|             Eye.Quaternion = new Quaternion(Vector3.Up, CurrentYaw) * new Quaternion(Vector3.Right, CurrentPitch); | ||||
|  | ||||
							
								
								
									
										25
									
								
								scripts/UserSettings.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								scripts/UserSettings.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | ||||
| using Godot; | ||||
| 
 | ||||
| namespace Gmtk24 { | ||||
|     public partial class UserSettings : Node { | ||||
|         /// <summary>The singleton instance of this class, set when Godot | ||||
|         /// instantiates the Autoload scripts.</summary> | ||||
|         public static UserSettings Singleton { get; private set; } | ||||
| 
 | ||||
|         public float Volume = 0.2f; | ||||
|         public float CameraSensitivityX = 2f; | ||||
|         public float CameraSensitivityY = 2f; | ||||
|         public bool CameraInvertX = false; | ||||
|         public bool CameraInvertY = false; | ||||
| 
 | ||||
|         public override void _Ready() { | ||||
|             Singleton = this; | ||||
|         } | ||||
| 
 | ||||
|         public Vector2 GetCameraSpeedMultipliers() { | ||||
|             var x = CameraSensitivityX * (CameraInvertX ? -1 : 1); | ||||
|             var y = CameraSensitivityY * (CameraInvertY ? -1 : 1); | ||||
|             return new Vector2(x, y); | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user