From bcdfe45cc3d0b60eb7d3ce7c3aa470c23be35fd9 Mon Sep 17 00:00:00 2001 From: copygirl Date: Thu, 13 May 2021 12:56:41 +0200 Subject: [PATCH] Select items with scroll wheel - Add fading effect to radial menu - Rename place/break input to primary/secondary --- project.godot | 30 ++++++++++++------ src/Items/CreativeBuilding.cs | 8 ++--- src/Items/Weapon.cs | 3 +- src/RadialMenu.cs | 59 +++++++++++++++++++++++++++++------ 4 files changed, 75 insertions(+), 25 deletions(-) diff --git a/project.godot b/project.godot index f53cc80..ba9cf39 100644 --- a/project.godot +++ b/project.godot @@ -53,12 +53,6 @@ texture={ [input] -ui_menu={ -"deadzone": 0.5, -"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777217,"unicode":0,"echo":false,"script":null) -, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":11,"pressure":0.0,"pressed":false,"script":null) - ] -} move_left={ "deadzone": 0.5, "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":65,"unicode":0,"echo":false,"script":null) @@ -78,19 +72,35 @@ move_jump={ , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":1,"pressure":0.0,"pressed":false,"script":null) ] } +interact_primary={ +"deadzone": 0.5, +"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"pressed":false,"doubleclick":false,"script":null) + ] +} +interact_secondary={ +"deadzone": 0.5, +"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":2,"pressed":false,"doubleclick":false,"script":null) + ] +} interact_select={ "deadzone": 0.5, "events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":3,"pressed":false,"doubleclick":false,"script":null) ] } -interact_place={ +interact_select_dec={ "deadzone": 0.5, -"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"pressed":false,"doubleclick":false,"script":null) +"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":4,"pressed":false,"doubleclick":false,"script":null) ] } -interact_break={ +interact_select_inc={ "deadzone": 0.5, -"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":2,"pressed":false,"doubleclick":false,"script":null) +"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":5,"pressed":false,"doubleclick":false,"script":null) + ] +} +ui_menu={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777217,"unicode":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":11,"pressure":0.0,"pressed":false,"script":null) ] } diff --git a/src/Items/CreativeBuilding.cs b/src/Items/CreativeBuilding.cs index 4bcb42a..5009e31 100644 --- a/src/Items/CreativeBuilding.cs +++ b/src/Items/CreativeBuilding.cs @@ -37,11 +37,11 @@ public class CreativeBuilding : Node2D { if (!Visible || !(Player is LocalPlayer)) return; - if (ev.IsActionPressed("interact_place")) { + if (ev.IsActionPressed("interact_primary")) { GetTree().SetInputAsHandled(); _currentMode = (((_currentMode == null) && _canBuild) ? BuildMode.Placing : (BuildMode?)null); } - if (ev.IsActionPressed("interact_break")) { + if (ev.IsActionPressed("interact_secondary")) { GetTree().SetInputAsHandled(); _currentMode = ((_currentMode == null) ? BuildMode.Breaking : (BuildMode?)null); } @@ -56,14 +56,14 @@ public class CreativeBuilding : Node2D if (_currentMode == BuildMode.Placing) { if (!_canBuild) _currentMode = null; - else if (!Input.IsActionPressed("interact_place")) { + else if (!Input.IsActionPressed("interact_primary")) { RpcId(1, nameof(PlaceLine), _startPos.X, _startPos.Y, _direction, _length); _currentMode = null; } } if (_currentMode == BuildMode.Breaking) { - if (!Input.IsActionPressed("interact_break")) { + if (!Input.IsActionPressed("interact_secondary")) { RpcId(1, nameof(BreakLine), _startPos.X, _startPos.Y, _direction, _length); _currentMode = null; } diff --git a/src/Items/Weapon.cs b/src/Items/Weapon.cs index 012a4d0..465166d 100644 --- a/src/Items/Weapon.cs +++ b/src/Items/Weapon.cs @@ -35,8 +35,7 @@ public class Weapon : Sprite { if (!(Player is LocalPlayer)) return; - // TODO: Is not "place", is shoot! - if (ev.IsActionPressed("interact_place")) { + if (ev.IsActionPressed("interact_primary")) { GetNodeOrNull("Fire")?.Play(); // TODO: Spawn bullet or something. // TODO: Tell server (and other clients) we shot. diff --git a/src/RadialMenu.cs b/src/RadialMenu.cs index cc767a5..1fb28e4 100644 --- a/src/RadialMenu.cs +++ b/src/RadialMenu.cs @@ -13,6 +13,7 @@ public class RadialMenu : Node2D private float _startAngle; private Node2D _selected; + private DateTime? _showUntil; public override void _Ready() { @@ -29,36 +30,76 @@ public class RadialMenu : Node2D { if (ev.IsActionPressed("interact_select")) { Position = this.GetClient().Cursor.ScreenPosition.Round(); - Visible = true; + Visible = true; + Modulate = Colors.White; var items = GetItems(); _selected = items.Current; items.Current = null; + _showUntil = null; + ActiveName.Text = _selected?.Name ?? ""; + Update(); + } + if (ev.IsActionPressed("interact_select_dec") || ev.IsActionPressed("interact_select_inc")) { + var diff = ev.IsActionPressed("interact_select_inc") ? 1 : -1; + var items = GetItems(); + // TODO: Should current item be equipped until radial menu disappears again? + // Perhaps for balance reasons? + + if (Visible && (_showUntil == null)) { + // Don't do anything if radial menu is show due to selection + // being open and the mouse is outside of the selection radius. + var cursor = ToLocal(this.GetClient().Cursor.ScreenPosition); + if (cursor.Length() > InnerRadius) return; + } else { + Position = this.GetClient().LocalPlayer.GetGlobalTransformWithCanvas().origin; + _selected = items.Current; + _showUntil = DateTime.Now + TimeSpan.FromSeconds(0.6); + Visible = true; + Modulate = Colors.White; + } + + if (_selected == null) { + if (items.Count == 0) return; + _selected = items.Current = items[0]; + } else { + var index = _selected.GetIndex(); + _selected = items.Current = items[Mathf.PosMod(index + diff, items.Count)]; + } ActiveName.Text = _selected?.Name ?? ""; Update(); } - // TODO: Add scrollwheel support. } public override void _Process(float delta) { if (!Visible) return; - var items = GetItems(); - var cursorPos = ToLocal(this.GetClient().Cursor.ScreenPosition); - var angle = cursorPos.Angle() - _startAngle; - var index = (int)((angle / Mathf.Tau + 1) % 1 * MinElements); - if ((cursorPos.Length() > InnerRadius) && (index < items.Count) && (items[index] != _selected)) { + if (_showUntil != null) { + if (DateTime.Now >= _showUntil) { + Modulate = new Color(Modulate, Modulate.a - delta * 3); + if (Modulate.a <= 0) { + _showUntil = null; + Visible = false; + } + } + return; + } + + var items = GetItems(); + var cursor = ToLocal(this.GetClient().Cursor.ScreenPosition); + var angle = cursor.Angle() - _startAngle; + var index = (int)((angle / Mathf.Tau + 1) % 1 * MinElements); + if ((cursor.Length() > InnerRadius) && (index < items.Count) && (items[index] != _selected)) { _selected = items[index]; ActiveName.Text = _selected?.Name ?? ""; Update(); } if (!Input.IsActionPressed("interact_select")) { - Visible = false; + _showUntil = DateTime.Now; items.Current = _selected; - Update(); } }