diff --git a/DungeonShooting_Godot/prefab/ui/RoomUI.tscn b/DungeonShooting_Godot/prefab/ui/RoomUI.tscn index 928fcf4..e0a86af 100644 --- a/DungeonShooting_Godot/prefab/ui/RoomUI.tscn +++ b/DungeonShooting_Godot/prefab/ui/RoomUI.tscn @@ -367,8 +367,6 @@ [node name="WeaponRoulette" parent="." instance=ExtResource("17_ydc4r")] layout_mode = 1 -grow_horizontal = 2 -grow_vertical = 2 metadata/_edit_lock_ = true [node name="RoomMap" parent="." instance=ExtResource("16_rp3sg")] diff --git a/DungeonShooting_Godot/prefab/ui/WeaponRoulette.tscn b/DungeonShooting_Godot/prefab/ui/WeaponRoulette.tscn index 99cbb14..8850c5a 100644 --- a/DungeonShooting_Godot/prefab/ui/WeaponRoulette.tscn +++ b/DungeonShooting_Godot/prefab/ui/WeaponRoulette.tscn @@ -1,16 +1,97 @@ -[gd_scene load_steps=3 format=3 uid="uid://dbjpknb3d5gfw"] +[gd_scene load_steps=7 format=3 uid="uid://dbjpknb3d5gfw"] [ext_resource type="Script" path="res://src/game/ui/weaponRoulette/WeaponRoulettePanel.cs" id="1_1uvbk"] -[ext_resource type="Texture2D" uid="uid://uhhfgdhpk7i4" path="res://icon.png" id="2_yfusg"] +[ext_resource type="Texture2D" uid="uid://e6krxgte01j3" path="res://resource/sprite/ui/roulette/RouletteBg.png" id="2_k6gjh"] +[ext_resource type="Script" path="res://src/game/ui/weaponRoulette/WeaponSlot.cs" id="3_8v011"] +[ext_resource type="Shader" path="res://resource/material/Outline.gdshader" id="4_p348k"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_i1wmw"] +resource_local_to_scene = true +shader = ExtResource("4_p348k") +shader_parameter/outline_color = Color(0, 0, 0, 1) + +[sub_resource type="CircleShape2D" id="CircleShape2D_snfa8"] +radius = 2.0 [node name="WeaponRoulette" type="Control"] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 script = ExtResource("1_1uvbk") -[node name="Icon" type="Sprite2D" parent="."] -visible = false -position = Vector2(113, 116) -texture = ExtResource("2_yfusg") +[node name="Bg" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 0.588235) + +[node name="Control" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -0.5 +offset_top = -20.0 +offset_right = 0.5 +offset_bottom = -19.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="RouletteBg" type="Sprite2D" parent="Control"] +position = Vector2(32.5, -27) +scale = Vector2(4, 4) +texture = ExtResource("2_k6gjh") + +[node name="WeaponSlotNode" type="Node2D" parent="Control/RouletteBg"] +script = ExtResource("3_8v011") + +[node name="Control" type="Control" parent="Control/RouletteBg/WeaponSlotNode"] +layout_mode = 3 +anchors_preset = 0 +offset_left = 65.25 +offset_right = 66.25 +offset_bottom = 1.0 + +[node name="WeaponIcon" type="Sprite2D" parent="Control/RouletteBg/WeaponSlotNode/Control"] +material = SubResource("ShaderMaterial_i1wmw") + +[node name="AmmoLabel" type="Label" parent="Control/RouletteBg/WeaponSlotNode/Control"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -15.25 +offset_top = 4.5 +offset_right = 104.75 +offset_bottom = 44.5 +grow_horizontal = 2 +grow_vertical = 2 +scale = Vector2(0.25, 0.25) +text = "0/0" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="SlotAreaNode" type="Area2D" parent="Control/RouletteBg/WeaponSlotNode"] +collision_layer = 0 +collision_mask = 8192 +monitorable = false + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Control/RouletteBg/WeaponSlotNode/SlotAreaNode"] + +[node name="MouseArea" type="Area2D" parent="."] +collision_layer = 8192 +collision_mask = 0 +monitoring = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="MouseArea"] +shape = SubResource("CircleShape2D_snfa8") diff --git a/DungeonShooting_Godot/project.godot b/DungeonShooting_Godot/project.godot index fcc9734..7c6559c 100644 --- a/DungeonShooting_Godot/project.godot +++ b/DungeonShooting_Godot/project.godot @@ -252,6 +252,7 @@ 2d_physics/layer_8="debris" 2d_physics/layer_9="throwing" 2d_physics/layer_10="obstacle" +2d_physics/layer_14="ui_mouse" [mono] diff --git a/DungeonShooting_Godot/resource/sprite/Light.png b/DungeonShooting_Godot/resource/sprite/Light.png new file mode 100644 index 0000000..e5d1fcd --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/Light.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/Light.png.import b/DungeonShooting_Godot/resource/sprite/Light.png.import new file mode 100644 index 0000000..22630da --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/Light.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d0c6oc02hkp4i" +path="res://.godot/imported/Light.png-9ee16c293926cdacc658fb283472a574.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/Light.png" +dest_files=["res://.godot/imported/Light.png-9ee16c293926cdacc658fb283472a574.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/DungeonShooting_Godot/resource/sprite/ui/roulette/RouletteBg.png b/DungeonShooting_Godot/resource/sprite/ui/roulette/RouletteBg.png new file mode 100644 index 0000000..3518e20 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/ui/roulette/RouletteBg.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/ui/roulette/RouletteBg.png.import b/DungeonShooting_Godot/resource/sprite/ui/roulette/RouletteBg.png.import new file mode 100644 index 0000000..91d39df --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/ui/roulette/RouletteBg.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://e6krxgte01j3" +path="res://.godot/imported/RouletteBg.png-a8e0ab7b49cd64da4b7f4e5bab210d71.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/ui/roulette/RouletteBg.png" +dest_files=["res://.godot/imported/RouletteBg.png-a8e0ab7b49cd64da4b7f4e5bab210d71.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/DungeonShooting_Godot/scene/Hall.tscn b/DungeonShooting_Godot/scene/Hall.tscn index 878643e..0aff9b6 100644 --- a/DungeonShooting_Godot/scene/Hall.tscn +++ b/DungeonShooting_Godot/scene/Hall.tscn @@ -110,6 +110,7 @@ shape = SubResource("RectangleShape2D_ru8u4") [node name="StaticBody2D" type="StaticBody2D" parent="." index="5"] +visible = false collision_mask = 0 [node name="CollisionShape2D" type="CollisionShape2D" parent="StaticBody2D" index="0"] @@ -152,7 +153,7 @@ ShowOffset = Vector2(2.08165e-12, 2) CollisionVisible = false -[node name="Sprite2D" type="Sprite2D" parent="ItemRoot/Item0006" index="1"] +[node name="Sprite2D" type="Sprite2D" parent="ItemRoot/Item0006" index="0"] position = Vector2(-10, -7) texture = ExtResource("7_30qwa") @@ -164,7 +165,7 @@ ShowOffset = Vector2(2.08165e-12, 2) CollisionVisible = false -[node name="ActivityInstance" type="Node2D" parent="ItemRoot/Item0008" index="1"] +[node name="ActivityInstance" type="Node2D" parent="ItemRoot/Item0008" index="0"] position = Vector2(2.5, -12) script = ExtResource("5_lowqi") Id = "item_0031" @@ -180,7 +181,7 @@ ShowOffset = Vector2(2.08165e-12, 2) CollisionVisible = false -[node name="Item26" type="Sprite2D" parent="ItemRoot/Item0013" index="1"] +[node name="Item26" type="Sprite2D" parent="ItemRoot/Item0013" index="0"] position = Vector2(18, -2) texture = ExtResource("8_61dkg") @@ -200,19 +201,19 @@ ShowOffset = Vector2(2.08165e-12, 2) CollisionVisible = false -[node name="Sprite2D" type="Sprite2D" parent="ItemRoot/Item0017" index="1"] +[node name="Sprite2D" type="Sprite2D" parent="ItemRoot/Item0017" index="0"] position = Vector2(-3, -16) texture = ExtResource("8_u3vry") -[node name="Sprite2D2" type="Sprite2D" parent="ItemRoot/Item0017" index="2"] +[node name="Sprite2D2" type="Sprite2D" parent="ItemRoot/Item0017" index="1"] position = Vector2(18, -11) texture = ExtResource("9_lhdr8") -[node name="Sprite2D3" type="Sprite2D" parent="ItemRoot/Item0017" index="3"] +[node name="Sprite2D3" type="Sprite2D" parent="ItemRoot/Item0017" index="2"] position = Vector2(-16, -8) texture = ExtResource("10_4eqn0") -[node name="Sprite2D4" type="Sprite2D" parent="ItemRoot/Item0017" index="4"] +[node name="Sprite2D4" type="Sprite2D" parent="ItemRoot/Item0017" index="3"] position = Vector2(10, -7) texture = ExtResource("11_tg3jo") @@ -244,11 +245,11 @@ DefaultLayer = 1 CollisionVisible = false -[node name="Sprite2D" type="Sprite2D" parent="ItemRoot/Item0002" index="1"] +[node name="Sprite2D" type="Sprite2D" parent="ItemRoot/Item0002" index="0"] position = Vector2(32, -2) texture = ExtResource("12_agfji") -[node name="Sprite2D2" type="Sprite2D" parent="ItemRoot/Item0002" index="2"] +[node name="Sprite2D2" type="Sprite2D" parent="ItemRoot/Item0002" index="1"] material = SubResource("ShaderMaterial_i7git") position = Vector2(0, -18) scale = Vector2(1, -1) @@ -266,7 +267,7 @@ Id = "item_0004" DefaultLayer = 1 -[node name="Sprite2D" type="Sprite2D" parent="ItemRoot/Item0004" index="1"] +[node name="Sprite2D" type="Sprite2D" parent="ItemRoot/Item0004" index="0"] position = Vector2(0, -17) texture = ExtResource("13_unnpl") @@ -300,15 +301,15 @@ Id = "item_0009" DefaultLayer = 1 -[node name="Sprite2D" type="Sprite2D" parent="ItemRoot/Item0009" index="1"] +[node name="Sprite2D" type="Sprite2D" parent="ItemRoot/Item0009" index="0"] position = Vector2(-24, -10) texture = ExtResource("15_h7524") -[node name="Sprite2D2" type="Sprite2D" parent="ItemRoot/Item0009" index="2"] +[node name="Sprite2D2" type="Sprite2D" parent="ItemRoot/Item0009" index="1"] position = Vector2(1, -10) texture = ExtResource("15_h7524") -[node name="Sprite2D3" type="Sprite2D" parent="ItemRoot/Item0009" index="3"] +[node name="Sprite2D3" type="Sprite2D" parent="ItemRoot/Item0009" index="2"] position = Vector2(37, -10) texture = ExtResource("15_h7524") @@ -342,7 +343,7 @@ Id = "item_0015" DefaultLayer = 1 -[node name="Slice04" type="Sprite2D" parent="ItemRoot/Item0015" index="1"] +[node name="Slice04" type="Sprite2D" parent="ItemRoot/Item0015" index="0"] position = Vector2(16, -9) texture = ExtResource("15_h7524") @@ -364,11 +365,11 @@ Id = "item_0019" DefaultLayer = 1 -[node name="Sprite2D" type="Sprite2D" parent="ItemRoot/Item0019" index="1"] +[node name="Sprite2D" type="Sprite2D" parent="ItemRoot/Item0019" index="0"] position = Vector2(-23, -7) texture = ExtResource("16_xj0e1") -[node name="Sprite2D2" type="Sprite2D" parent="ItemRoot/Item0019" index="2"] +[node name="Sprite2D2" type="Sprite2D" parent="ItemRoot/Item0019" index="1"] position = Vector2(24, -8) texture = ExtResource("17_gwwce") diff --git a/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs b/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs index bc71185..3009e94 100644 --- a/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs @@ -64,17 +64,12 @@ { if (UiManager.GetUiInstanceCount(UiManager.UiNames.PauseMenu) == 0) { - World.Current.Pause = true; - _pressMapFlag = true; - _isMagnifyMap = true; - MagnifyMap(); + ExpandMap(); } } else if (!InputManager.Map && _isMagnifyMap) //还原小地图 { - ResetMap(); - _isMagnifyMap = false; - World.Current.Pause = false; + ShrinkMap(); } } @@ -175,6 +170,27 @@ } } + /// + /// 执行展开地图 + /// + public void ExpandMap() + { + World.Current.Pause = true; + _pressMapFlag = true; + _isMagnifyMap = true; + MagnifyMap(); + } + + /// + /// 执行收起地图 + /// + public void ShrinkMap() + { + ResetMap(); + _isMagnifyMap = false; + World.Current.Pause = false; + } + private void OnDrawContainerResized() { S_Mark.Instance.Position = S_DrawContainer.Instance.Size / 2; diff --git a/DungeonShooting_Godot/src/game/ui/roomUI/RoomUIPanel.cs b/DungeonShooting_Godot/src/game/ui/roomUI/RoomUIPanel.cs index 70dfb0d..466618c 100644 --- a/DungeonShooting_Godot/src/game/ui/roomUI/RoomUIPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/roomUI/RoomUIPanel.cs @@ -16,6 +16,8 @@ private EventFactory _factory; + private bool _showMap = false; + public override void OnCreateUi() { _reloadBar = new ReloadBarHandler(L_ReloadBar); @@ -64,6 +66,8 @@ _weaponBar.Process(delta); _activePropBar.Process(delta); _lifeBar.Process(delta); + + } //玩家拾起道具, 弹出提示 diff --git a/DungeonShooting_Godot/src/game/ui/weaponRoulette/WeaponRoulette.cs b/DungeonShooting_Godot/src/game/ui/weaponRoulette/WeaponRoulette.cs index 65cb7a5..a078918 100644 --- a/DungeonShooting_Godot/src/game/ui/weaponRoulette/WeaponRoulette.cs +++ b/DungeonShooting_Godot/src/game/ui/weaponRoulette/WeaponRoulette.cs @@ -6,17 +6,43 @@ public abstract partial class WeaponRoulette : UiBase { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: WeaponRoulette.Icon + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: WeaponRoulette.Bg /// - public Icon L_Icon + public Bg L_Bg { get { - if (_L_Icon == null) _L_Icon = new Icon((WeaponRoulettePanel)this, GetNode("Icon")); - return _L_Icon; + if (_L_Bg == null) _L_Bg = new Bg((WeaponRoulettePanel)this, GetNode("Bg")); + return _L_Bg; } } - private Icon _L_Icon; + private Bg _L_Bg; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: WeaponRoulette.Control + /// + public Control L_Control + { + get + { + if (_L_Control == null) _L_Control = new Control((WeaponRoulettePanel)this, GetNode("Control")); + return _L_Control; + } + } + private Control _L_Control; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: WeaponRoulette.MouseArea + /// + public MouseArea L_MouseArea + { + get + { + if (_L_MouseArea == null) _L_MouseArea = new MouseArea((WeaponRoulettePanel)this, GetNode("MouseArea")); + return _L_MouseArea; + } + } + private MouseArea _L_MouseArea; public WeaponRoulette() : base(nameof(WeaponRoulette)) @@ -25,22 +51,257 @@ public sealed override void OnInitNestedUi() { + _ = L_Control.L_RouletteBg.L_WeaponSlotNode; } /// - /// 类型: , 路径: WeaponRoulette.Icon + /// 类型: , 路径: WeaponRoulette.Bg /// - public class Icon : UiNode + public class Bg : UiNode { - public Icon(WeaponRoulettePanel uiPanel, Godot.Sprite2D node) : base(uiPanel, node) { } - public override Icon Clone() => new (UiPanel, (Godot.Sprite2D)Instance.Duplicate()); + public Bg(WeaponRoulettePanel uiPanel, Godot.ColorRect node) : base(uiPanel, node) { } + public override Bg Clone() => new (UiPanel, (Godot.ColorRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: WeaponRoulette.Control.RouletteBg.WeaponSlotNode.Control.WeaponIcon + /// + public class WeaponIcon : UiNode + { + public WeaponIcon(WeaponRoulettePanel uiPanel, Godot.Sprite2D node) : base(uiPanel, node) { } + public override WeaponIcon Clone() => new (UiPanel, (Godot.Sprite2D)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: WeaponRoulette.Control.RouletteBg.WeaponSlotNode.Control.AmmoLabel + /// + public class AmmoLabel : UiNode + { + public AmmoLabel(WeaponRoulettePanel uiPanel, Godot.Label node) : base(uiPanel, node) { } + public override AmmoLabel Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: WeaponRoulette.Control.RouletteBg.WeaponSlotNode.Control + /// + public class Control_1 : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: WeaponRoulette.Control.RouletteBg.WeaponSlotNode.WeaponIcon + /// + public WeaponIcon L_WeaponIcon + { + get + { + if (_L_WeaponIcon == null) _L_WeaponIcon = new WeaponIcon(UiPanel, Instance.GetNode("WeaponIcon")); + return _L_WeaponIcon; + } + } + private WeaponIcon _L_WeaponIcon; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: WeaponRoulette.Control.RouletteBg.WeaponSlotNode.AmmoLabel + /// + public AmmoLabel L_AmmoLabel + { + get + { + if (_L_AmmoLabel == null) _L_AmmoLabel = new AmmoLabel(UiPanel, Instance.GetNode("AmmoLabel")); + return _L_AmmoLabel; + } + } + private AmmoLabel _L_AmmoLabel; + + public Control_1(WeaponRoulettePanel uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override Control_1 Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: WeaponRoulette.Control.RouletteBg.WeaponSlotNode.SlotAreaNode.CollisionPolygon2D + /// + public class CollisionPolygon2D : UiNode + { + public CollisionPolygon2D(WeaponRoulettePanel uiPanel, Godot.CollisionPolygon2D node) : base(uiPanel, node) { } + public override CollisionPolygon2D Clone() => new (UiPanel, (Godot.CollisionPolygon2D)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: WeaponRoulette.Control.RouletteBg.WeaponSlotNode.SlotAreaNode + /// + public class SlotAreaNode : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: WeaponRoulette.Control.RouletteBg.WeaponSlotNode.CollisionPolygon2D + /// + public CollisionPolygon2D L_CollisionPolygon2D + { + get + { + if (_L_CollisionPolygon2D == null) _L_CollisionPolygon2D = new CollisionPolygon2D(UiPanel, Instance.GetNode("CollisionPolygon2D")); + return _L_CollisionPolygon2D; + } + } + private CollisionPolygon2D _L_CollisionPolygon2D; + + public SlotAreaNode(WeaponRoulettePanel uiPanel, Godot.Area2D node) : base(uiPanel, node) { } + public override SlotAreaNode Clone() => new (UiPanel, (Godot.Area2D)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: WeaponRoulette.Control.RouletteBg.WeaponSlotNode + /// + public class WeaponSlotNode : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: WeaponRoulette.Control.RouletteBg.Control + /// + public Control_1 L_Control + { + get + { + if (_L_Control == null) _L_Control = new Control_1(UiPanel, Instance.GetNode("Control")); + return _L_Control; + } + } + private Control_1 _L_Control; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: WeaponRoulette.Control.RouletteBg.SlotAreaNode + /// + public SlotAreaNode L_SlotAreaNode + { + get + { + if (_L_SlotAreaNode == null) _L_SlotAreaNode = new SlotAreaNode(UiPanel, Instance.GetNode("SlotAreaNode")); + return _L_SlotAreaNode; + } + } + private SlotAreaNode _L_SlotAreaNode; + + public WeaponSlotNode(WeaponRoulettePanel uiPanel, UI.WeaponRoulette.WeaponSlot node) : base(uiPanel, node) { } + public override WeaponSlotNode Clone() => new (UiPanel, (UI.WeaponRoulette.WeaponSlot)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: WeaponRoulette.Control.RouletteBg + /// + public class RouletteBg : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: WeaponRoulette.Control.WeaponSlotNode + /// + public WeaponSlotNode L_WeaponSlotNode + { + get + { + if (_L_WeaponSlotNode == null) _L_WeaponSlotNode = new WeaponSlotNode(UiPanel, Instance.GetNode("WeaponSlotNode")); + return _L_WeaponSlotNode; + } + } + private WeaponSlotNode _L_WeaponSlotNode; + + public RouletteBg(WeaponRoulettePanel uiPanel, Godot.Sprite2D node) : base(uiPanel, node) { } + public override RouletteBg Clone() => new (UiPanel, (Godot.Sprite2D)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: WeaponRoulette.Control + /// + public class Control : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: WeaponRoulette.RouletteBg + /// + public RouletteBg L_RouletteBg + { + get + { + if (_L_RouletteBg == null) _L_RouletteBg = new RouletteBg(UiPanel, Instance.GetNode("RouletteBg")); + return _L_RouletteBg; + } + } + private RouletteBg _L_RouletteBg; + + public Control(WeaponRoulettePanel uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override Control Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: WeaponRoulette.MouseArea.CollisionShape2D + /// + public class CollisionShape2D : UiNode + { + public CollisionShape2D(WeaponRoulettePanel uiPanel, Godot.CollisionShape2D node) : base(uiPanel, node) { } + public override CollisionShape2D Clone() => new (UiPanel, (Godot.CollisionShape2D)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: WeaponRoulette.MouseArea + /// + public class MouseArea : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: WeaponRoulette.CollisionShape2D + /// + public CollisionShape2D L_CollisionShape2D + { + get + { + if (_L_CollisionShape2D == null) _L_CollisionShape2D = new CollisionShape2D(UiPanel, Instance.GetNode("CollisionShape2D")); + return _L_CollisionShape2D; + } + } + private CollisionShape2D _L_CollisionShape2D; + + public MouseArea(WeaponRoulettePanel uiPanel, Godot.Area2D node) : base(uiPanel, node) { } + public override MouseArea Clone() => new (UiPanel, (Godot.Area2D)Instance.Duplicate()); } /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: WeaponRoulette.Icon + /// 场景中唯一名称的节点, 节点类型: , 节点路径: WeaponRoulette.Bg /// - public Icon S_Icon => L_Icon; + public Bg S_Bg => L_Bg; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: WeaponRoulette.Control.RouletteBg.WeaponSlotNode.Control.WeaponIcon + /// + public WeaponIcon S_WeaponIcon => L_Control.L_RouletteBg.L_WeaponSlotNode.L_Control.L_WeaponIcon; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: WeaponRoulette.Control.RouletteBg.WeaponSlotNode.Control.AmmoLabel + /// + public AmmoLabel S_AmmoLabel => L_Control.L_RouletteBg.L_WeaponSlotNode.L_Control.L_AmmoLabel; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: WeaponRoulette.Control.RouletteBg.WeaponSlotNode.SlotAreaNode.CollisionPolygon2D + /// + public CollisionPolygon2D S_CollisionPolygon2D => L_Control.L_RouletteBg.L_WeaponSlotNode.L_SlotAreaNode.L_CollisionPolygon2D; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: WeaponRoulette.Control.RouletteBg.WeaponSlotNode.SlotAreaNode + /// + public SlotAreaNode S_SlotAreaNode => L_Control.L_RouletteBg.L_WeaponSlotNode.L_SlotAreaNode; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: WeaponRoulette.Control.RouletteBg.WeaponSlotNode + /// + public WeaponSlotNode S_WeaponSlotNode => L_Control.L_RouletteBg.L_WeaponSlotNode; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: WeaponRoulette.Control.RouletteBg + /// + public RouletteBg S_RouletteBg => L_Control.L_RouletteBg; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: WeaponRoulette.MouseArea.CollisionShape2D + /// + public CollisionShape2D S_CollisionShape2D => L_MouseArea.L_CollisionShape2D; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: WeaponRoulette.MouseArea + /// + public MouseArea S_MouseArea => L_MouseArea; } diff --git a/DungeonShooting_Godot/src/game/ui/weaponRoulette/WeaponRoulettePanel.cs b/DungeonShooting_Godot/src/game/ui/weaponRoulette/WeaponRoulettePanel.cs index 504f694..165e43b 100644 --- a/DungeonShooting_Godot/src/game/ui/weaponRoulette/WeaponRoulettePanel.cs +++ b/DungeonShooting_Godot/src/game/ui/weaponRoulette/WeaponRoulettePanel.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using Godot; namespace UI.WeaponRoulette; @@ -7,13 +8,39 @@ /// public partial class WeaponRoulettePanel : WeaponRoulette { + /// + /// 武器槽数量 + /// + public const int SlotCount = 6; //是否展开轮盘 private bool _pressRouletteFlag = false; + private bool _isMagnifyRoulette = false; + //所有武器插槽 + private List _slotNodes = new List(); public override void OnCreateUi() { + S_RouletteBg.Instance.Visible = false; + S_Bg.Instance.Visible = false; + + //创建武器插槽 + for (var i = 0; i < SlotCount; i++) + { + var angle = i * (360f / SlotCount); + var clone = S_WeaponSlotNode.CloneAndPut(); + var collisionPolygon2D = clone.L_SlotAreaNode.L_CollisionPolygon2D.Instance; + var sectorPolygon = Utils.CreateSectorPolygon(0, 100, 360f / SlotCount, 4); + collisionPolygon2D.Polygon = sectorPolygon; + clone.Instance.RotationDegrees = angle; + clone.L_Control.Instance.RotationDegrees = -angle; + clone.L_Control.L_WeaponIcon.Instance.Material = (Material)S_WeaponSlotNode.L_Control.L_WeaponIcon.Instance.Material.Duplicate(); + _slotNodes.Add(clone); + } + S_WeaponSlotNode.QueueFree(); + + SetEnableSectorCollision(false); } public override void OnDestroyUi() @@ -27,5 +54,97 @@ { _pressRouletteFlag = false; } + + //按下地图按键 + if (InputManager.Roulette && !_isMagnifyRoulette) //打开轮盘 + { + if (UiManager.GetUiInstanceCount(UiManager.UiNames.PauseMenu) == 0) + { + ExpandRoulette(); + } + } + else if (!InputManager.Roulette && _isMagnifyRoulette) //缩小轮盘 + { + ShrinkRoulette(); + } + + + if (InputManager.Roulette) + { + S_MouseArea.Instance.GlobalPosition = GetGlobalMousePosition(); + } + } + + private void ExpandRoulette() + { + World.Current.Pause = true; + _pressRouletteFlag = true; + _isMagnifyRoulette = true; + + S_RouletteBg.Instance.Visible = true; + S_Bg.Instance.Visible = true; + SetEnableSectorCollision(true); + RefreshWeapon(); + } + + private void ShrinkRoulette() + { + S_RouletteBg.Instance.Visible = false; + S_Bg.Instance.Visible = false; + + _isMagnifyRoulette = false; + World.Current.Pause = false; + SetEnableSectorCollision(false); + } + + //设置是否启用扇形碰撞检测 + private void SetEnableSectorCollision(bool enable) + { + S_MouseArea.Instance.Monitorable = enable; + foreach (var weaponSlotNode in _slotNodes) + { + weaponSlotNode.L_SlotAreaNode.Instance.Monitorable = enable; + } + } + + //更新显示的武器 + private void RefreshWeapon() + { + var current = Player.Current; + if (current == null) + { + foreach (var slotNode in _slotNodes) + { + slotNode.L_Control.Instance.Visible = false; + } + + return; + } + + var weapons = current.WeaponPack.ItemSlot; + for (var i = 0; i < _slotNodes.Count; i++) + { + var slotNode = _slotNodes[i]; + slotNode.L_Control.Instance.Visible = true; + if (weapons.Length > i) + { + var weapon = weapons[i]; + if (weapon != null) + { + slotNode.L_Control.Instance.Visible = true; + slotNode.L_Control.L_WeaponIcon.Instance.Texture = weapon.GetDefaultTexture(); + slotNode.L_Control.L_AmmoLabel.Instance.Text = + (weapon.CurrAmmo + weapon.ResidueAmmo).ToString() + "/" + weapon.Attribute.MaxAmmoCapacity; + } + else + { + slotNode.L_Control.Instance.Visible = false; + } + } + else + { + slotNode.L_Control.Instance.Visible = false; + } + } } } diff --git a/DungeonShooting_Godot/src/game/ui/weaponRoulette/WeaponSlot.cs b/DungeonShooting_Godot/src/game/ui/weaponRoulette/WeaponSlot.cs new file mode 100644 index 0000000..37922c1 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/weaponRoulette/WeaponSlot.cs @@ -0,0 +1,30 @@ +using Godot; + +namespace UI.WeaponRoulette; + +public partial class WeaponSlot : Node2D, IUiNodeScript +{ + private WeaponRoulette.WeaponSlotNode _node; + public void SetUiNode(IUiNode uiNode) + { + _node = (WeaponRoulette.WeaponSlotNode)uiNode; + _node.L_SlotAreaNode.Instance.AreaEntered += OnAreaEntered; + _node.L_SlotAreaNode.Instance.AreaExited += OnAreaExited; + } + + public void OnDestroy() + { + } + + private void OnAreaEntered(Area2D other) + { + _node.Instance.Scale = new Vector2(1.1f, 1.1f); + _node.L_Control.L_WeaponIcon.Instance.Material.SetShaderMaterialParameter(ShaderParamNames.OutlineColor, Colors.White); + } + + private void OnAreaExited(Area2D other) + { + _node.Instance.Scale = Vector2.One; + _node.L_Control.L_WeaponIcon.Instance.Material.SetShaderMaterialParameter(ShaderParamNames.OutlineColor, Colors.Black); + } +} \ No newline at end of file