From bc7a7e1c8b86b93fb419c61f50fa566402ff0beb Mon Sep 17 00:00:00 2001 From: lightyears Date: Mon, 20 Feb 2023 18:18:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86=E8=A7=92=E8=89=B2=E4=B8=8A?= =?UTF-8?q?=E4=B8=8B=E6=96=87=E8=8F=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Components/BattleActionMenu.cs | 21 ++++++++ Components/BattleActionMenu.tscn | 32 ++++++++++++ Components/BattleHUD.cs | 49 ++++++++++++++++++ Components/BattleHUD.tscn | 89 ++++++++++++++++++++++++++++++++ Models/BattleCharacter.cs | 27 ++++++++++ Models/BattleCharacter.tscn | 1 + Scenes/BattleScene.cs | 12 ++--- Scenes/BattleScene.tscn | 79 ++-------------------------- Tests/BattleSceneTest.cs | 12 ++++- Tests/BattleSceneTest.tscn | 60 ++++++++++++++++++++- 10 files changed, 296 insertions(+), 86 deletions(-) create mode 100644 Components/BattleActionMenu.cs create mode 100644 Components/BattleActionMenu.tscn create mode 100644 Components/BattleHUD.cs create mode 100644 Components/BattleHUD.tscn diff --git a/Components/BattleActionMenu.cs b/Components/BattleActionMenu.cs new file mode 100644 index 0000000..69d42cc --- /dev/null +++ b/Components/BattleActionMenu.cs @@ -0,0 +1,21 @@ +namespace CMSGame +{ + public partial class BattleActionMenu : VBoxContainer + { + public VBoxContainer DynamicActions; + + public Button ItemActionButton; + + public Button SkillActionButton; + + public Button CommandActionButton; + + public override void _Ready() + { + this.GetUniqueNode(ref ItemActionButton, nameof(ItemActionButton)); + this.GetUniqueNode(ref DynamicActions, nameof(DynamicActions)); + this.GetUniqueNode(ref SkillActionButton, nameof(SkillActionButton)); + this.GetUniqueNode(ref CommandActionButton, nameof(CommandActionButton)); + } + } +} diff --git a/Components/BattleActionMenu.tscn b/Components/BattleActionMenu.tscn new file mode 100644 index 0000000..b45be65 --- /dev/null +++ b/Components/BattleActionMenu.tscn @@ -0,0 +1,32 @@ +[gd_scene load_steps=2 format=3 uid="uid://bktklsml5d0jg"] + +[ext_resource type="Script" path="res://Components/BattleActionMenu.cs" id="1_0bfmk"] + +[node name="BattleActionMenu" type="VBoxContainer"] +anchors_preset = 4 +anchor_top = 0.5 +anchor_bottom = 0.5 +offset_top = -15.5 +offset_right = 40.0 +offset_bottom = 15.5 +grow_vertical = 2 +script = ExtResource("1_0bfmk") + +[node name="ItemActionButton" type="Button" parent="."] +unique_name_in_owner = true +layout_mode = 2 +text = "物品" + +[node name="DynamicActions" type="VBoxContainer" parent="."] +unique_name_in_owner = true +layout_mode = 2 + +[node name="SkillActionButton" type="Button" parent="."] +unique_name_in_owner = true +layout_mode = 2 +text = "技能" + +[node name="CommandActionButton" type="Button" parent="."] +unique_name_in_owner = true +layout_mode = 2 +text = "指挥" diff --git a/Components/BattleHUD.cs b/Components/BattleHUD.cs new file mode 100644 index 0000000..85542ab --- /dev/null +++ b/Components/BattleHUD.cs @@ -0,0 +1,49 @@ +namespace CMSGame +{ + public partial class BattleHUD : Control + { + public Vector2 LastMousePressedPosition; + + public Label BattleTimeLabel; + + public Popup PauseMenuPopup; + + public Popup SettingsMenuPopup; + + public BattleActionMenu BattleActionMenu; + + public override void _Ready() + { + this.GetUniqueNode(ref BattleTimeLabel, nameof(BattleTimeLabel)); + this.GetUniqueNode(ref PauseMenuPopup, nameof(PauseMenuPopup)); + this.GetUniqueNode(ref SettingsMenuPopup, nameof(SettingsMenuPopup)); + this.GetUniqueNode(ref BattleActionMenu, nameof(BattleActionMenu)); + } + + public override void _GuiInput(InputEvent @event) + { + if (@event is InputEventMouseButton mouseButtonEvent) + { + if (mouseButtonEvent.Pressed) + { + LastMousePressedPosition = mouseButtonEvent.Position; + var battleActionMenuRect = new Rect2(BattleActionMenu.Position, BattleActionMenu.Size); + if (!battleActionMenuRect.HasPoint(LastMousePressedPosition)) + { + BattleActionMenu.Visible = false; + } + + } + } + } + + public void ShowActionMenu(Vector2 position) + { + if (!BattleActionMenu.Visible) + { + BattleActionMenu.Position = position; + BattleActionMenu.Visible = true; + } + } + } +} diff --git a/Components/BattleHUD.tscn b/Components/BattleHUD.tscn new file mode 100644 index 0000000..bf3d3a9 --- /dev/null +++ b/Components/BattleHUD.tscn @@ -0,0 +1,89 @@ +[gd_scene load_steps=4 format=3 uid="uid://dyyrp4px1km16"] + +[ext_resource type="Script" path="res://Components/BattleHUD.cs" id="1_12a1x"] +[ext_resource type="PackedScene" path="res://Components/SettingsMenuPopup.tscn" id="2_t66a0"] +[ext_resource type="PackedScene" uid="uid://bktklsml5d0jg" path="res://Components/BattleActionMenu.tscn" id="3_0nyue"] + +[node name="BattleHUD" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 1 +script = ExtResource("1_12a1x") + +[node name="BattleTimeLabel" type="Label" parent="."] +unique_name_in_owner = true +layout_mode = 1 +offset_right = 41.0 +offset_bottom = 26.0 +text = "00:00" +metadata/_edit_use_anchors_ = true + +[node name="PauseBattleButton" type="Button" parent="."] +layout_mode = 1 +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -20.0 +offset_top = -23.0 +offset_right = 20.0 +grow_horizontal = 2 +grow_vertical = 0 +focus_mode = 0 +text = "按下 Space 暂停时间" + +[node name="PauseMenuPopup" type="Popup" parent="."] +unique_name_in_owner = true +size = Vector2i(242, 306) +borderless = false + +[node name="PauseMenu" type="VBoxContainer" parent="PauseMenuPopup"] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -86.0 +offset_top = -50.5 +offset_right = 86.0 +offset_bottom = 50.5 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 + +[node name="ResumeBattleButton" type="Button" parent="PauseMenuPopup/PauseMenu"] +unique_name_in_owner = true +layout_mode = 2 +text = "继续战斗" + +[node name="SettingsMenuButton" type="Button" parent="PauseMenuPopup/PauseMenu"] +unique_name_in_owner = true +layout_mode = 2 +text = "游戏设置" + +[node name="EscapeFromBattleButton" type="Button" parent="PauseMenuPopup/PauseMenu"] +unique_name_in_owner = true +layout_mode = 2 +text = "退出战斗" + +[node name="SettingsMenuPopup" parent="." instance=ExtResource("2_t66a0")] +unique_name_in_owner = true +visible = false +borderless = false + +[node name="BattleActionMenu" parent="." instance=ExtResource("3_0nyue")] +unique_name_in_owner = true +visible = false +layout_mode = 0 +anchors_preset = 0 +anchor_top = 0.0 +anchor_bottom = 0.0 +offset_top = 0.0 +offset_bottom = 31.0 +grow_vertical = 1 diff --git a/Models/BattleCharacter.cs b/Models/BattleCharacter.cs index 6bead73..1b7e0e3 100644 --- a/Models/BattleCharacter.cs +++ b/Models/BattleCharacter.cs @@ -2,8 +2,35 @@ namespace CMSGame { public partial class BattleCharacter : CharacterBody3D { + [Signal] + public delegate void MousePressedEventHandler(Vector3 position); + + [Export] + public Texture SpriteTexture; + public BattleFieldPosition BattleFieldPosition; public Character Character; + + public Sprite3D Sprite3D; + + public Label3D StatusLabel; + + public override void _Ready() + { + this.GetUniqueNode(ref Sprite3D, nameof(Sprite3D)); + this.GetUniqueNode(ref StatusLabel, nameof(StatusLabel)); + } + + public override void _InputEvent(Camera3D camera, InputEvent @event, Vector3 position, Vector3 normal, int shapeIdx) + { + if (@event is InputEventMouseButton mouseButtonEvent) + { + if (mouseButtonEvent.Pressed) + { + EmitSignal(SignalName.MousePressed, position); + } + } + } } } diff --git a/Models/BattleCharacter.tscn b/Models/BattleCharacter.tscn index 29bc14d..0ac270c 100644 --- a/Models/BattleCharacter.tscn +++ b/Models/BattleCharacter.tscn @@ -13,6 +13,7 @@ script = ExtResource("2_vbdi8") unique_name_in_owner = true [node name="Sprite3D" type="Sprite3D" parent="."] +unique_name_in_owner = true transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0) shaded = true alpha_cut = 2 diff --git a/Scenes/BattleScene.cs b/Scenes/BattleScene.cs index 3fbfec2..2d4928d 100644 --- a/Scenes/BattleScene.cs +++ b/Scenes/BattleScene.cs @@ -2,12 +2,12 @@ namespace CMSGame { public partial class BattleScene : Node3D { + public BattleHUD HUD; + public Popup PauseMenuPopup; public Popup SettingsMenuPopup; - public Label BattleTimeLabel; - public double Time; public bool IsPause = false; @@ -16,9 +16,9 @@ namespace CMSGame public override void _Ready() { - this.GetUniqueNode(ref PauseMenuPopup, nameof(PauseMenuPopup)); - this.GetUniqueNode(ref SettingsMenuPopup, nameof(SettingsMenuPopup)); - this.GetUniqueNode(ref BattleTimeLabel, nameof(BattleTimeLabel)); + this.GetUniqueNode(ref HUD, nameof(HUD)); + PauseMenuPopup = HUD.PauseMenuPopup; + SettingsMenuPopup = HUD.SettingsMenuPopup; } public override void _Process(double delta) @@ -44,7 +44,7 @@ namespace CMSGame public void UpdateUI() { - BattleTimeLabel.Text = TimeHelper.FormatTime(Time); + HUD.BattleTimeLabel.Text = TimeHelper.FormatTime(Time); } private void TogglePauseBattle() diff --git a/Scenes/BattleScene.tscn b/Scenes/BattleScene.tscn index b6f2218..689070d 100644 --- a/Scenes/BattleScene.tscn +++ b/Scenes/BattleScene.tscn @@ -1,7 +1,7 @@ -[gd_scene load_steps=10 format=3 uid="uid://cx6yq8awwkqv3"] +[gd_scene load_steps=10 format=3 uid="uid://cp6aa655vykt1"] [ext_resource type="Script" path="res://Scenes/BattleScene.cs" id="1_n6bn7"] -[ext_resource type="PackedScene" path="res://Components/SettingsMenuPopup.tscn" id="2_aucd7"] +[ext_resource type="PackedScene" uid="uid://dyyrp4px1km16" path="res://Components/BattleHUD.tscn" id="2_u4666"] [ext_resource type="Texture2D" uid="uid://dt1kwicn6i51e" path="res://Temp/Textures/SBS - Tiny Texture Pack - 256x256/256x256/Bricks/Bricks_05-256x256.png" id="3_swgxf"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_vrgig"] @@ -42,76 +42,8 @@ transform = Transform3D(1, 0, 0, 0, 0.939693, 0.34202, 0, -0.34202, 0.939693, 0, [node name="CanvasLayer" type="CanvasLayer" parent="Camera3D"] -[node name="HUD" type="Control" parent="Camera3D/CanvasLayer"] -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="BattleTimeLabel" type="Label" parent="Camera3D/CanvasLayer/HUD"] -unique_name_in_owner = true -layout_mode = 1 -offset_right = 41.0 -offset_bottom = 26.0 -text = "00:00" -metadata/_edit_use_anchors_ = true - -[node name="PauseBattleButton" type="Button" parent="Camera3D/CanvasLayer/HUD"] -layout_mode = 1 -anchors_preset = 7 -anchor_left = 0.5 -anchor_top = 1.0 -anchor_right = 0.5 -anchor_bottom = 1.0 -offset_left = -20.0 -offset_top = -23.0 -offset_right = 20.0 -grow_horizontal = 2 -grow_vertical = 0 -focus_mode = 0 -text = "按下 Space 暂停时间" - -[node name="PauseMenuPopup" type="Popup" parent="Camera3D/CanvasLayer/HUD"] -unique_name_in_owner = true -size = Vector2i(242, 306) -borderless = false - -[node name="PauseMenu" type="VBoxContainer" parent="Camera3D/CanvasLayer/HUD/PauseMenuPopup"] -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -86.0 -offset_top = -50.5 -offset_right = 86.0 -offset_bottom = 50.5 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 4 -size_flags_vertical = 4 - -[node name="ResumeBattleButton" type="Button" parent="Camera3D/CanvasLayer/HUD/PauseMenuPopup/PauseMenu"] -unique_name_in_owner = true -layout_mode = 2 -text = "继续战斗" - -[node name="SettingsMenuButton" type="Button" parent="Camera3D/CanvasLayer/HUD/PauseMenuPopup/PauseMenu"] +[node name="HUD" parent="Camera3D/CanvasLayer" instance=ExtResource("2_u4666")] unique_name_in_owner = true -layout_mode = 2 -text = "游戏设置" - -[node name="EscapeFromBattleButton" type="Button" parent="Camera3D/CanvasLayer/HUD/PauseMenuPopup/PauseMenu"] -unique_name_in_owner = true -layout_mode = 2 -text = "退出战斗" - -[node name="SettingsMenuPopup" parent="Camera3D/CanvasLayer/HUD" instance=ExtResource("2_aucd7")] -unique_name_in_owner = true -visible = false -borderless = false [node name="Ground" type="Node3D" parent="."] unique_name_in_owner = true @@ -131,8 +63,3 @@ shape = SubResource("WorldBoundaryShape3D_a4f8m") unique_name_in_owner = true [node name="Objects" type="Node3D" parent="."] - -[connection signal="pressed" from="Camera3D/CanvasLayer/HUD/PauseBattleButton" to="." method="On_PauseBattleButton_Pressed"] -[connection signal="popup_hide" from="Camera3D/CanvasLayer/HUD/PauseMenuPopup" to="." method="On_PauseMenuPopup_PopupHide"] -[connection signal="pressed" from="Camera3D/CanvasLayer/HUD/PauseMenuPopup/PauseMenu/ResumeBattleButton" to="." method="On_ResumeBattleButton_Pressed"] -[connection signal="pressed" from="Camera3D/CanvasLayer/HUD/PauseMenuPopup/PauseMenu/SettingsMenuButton" to="." method="On_SettingsMenuButton_Pressed"] diff --git a/Tests/BattleSceneTest.cs b/Tests/BattleSceneTest.cs index 49394e9..9f1e22d 100644 --- a/Tests/BattleSceneTest.cs +++ b/Tests/BattleSceneTest.cs @@ -2,8 +2,16 @@ namespace CMSGame { public partial class BattleSceneTest : Node3D { - public override void _Ready() + public BattleScene BattleScene; + + public override void _Ready() { - } + BattleScene = GetNode("BattleScene"); + } + + public void On_BattleCharacter_MousePressed(Vector3 _) + { + BattleScene.HUD.ShowActionMenu(BattleScene.HUD.LastMousePressedPosition); + } } } diff --git a/Tests/BattleSceneTest.tscn b/Tests/BattleSceneTest.tscn index e2e8f1f..80ef004 100644 --- a/Tests/BattleSceneTest.tscn +++ b/Tests/BattleSceneTest.tscn @@ -1,9 +1,65 @@ -[gd_scene load_steps=3 format=3 uid="uid://6phl40durwor"] +[gd_scene load_steps=10 format=3 uid="uid://6phl40durwor"] -[ext_resource type="PackedScene" uid="uid://cx6yq8awwkqv3" path="res://Scenes/BattleScene.tscn" id="1_fdqdi"] +[ext_resource type="PackedScene" uid="uid://cp6aa655vykt1" path="res://Scenes/BattleScene.tscn" id="1_fdqdi"] [ext_resource type="Script" path="res://Tests/BattleSceneTest.cs" id="1_tuul4"] +[ext_resource type="PackedScene" uid="uid://igk5375j1keq" path="res://Models/BattleCharacter.tscn" id="3_nau0d"] +[ext_resource type="Texture2D" uid="uid://w6qckexp2he1" path="res://Temp/Characters/2_73.png" id="4_jnah0"] +[ext_resource type="Texture2D" uid="uid://du6o3upum6lkr" path="res://Temp/Characters/3_0.png" id="5_4vahd"] +[ext_resource type="Texture2D" uid="uid://cl11bl8lcnwha" path="res://Temp/Characters/4_2.png" id="6_6563q"] +[ext_resource type="Texture2D" uid="uid://dc27ugd4sik7m" path="res://Temp/Characters/5_4.png" id="7_a35tl"] +[ext_resource type="Texture2D" uid="uid://cl8nkrx2bk76n" path="res://Temp/Characters/6_1.png" id="8_oklwm"] +[ext_resource type="Texture2D" uid="uid://ch0pdjtnr3y7r" path="res://Temp/Characters/7.png" id="9_wor4w"] [node name="BattleSceneTest" type="Node3D"] script = ExtResource("1_tuul4") [node name="BattleScene" parent="." instance=ExtResource("1_fdqdi")] + +[node name="BattleCharacter" parent="BattleScene/Characters" index="0" instance=ExtResource("3_nau0d")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.1026, 0.524168, -2.96058) + +[node name="BattleCharacter2" parent="BattleScene/Characters" index="1" instance=ExtResource("3_nau0d")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.25622, 0.524168, -2.87261) + +[node name="Sprite3D" parent="BattleScene/Characters/BattleCharacter2" index="1"] +texture = ExtResource("4_jnah0") + +[node name="BattleCharacter3" parent="BattleScene/Characters" index="2" instance=ExtResource("3_nau0d")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.524168, -4.12488) + +[node name="Sprite3D" parent="BattleScene/Characters/BattleCharacter3" index="1"] +texture = ExtResource("5_4vahd") + +[node name="BattleCharacter4" parent="BattleScene/Characters" index="3" instance=ExtResource("3_nau0d")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.737777, 0.524168, -3.35854) + +[node name="Sprite3D" parent="BattleScene/Characters/BattleCharacter4" index="1"] +texture = ExtResource("6_6563q") + +[node name="BattleCharacter5" parent="BattleScene/Characters" index="4" instance=ExtResource("3_nau0d")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.6372, 0.524168, -3.47228) + +[node name="Sprite3D" parent="BattleScene/Characters/BattleCharacter5" index="1"] +texture = ExtResource("7_a35tl") + +[node name="BattleCharacter6" parent="BattleScene/Characters" index="5" instance=ExtResource("3_nau0d")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.27585, 0.524168, -5.80874) + +[node name="Sprite3D" parent="BattleScene/Characters/BattleCharacter6" index="1"] +texture = ExtResource("8_oklwm") + +[node name="BattleCharacter7" parent="BattleScene/Characters" index="6" instance=ExtResource("3_nau0d")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.44713, 0.524168, -6.18927) + +[node name="Sprite3D" parent="BattleScene/Characters/BattleCharacter7" index="1"] +texture = ExtResource("9_wor4w") + +[connection signal="MousePressed" from="BattleScene/Characters/BattleCharacter" to="." method="On_BattleCharacter_MousePressed"] + +[editable path="BattleScene"] +[editable path="BattleScene/Characters/BattleCharacter2"] +[editable path="BattleScene/Characters/BattleCharacter3"] +[editable path="BattleScene/Characters/BattleCharacter4"] +[editable path="BattleScene/Characters/BattleCharacter5"] +[editable path="BattleScene/Characters/BattleCharacter6"] +[editable path="BattleScene/Characters/BattleCharacter7"]