refactor: extract shared MouseCapture helper

This commit is contained in:
2026-08-22 19:39:52 +02:00
parent 9f742f396f
commit 4f57c77b7b
4 changed files with 48 additions and 12 deletions
@@ -1,5 +1,6 @@
using System.Linq; using System.Linq;
using Game.Features.Players.Domain; using Game.Features.Players.Domain;
using Game.Godot;
using Game.Godot.Extensions; using Game.Godot.Extensions;
using Game.Godot.Mappings; using Game.Godot.Mappings;
using Godot; using Godot;
@@ -19,8 +20,6 @@ public partial class PlayerController : Node3D
private PlayerMovement _movement; private PlayerMovement _movement;
private PlayerLook _look; private PlayerLook _look;
private static bool IsMouseCaptured() => Input.MouseMode == Input.MouseModeEnum.Captured;
public override void _Ready() public override void _Ready()
{ {
this.AssertRequiredExports(); this.AssertRequiredExports();
@@ -32,7 +31,7 @@ public partial class PlayerController : Node3D
public override void _UnhandledInput(InputEvent @event) 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)); Body.RotateY(_look.CalculateYawDelta(mouseMotion.Relative.X));
_look.UpdatePitch(mouseMotion.Relative.Y); _look.UpdatePitch(mouseMotion.Relative.Y);
+3 -9
View File
@@ -1,3 +1,4 @@
using Game.Godot;
using Game.Godot.Mappings; using Game.Godot.Mappings;
using Godot; using Godot;
@@ -5,23 +6,16 @@ namespace Game.Godot.Bootstrap;
public partial class GameBootstrap : Node 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() public override void _Ready()
{ {
Input.MouseMode = Input.MouseModeEnum.Captured; MouseCapture.Capture();
} }
public override void _UnhandledInput(InputEvent @event) public override void _UnhandledInput(InputEvent @event)
{ {
if (@event.IsActionPressed(InputAction.Cancel.ActionName())) if (@event.IsActionPressed(InputAction.Cancel.ActionName()))
{ {
ToggleMouseCapture(); MouseCapture.Toggle();
} }
} }
} }
+42
View File
@@ -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();
}
}
}
}
+1
View File
@@ -0,0 +1 @@
uid://dab3etxieot78