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