diff --git a/DungeonShooting_Godot/prefab/ui/EditorImportCombination.tscn b/DungeonShooting_Godot/prefab/ui/EditorImportCombination.tscn index 88bfb55..d03d013 100644 --- a/DungeonShooting_Godot/prefab/ui/EditorImportCombination.tscn +++ b/DungeonShooting_Godot/prefab/ui/EditorImportCombination.tscn @@ -46,6 +46,7 @@ [node name="HBoxContainer2" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] layout_mode = 2 +size_flags_vertical = 3 [node name="PreviewLabel" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer2"] layout_mode = 2 @@ -56,10 +57,22 @@ horizontal_alignment = 2 vertical_alignment = 1 -[node name="PreviewTexture" type="TextureRect" parent="MarginContainer/VBoxContainer/HBoxContainer2"] -custom_minimum_size = Vector2(0, 300) +[node name="PreviewBg" type="ColorRect" parent="MarginContainer/VBoxContainer/HBoxContainer2"] +clip_children = 2 layout_mode = 2 size_flags_horizontal = 3 size_flags_stretch_ratio = 80.0 +color = Color(0.270588, 0.270588, 0.270588, 1) + +[node name="PreviewTexture" type="TextureRect" parent="MarginContainer/VBoxContainer/HBoxContainer2/PreviewBg"] +custom_minimum_size = Vector2(0, 300) +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 80.0 expand_mode = 2 stretch_mode = 5 diff --git a/DungeonShooting_Godot/prefab/ui/TileSetEditorCombination.tscn b/DungeonShooting_Godot/prefab/ui/TileSetEditorCombination.tscn index a7e81c5..819b1fa 100644 --- a/DungeonShooting_Godot/prefab/ui/TileSetEditorCombination.tscn +++ b/DungeonShooting_Godot/prefab/ui/TileSetEditorCombination.tscn @@ -38,7 +38,6 @@ grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_to1lc") -Layer = null [node name="HSplitContainer" type="HSplitContainer" parent="."] layout_mode = 1 diff --git a/DungeonShooting_Godot/src/framework/common/Utils.cs b/DungeonShooting_Godot/src/framework/common/Utils.cs index 7dd0903..8f35758 100644 --- a/DungeonShooting_Godot/src/framework/common/Utils.cs +++ b/DungeonShooting_Godot/src/framework/common/Utils.cs @@ -388,24 +388,24 @@ public static Rect2I CalcTileRect(IEnumerable cells) { //单位: 像素 - var canvasXStart = int.MaxValue; - var canvasYStart = int.MaxValue; - var canvasXEnd = int.MinValue; - var canvasYEnd = int.MinValue; + var canvasXStart = float.MaxValue; + var canvasYStart = float.MaxValue; + var canvasXEnd = float.MinValue; + var canvasYEnd = float.MinValue; foreach (var pos in cells) { - canvasXStart = (int)Mathf.Min(pos.X, canvasXStart); - canvasYStart = (int)Mathf.Min(pos.Y, canvasYStart); - canvasXEnd = (int)Mathf.Max(pos.X + GameConfig.TileCellSize, canvasXEnd); - canvasYEnd = (int)Mathf.Max(pos.Y + GameConfig.TileCellSize, canvasYEnd); + canvasXStart = Mathf.Min(pos.X, canvasXStart); + canvasYStart = Mathf.Min(pos.Y, canvasYStart); + canvasXEnd = Mathf.Max(pos.X + GameConfig.TileCellSize, canvasXEnd); + canvasYEnd = Mathf.Max(pos.Y + GameConfig.TileCellSize, canvasYEnd); } return new Rect2I( - canvasXStart, - canvasYStart, - canvasXEnd - canvasXStart, - canvasYEnd - canvasYStart + (int)canvasXStart, + (int)canvasYStart, + (int)(canvasXEnd - canvasXStart), + (int)(canvasYEnd - canvasYStart) ); } diff --git a/DungeonShooting_Godot/src/game/data/ImportCombinationData.cs b/DungeonShooting_Godot/src/game/data/ImportCombinationData.cs index ff8c6e7..de9119e 100644 --- a/DungeonShooting_Godot/src/game/data/ImportCombinationData.cs +++ b/DungeonShooting_Godot/src/game/data/ImportCombinationData.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; using Godot; /// @@ -22,6 +21,9 @@ CombinationInfo = combinationInfo; } + /// + /// 更新组合预览图 + /// public void UpdatePreviewTexture(Image src) { using (var image = GetPreviewTexture(src, CombinationInfo.Cells, CombinationInfo.Positions)) @@ -30,12 +32,17 @@ } } + /// + /// 获取组合图块预览图数据 + /// + /// 地块纹理 + /// 图块在地块中的位置 + /// 图块位置 public static Image GetPreviewTexture(Image src, SerializeVector2[] cells, SerializeVector2[] positions) { var rect = Utils.CalcTileRect(positions); var rectSize = rect.Size; var image = Image.Create(rectSize.X + 4, rectSize.Y + 4, false, Image.Format.Rgba8); - image.Fill(Colors.Gray); for (var i = 0; i < cells.Length; i++) { var cell = cells[i]; diff --git a/DungeonShooting_Godot/src/game/manager/EditorWindowManager.cs b/DungeonShooting_Godot/src/game/manager/EditorWindowManager.cs index 27691d0..2fca8b1 100644 --- a/DungeonShooting_Godot/src/game/manager/EditorWindowManager.cs +++ b/DungeonShooting_Godot/src/game/manager/EditorWindowManager.cs @@ -431,17 +431,18 @@ /// 显示导入组合确认弹窗 /// /// 组合名称 + /// 预览纹理背景颜色 /// 显示纹理 /// 确定时回调 /// 取消时回调 /// 所属父级Ui - public static void ShowImportCombination(string showName, Texture2D texture, Action onAccept, Action onCancel, UiBase parentUi = null) + public static void ShowImportCombination(string showName, Color color, Texture2D texture, Action onAccept, Action onCancel, UiBase parentUi = null) { var window = CreateWindowInstance(parentUi); - window.S_Window.Instance.Size = new Vector2I(600, 500); + window.S_Window.Instance.Size = new Vector2I(750, 650); window.SetWindowTitle("导入组合"); var body = window.OpenBody(UiManager.UiNames.EditorImportCombination); - body.InitData(showName, texture); + body.InitData(showName, color, texture); var accept = false; if (onCancel != null) { diff --git a/DungeonShooting_Godot/src/game/ui/editorImportCombination/EditorImportCombination.cs b/DungeonShooting_Godot/src/game/ui/editorImportCombination/EditorImportCombination.cs index b0220d8..eb89df8 100644 --- a/DungeonShooting_Godot/src/game/ui/editorImportCombination/EditorImportCombination.cs +++ b/DungeonShooting_Godot/src/game/ui/editorImportCombination/EditorImportCombination.cs @@ -91,7 +91,7 @@ } /// - /// 类型: , 路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer2.PreviewTexture + /// 类型: , 路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer2.PreviewBg.PreviewTexture /// public class PreviewTexture : UiNode { @@ -100,6 +100,28 @@ } /// + /// 类型: , 路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer2.PreviewBg + /// + public class PreviewBg : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer2.PreviewTexture + /// + public PreviewTexture L_PreviewTexture + { + get + { + if (_L_PreviewTexture == null) _L_PreviewTexture = new PreviewTexture(UiPanel, Instance.GetNode("PreviewTexture")); + return _L_PreviewTexture; + } + } + private PreviewTexture _L_PreviewTexture; + + public PreviewBg(EditorImportCombinationPanel uiPanel, Godot.ColorRect node) : base(uiPanel, node) { } + public override PreviewBg Clone() => new (UiPanel, (Godot.ColorRect)Instance.Duplicate()); + } + + /// /// 类型: , 路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer2 /// public class HBoxContainer2 : UiNode @@ -118,17 +140,17 @@ private PreviewLabel _L_PreviewLabel; /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorImportCombination.MarginContainer.VBoxContainer.PreviewTexture + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: EditorImportCombination.MarginContainer.VBoxContainer.PreviewBg /// - public PreviewTexture L_PreviewTexture + public PreviewBg L_PreviewBg { get { - if (_L_PreviewTexture == null) _L_PreviewTexture = new PreviewTexture(UiPanel, Instance.GetNode("PreviewTexture")); - return _L_PreviewTexture; + if (_L_PreviewBg == null) _L_PreviewBg = new PreviewBg(UiPanel, Instance.GetNode("PreviewBg")); + return _L_PreviewBg; } } - private PreviewTexture _L_PreviewTexture; + private PreviewBg _L_PreviewBg; public HBoxContainer2(EditorImportCombinationPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } public override HBoxContainer2 Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); @@ -213,9 +235,14 @@ public PreviewLabel S_PreviewLabel => L_MarginContainer.L_VBoxContainer.L_HBoxContainer2.L_PreviewLabel; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer2.PreviewTexture + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer2.PreviewBg.PreviewTexture /// - public PreviewTexture S_PreviewTexture => L_MarginContainer.L_VBoxContainer.L_HBoxContainer2.L_PreviewTexture; + public PreviewTexture S_PreviewTexture => L_MarginContainer.L_VBoxContainer.L_HBoxContainer2.L_PreviewBg.L_PreviewTexture; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer2.PreviewBg + /// + public PreviewBg S_PreviewBg => L_MarginContainer.L_VBoxContainer.L_HBoxContainer2.L_PreviewBg; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: EditorImportCombination.MarginContainer.VBoxContainer.HBoxContainer2 diff --git a/DungeonShooting_Godot/src/game/ui/editorImportCombination/EditorImportCombinationPanel.cs b/DungeonShooting_Godot/src/game/ui/editorImportCombination/EditorImportCombinationPanel.cs index ad90fe9..e1b5a26 100644 --- a/DungeonShooting_Godot/src/game/ui/editorImportCombination/EditorImportCombinationPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/editorImportCombination/EditorImportCombinationPanel.cs @@ -4,13 +4,32 @@ public partial class EditorImportCombinationPanel : EditorImportCombination { + private DragBinder _dragBinder; + public override void OnShowUi() + { + _dragBinder = DragUiManager.BindDrag(S_PreviewBg.Instance, (state, delta) => + { + if (state == DragState.DragMove) + { + S_PreviewTexture.Instance.Position += delta; + } + }); + } + + public override void OnDestroyUi() + { + _dragBinder.UnBind(); + } + /// /// 初始化页面数据 /// /// 显示名称 + /// 预览纹理背景颜色 /// 显示预览纹理 - public void InitData(string name, Texture2D texture) + public void InitData(string name, Color bgColor, Texture2D texture) { + S_PreviewBg.Instance.Color = bgColor; S_NameInput.Instance.Text = name; S_PreviewTexture.Instance.Texture = texture; } diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditor/TileSetEditorPanel.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditor/TileSetEditorPanel.cs index 3f59ae4..c1f6400 100644 --- a/DungeonShooting_Godot/src/game/ui/tileSetEditor/TileSetEditorPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditor/TileSetEditorPanel.cs @@ -86,7 +86,7 @@ { S_Title.Instance.Text = "正在编辑:" + tileSetInfo.Name; - //SetTexture(ImageTexture.CreateFromImage(Image.LoadFromFile("resource/tileSprite/map1/16x16 dungeon ii wall reconfig v04 spritesheet.png"))); + SetTextureData(Image.LoadFromFile("resource/tileSprite/map1/16x16 dungeon ii wall reconfig v04 spritesheet.png")); TabGrid.SelectIndex = 0; } diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/GridBg.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/GridBg.cs index 010b153..702f8f5 100644 --- a/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/GridBg.cs +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/GridBg.cs @@ -37,19 +37,13 @@ AcceptEvent(); if (mouseButton.ButtonIndex == MouseButton.WheelDown) { - if (GetGlobalRect().HasPoint(mouseButton.GlobalPosition)) - { - //缩小 - Shrink(); - } + //缩小 + Shrink(); } else if (mouseButton.ButtonIndex == MouseButton.WheelUp) { - if (GetGlobalRect().HasPoint(mouseButton.GlobalPosition)) - { - //放大 - Magnify(); - } + //放大 + Magnify(); } } } diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/leftTop/TileEditCombination.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/leftTop/TileEditCombination.cs index e9eac87..89a9359 100644 --- a/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/leftTop/TileEditCombination.cs +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorCombination/leftTop/TileEditCombination.cs @@ -177,11 +177,12 @@ var cells = tempCell.ToArray(); var positions = tempPos.ToArray(); - + + var color = UiNode.UiPanel.EditorPanel.BgColor; var src = UiNode.UiPanel.EditorPanel.TextureImage; var image = ImportCombinationData.GetPreviewTexture(src, cells, positions); var texture = ImageTexture.CreateFromImage(image); - EditorWindowManager.ShowImportCombination("组合名称", texture, (name) => + EditorWindowManager.ShowImportCombination("组合名称", color, texture, (name) => { var combinationInfo = new TileCombinationInfo(); combinationInfo.Id = "1";