From b40f32bf5e88c27494c21c114b92a21ee35a1fce Mon Sep 17 00:00:00 2001 From: Marco Date: Thu, 8 May 2025 12:32:16 +0200 Subject: [PATCH] Reticule cursor for gameplay --- Scripts/GameManager.cs | 6 ++- Scripts/GlobalState.cs | 39 +++++++++++++++---- Scripts/MainMenu.cs | 1 + Scripts/UI/PauseMenu.cs | 1 + Sprites/UI/Aiming_Reticule_Cursor.ase | Bin 0 -> 469 bytes Sprites/UI/Aiming_Reticule_Cursor.png | 3 ++ Sprites/UI/Aiming_Reticule_Cursor.png.import | 34 ++++++++++++++++ 7 files changed, 76 insertions(+), 8 deletions(-) create mode 100644 Sprites/UI/Aiming_Reticule_Cursor.ase create mode 100644 Sprites/UI/Aiming_Reticule_Cursor.png create mode 100644 Sprites/UI/Aiming_Reticule_Cursor.png.import diff --git a/Scripts/GameManager.cs b/Scripts/GameManager.cs index 97f03b5d..d512da98 100644 --- a/Scripts/GameManager.cs +++ b/Scripts/GameManager.cs @@ -90,7 +90,7 @@ public partial class GameManager : Node2D } - GlobalState.Instance.ResizeCursor(); + GlobalState.Instance.ChangeCursor(false); if (GlobalState.Instance.SessionSettings.AllowSaving) { @@ -359,17 +359,21 @@ public partial class GameManager : Node2D case GameState.Dialogue: case GameState.Shop: case GameState.Inventory: + GlobalState.Instance.ChangeCursor(true); + GetTree().SetPause(true); //Input.MouseMode = Input.MouseModeEnum.Visible; break; case GameState.Playing: case GameState.Controlling: //Input.MouseMode = Input.MouseModeEnum.Confined; + GlobalState.Instance.ChangeCursor(false); DelayedUnpause(); //CallDeferred(MethodName.DelayedUnpause); //GetTree().SetPause(false); break; case GameState.Menu: + GlobalState.Instance.ChangeCursor(true); //Input.MouseMode = Input.MouseModeEnum.Visible; DelayedUnpause(); //CallDeferred(MethodName.DelayedUnpause); diff --git a/Scripts/GlobalState.cs b/Scripts/GlobalState.cs index 9882ed72..c5935d31 100644 --- a/Scripts/GlobalState.cs +++ b/Scripts/GlobalState.cs @@ -23,7 +23,7 @@ public partial class GlobalState : Node private Control _loadingPlaque; private readonly StringName _menuMouseTexturePath = "uid://d3oxwik1uoe4j"; - private readonly StringName _reticuleMouseTexturePath = "uid://8nns6w0skiy3"; + private readonly StringName _reticuleMouseTexturePath = "uid://b76bhqv247nft"; private readonly StringName _mapsDatabaseResource = "uid://blf2ii0j3fqil"; @@ -31,7 +31,11 @@ public partial class GlobalState : Node private Texture2D _menuMouseTexture; private Image _menuMouseImage; + private Texture2D _reticuleMouseTexture; + private Image _reticuleMouseImage; + public bool UseMenuCursor { get; set; } = true; + public override void _Ready() { Instance = this; @@ -48,6 +52,9 @@ public partial class GlobalState : Node _menuMouseTexture = ResourceLoader.Load(_menuMouseTexturePath); _menuMouseImage = _menuMouseTexture.GetImage(); + + _reticuleMouseTexture = ResourceLoader.Load(_reticuleMouseTexturePath); + _reticuleMouseImage = _reticuleMouseTexture.GetImage(); GetTree().GetRoot().SizeChanged += OnSizeChanged; //_mouseTexture = @@ -60,6 +67,12 @@ public partial class GlobalState : Node ResizeCursor(); } + public void ChangeCursor(bool useMenu) + { + UseMenuCursor = useMenu; + ResizeCursor(); + } + public void ResizeCursor() { var root = GetTree().GetRoot(); @@ -70,7 +83,7 @@ public partial class GlobalState : Node int scaleY = newSize.Y / baseSize.Y; int scale = Math.Min(scaleX, scaleY); // Ensure pixel-perfect scaling - ResizeCursor(scale / 2); + ResizeCursor(UseMenuCursor ? scale / 2 : scale, UseMenuCursor); } public void GotoScene(string path) @@ -264,15 +277,27 @@ public partial class GlobalState : Node return true; } - public void ResizeCursor(float scale) + private void ResizeCursor(float scale, bool useMenuCursor) { - var scaled = (Image)_menuMouseImage.Duplicate(); - - var size = (Vector2I)(scale * _menuMouseTexture.GetSize()); + Image scaled; + Vector2I size; + if (useMenuCursor) + { + scaled = (Image)_menuMouseImage.Duplicate(); + size = (Vector2I)(scale * _menuMouseTexture.GetSize()); + + } + else + { + scaled = (Image)_reticuleMouseImage.Duplicate(); + size = (Vector2I)(scale * _reticuleMouseTexture.GetSize()); + } scaled.Resize(size.X, size.Y, Image.Interpolation.Nearest); - DisplayServer.CursorSetCustomImage(scaled); + Input.SetCustomMouseCursor(scaled, Input.CursorShape.Arrow, useMenuCursor ? Vector2.Zero : new Vector2(size.X / 2,size.Y / 2)); + + //DisplayServer.CursorSetCustomImage(scaled); } public void RestartLevel() diff --git a/Scripts/MainMenu.cs b/Scripts/MainMenu.cs index 0a19dac2..cd1224db 100644 --- a/Scripts/MainMenu.cs +++ b/Scripts/MainMenu.cs @@ -46,6 +46,7 @@ public partial class MainMenu : CanvasLayer public override void _Ready() { DefaultSelectedButton.GrabFocus(); + GlobalState.Instance.ChangeCursor(true); } // Called every frame. 'delta' is the elapsed time since the previous frame. diff --git a/Scripts/UI/PauseMenu.cs b/Scripts/UI/PauseMenu.cs index 9281d4c5..0c8ace62 100644 --- a/Scripts/UI/PauseMenu.cs +++ b/Scripts/UI/PauseMenu.cs @@ -62,6 +62,7 @@ public partial class PauseMenu : Control private void QuitButtonOnPressed() { _gameManager.Unpause(); + GlobalState.Instance.ChangeCursor(true); GlobalState.Instance.GotoScene(MainMenuScene); //GetTree().ChangeSceneToFile(MainMenuScene); } diff --git a/Sprites/UI/Aiming_Reticule_Cursor.ase b/Sprites/UI/Aiming_Reticule_Cursor.ase new file mode 100644 index 0000000000000000000000000000000000000000..cedc154417dc03103af6883fb1998a3fbbf286eb GIT binary patch literal 469 zcmcc0$iVPmDIyADL{+>4h)PSK?VUJqy-2Cn*Qq}3)of`pao(;%&q{o63Mz# zKsE~lP}G5qjYC90*jik*SX_6Dg4TUIm;Jf@|NsAgpAY=Hw&Ux9=`XU1_jt{&v}$lL4pvbz zQIe4|($*++wBB9netSvsmrHYQJ$SWw=f&>H>vKzcy+V?VEghXyjH3-L`htRXm1e!% zy7=+4|2y~pZkhcgqIaKrZL4y+pHWLn?E2nGcXplq{^-f2RmV4UFKA1uOb?Cnb8)gX zkq7xiff>nf|AB0F2A{;r)FK5#Hz0>qfq{Vs2>&y|RB