From 4f57c77b7b9f4aee3668b0147d1b275ae0e25a05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20St=C4=99pie=C5=84?= Date: Sat, 22 Aug 2026 19:39:52 +0200 Subject: [PATCH] refactor: extract shared MouseCapture helper --- .../Players/Godot/PlayerController.cs | 5 +-- src/Godot/Bootstrap/GameBootstrap.cs | 12 ++---- src/Godot/MouseCapture.cs | 42 +++++++++++++++++++ src/Godot/MouseCapture.cs.uid | 1 + 4 files changed, 48 insertions(+), 12 deletions(-) create mode 100644 src/Godot/MouseCapture.cs create mode 100644 src/Godot/MouseCapture.cs.uid diff --git a/src/Features/Players/Godot/PlayerController.cs b/src/Features/Players/Godot/PlayerController.cs index 21d9dda..ba1d9ba 100644 --- a/src/Features/Players/Godot/PlayerController.cs +++ b/src/Features/Players/Godot/PlayerController.cs @@ -1,5 +1,6 @@ using System.Linq; using Game.Features.Players.Domain; +using Game.Godot; using Game.Godot.Extensions; using Game.Godot.Mappings; using Godot; @@ -19,8 +20,6 @@ public partial class PlayerController : Node3D private PlayerMovement _movement; private PlayerLook _look; - private static bool IsMouseCaptured() => Input.MouseMode == Input.MouseModeEnum.Captured; - public override void _Ready() { this.AssertRequiredExports(); @@ -32,7 +31,7 @@ public partial class PlayerController : Node3D public override void _UnhandledInput(InputEvent @event) { - if (@event is not InputEventMouseMotion mouseMotion || !IsMouseCaptured()) return; + if (@event is not InputEventMouseMotion mouseMotion || !MouseCapture.IsCaptured) return; Body.RotateY(_look.CalculateYawDelta(mouseMotion.Relative.X)); _look.UpdatePitch(mouseMotion.Relative.Y); diff --git a/src/Godot/Bootstrap/GameBootstrap.cs b/src/Godot/Bootstrap/GameBootstrap.cs index 854b066..c2e8755 100644 --- a/src/Godot/Bootstrap/GameBootstrap.cs +++ b/src/Godot/Bootstrap/GameBootstrap.cs @@ -1,3 +1,4 @@ +using Game.Godot; using Game.Godot.Mappings; using Godot; @@ -5,23 +6,16 @@ namespace Game.Godot.Bootstrap; public partial class GameBootstrap : Node { - private static void ToggleMouseCapture() - { - Input.MouseMode = Input.MouseMode == Input.MouseModeEnum.Captured - ? Input.MouseModeEnum.Visible - : Input.MouseModeEnum.Captured; - } - public override void _Ready() { - Input.MouseMode = Input.MouseModeEnum.Captured; + MouseCapture.Capture(); } public override void _UnhandledInput(InputEvent @event) { if (@event.IsActionPressed(InputAction.Cancel.ActionName())) { - ToggleMouseCapture(); + MouseCapture.Toggle(); } } } diff --git a/src/Godot/MouseCapture.cs b/src/Godot/MouseCapture.cs new file mode 100644 index 0000000..a23233e --- /dev/null +++ b/src/Godot/MouseCapture.cs @@ -0,0 +1,42 @@ +using Godot; + +namespace Game.Godot; + +public static class MouseCapture +{ + public static bool IsCaptured => Input.MouseMode == Input.MouseModeEnum.Captured; + + public static void Capture() => Input.MouseMode = Input.MouseModeEnum.Captured; + + public static void Release() => Input.MouseMode = Input.MouseModeEnum.Visible; + + public static void Toggle() + { + if (IsCaptured) + { + Release(); + } + else + { + Capture(); + } + } + + public static Memento SaveCaptureMode() + { + Memento memento = new(IsCaptured); + Release(); + return memento; + } + + public sealed class Memento(bool wasCaptured) + { + public void RestoreCaptureMode() + { + if (wasCaptured) + { + Capture(); + } + } + } +} diff --git a/src/Godot/MouseCapture.cs.uid b/src/Godot/MouseCapture.cs.uid new file mode 100644 index 0000000..78faf4a --- /dev/null +++ b/src/Godot/MouseCapture.cs.uid @@ -0,0 +1 @@ +uid://dab3etxieot78