diff --git a/DungeonShooting_Godot/src/framework/IData.cs b/DungeonShooting_Godot/src/framework/IData.cs new file mode 100644 index 0000000..b74f0c9 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/IData.cs @@ -0,0 +1,8 @@ + +/// +/// 数据接口 +/// +public interface IData +{ + T Data { get; } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/ui/grid/UiCell.cs b/DungeonShooting_Godot/src/framework/ui/grid/UiCell.cs index 6a6dbb0..4883906 100644 --- a/DungeonShooting_Godot/src/framework/ui/grid/UiCell.cs +++ b/DungeonShooting_Godot/src/framework/ui/grid/UiCell.cs @@ -7,7 +7,7 @@ /// /// ui节点类型 /// 数据类型 -public abstract class UiCell : IUiCell where TUiCellNode : IUiCellNode +public abstract class UiCell : IUiCell, IData where TUiCellNode : IUiCellNode { public bool IsDestroyed { get; private set; } diff --git a/DungeonShooting_Godot/src/game/event/EventEnum.cs b/DungeonShooting_Godot/src/game/event/EventEnum.cs index e86f2df..22d34e4 100644 --- a/DungeonShooting_Godot/src/game/event/EventEnum.cs +++ b/DungeonShooting_Godot/src/game/event/EventEnum.cs @@ -93,4 +93,20 @@ /// 点击跳转到地图中心点 /// OnClickCenterTool, + /// + /// 选中预设, , 参数 + /// + OnSelectPreinstall, + /// + /// 创建标记, 参数 + /// + OnCreateMark, + /// + /// 选中标记, 参数或者null + /// + OnSelectMark, + /// + /// 删除标记, 参数 + /// + OnDeleteMark, } diff --git a/DungeonShooting_Godot/src/game/ui/mapEditor/TileView/EditorTileMap.cs b/DungeonShooting_Godot/src/game/ui/mapEditor/TileView/EditorTileMap.cs index f0090e4..1359cb6 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditor/TileView/EditorTileMap.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditor/TileView/EditorTileMap.cs @@ -119,6 +119,45 @@ /// 正在编辑的房间数据 /// public DungeonRoomSplit RoomSplit { get; private set; } + + /// + /// 波数网格选中的索引 + /// + public int SelectWaveIndex { get; set; } = -1; + + /// + /// 选中的预设 + /// + public int SelectPreinstallIndex + { + get => _selectPreinstallIndex; + set + { + if (_selectPreinstallIndex != value) + { + _selectPreinstallIndex = value; + EventManager.EmitEvent(EventEnum.OnSelectPreinstall); + } + } + } + + private int _selectPreinstallIndex = -1; + + /// + /// 当前选中的预设 + /// + public RoomPreinstall SelectPreinstall + { + get + { + if (SelectPreinstallIndex == -1 || SelectPreinstallIndex >= RoomSplit.Preinstall.Count) + { + return null; + } + + return RoomSplit.Preinstall[SelectPreinstallIndex]; + } + } //变动过的数据 diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/EditorMarkCell.cs b/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/EditorMarkCell.cs index 991817a..e9cb203 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/EditorMarkCell.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/EditorMarkCell.cs @@ -45,6 +45,8 @@ public override void OnSelect() { CellNode.L_MarkButton.L_Select.Instance.Visible = true; + //选中标记 + EventManager.EmitEvent(EventEnum.OnSelectMark, Data); } public override void OnUnSelect() diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/EditorWaveCell.cs b/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/EditorWaveCell.cs index 0dd7933..1299cb6 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/EditorWaveCell.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/EditorWaveCell.cs @@ -6,7 +6,7 @@ public class EditorWaveCell : UiCell> { - private UiGrid _grid; + public UiGrid MarkGrid; public override void OnInit() { @@ -16,15 +16,15 @@ CellNode.L_MarginContainer.L_AddMarkButton.Instance.Pressed += OnAddMark; CellNode.L_MarkContainer.L_MarkItem.Instance.SetHorizontalExpand(true); - _grid = new UiGrid(CellNode.L_MarkContainer.L_MarkItem, typeof(EditorMarkCell)); - _grid.SetColumns(1); - _grid.SetHorizontalExpand(true); - _grid.SetCellOffset(new Vector2I(0, 5)); + MarkGrid = new UiGrid(CellNode.L_MarkContainer.L_MarkItem, typeof(EditorMarkCell)); + MarkGrid.SetColumns(1); + MarkGrid.SetHorizontalExpand(true); + MarkGrid.SetCellOffset(new Vector2I(0, 5)); } public override void OnSetData(List data) { - _grid.SetDataList(data.ToArray()); + MarkGrid.SetDataList(data.ToArray()); } public override void OnRefreshIndex() @@ -34,7 +34,7 @@ public override void OnDestroy() { - _grid.Destroy(); + MarkGrid.Destroy(); } //添加标记 @@ -49,14 +49,15 @@ { var preinstall = CellNode.UiPanel.GetSelectPreinstall(); preinstall.WaveList[Index].Add(markInfo); - _grid.Add(markInfo); + MarkGrid.Add(markInfo); //添加标记工具 - var editorPanel = (MapEditorPanel)CellNode.UiPanel.ParentUi; - editorPanel.S_MapEditorTools.Instance.CreateMarkTool(markInfo); + EventManager.EmitEvent(EventEnum.OnCreateMark, markInfo); } - //展开/收起按钮点击 - private void OnExpandOrClose() + /// + /// 展开/收起按钮点击 + /// + public void OnExpandOrClose() { var marginContainer = CellNode.L_MarkContainer.Instance; var flag = !marginContainer.Visible; @@ -73,9 +74,17 @@ } } + /// + /// 是否展开 + /// + public bool IsExpand() + { + return CellNode.L_MarkContainer.Instance.Visible; + } + public override void OnClick() { - CellNode.UiPanel.WaveSelectIndex = Index; + CellNode.UiPanel.EditorTileMap.SelectWaveIndex = Index; CellNode.UiPanel.SetSelectCell(this, CellNode.L_WaveContainer.Instance, MapEditorMapMarkPanel.SelectToolType.Wave); } diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/MapEditorMapMarkPanel.cs b/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/MapEditorMapMarkPanel.cs index 6a0da84..25df7cc 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/MapEditorMapMarkPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/MapEditorMapMarkPanel.cs @@ -30,11 +30,7 @@ //波数网格组件 private UiGrid> _grid; - - /// - /// 波数网格选中的索引 - /// - public int WaveSelectIndex { get; set; } = -1; + private EventFactory _eventFactory; public override void OnCreateUi() { @@ -54,19 +50,58 @@ S_EditButton.Instance.Pressed += OnToolEditClick; S_DeleteButton.Instance.Pressed += OnToolDeleteClick; - //S_Test.Instance. } public override void OnShowUi() { + _eventFactory = EventManager.CreateEventFactory(); + _eventFactory.AddEventListener(EventEnum.OnSelectMark, OnSelectMark); RefreshPreinstallSelect(); } + public override void OnHideUi() + { + _eventFactory.RemoveAllEventListener(); + _eventFactory = null; + } + public override void OnDestroyUi() { _grid.Destroy(); } + //选中标记回调 + private void OnSelectMark(object arg) + { + if (arg is MarkInfo markInfo && (SelectCell is not EditorMarkCell || (SelectCell is EditorMarkCell markCell && markCell.Data != markInfo))) + { + var selectPreinstall = GetSelectPreinstall(); + if (selectPreinstall != null) + { + for (var i = 0; i < selectPreinstall.WaveList.Count; i++) + { + var wave = selectPreinstall.WaveList[i]; + for (var j = 0; j < wave.Count; j++) + { + var tempMark = wave[j]; + if (tempMark == markInfo) + { + var waveCell = (EditorWaveCell)_grid.GetCell(i); + var cell = (EditorMarkCell)waveCell.MarkGrid.GetCell(j); + //如果没有展开, 则调用展开方法 + if (!waveCell.IsExpand()) + { + waveCell.OnExpandOrClose(); + } + //选中物体 + SetSelectCell(cell, cell.CellNode.Instance, SelectToolType.Mark); + } + } + } + } + } + } + /// /// 获取当前选中的预设 /// @@ -115,6 +150,7 @@ /// public void OnItemSelected(long index) { + EditorTileMap.SelectPreinstallIndex = (int)index; var preinstall = EditorTileMap.RoomSplit.Preinstall; if (index >= 0 && index <= preinstall.Count) { @@ -257,7 +293,7 @@ /// public void OnDeleteWave() { - var index = WaveSelectIndex; + var index = EditorTileMap.SelectWaveIndex; if (index < 0) { return; @@ -275,7 +311,7 @@ //移除数据 selectPreinstall.WaveList.RemoveAt(index); _grid.RemoveByIndex(index); - WaveSelectIndex = -1; + EditorTileMap.SelectWaveIndex = -1; } /// diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorToolsPanel.cs b/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorToolsPanel.cs index 8c317a5..4a281d1 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorToolsPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorToolsPanel.cs @@ -36,10 +36,11 @@ /// public MapEditor.MapEditor.TileMap EditorMap { get; set; } - private List _doorTools = new List(); private UiGrid _toolGrid; - private Dictionary _markToolsMap = new Dictionary(); + //当前预设的所有标记 + private Dictionary _currMarkToolsMap = new Dictionary(); + private EventFactory _eventFactory; public override void OnCreateUi() { @@ -80,6 +81,20 @@ _toolGrid.SelectIndex = 1; } + public override void OnShowUi() + { + _eventFactory = EventManager.CreateEventFactory(); + _eventFactory.AddEventListener(EventEnum.OnCreateMark, OnCreateMarkTool); + _eventFactory.AddEventListener(EventEnum.OnSelectMark, OnSelectMarkTool); + _eventFactory.AddEventListener(EventEnum.OnSelectPreinstall, RefreshMark); + } + + public override void OnHideUi() + { + _eventFactory.RemoveAllEventListener(); + _eventFactory = null; + } + public override void OnDestroyUi() { S_DoorToolTemplate.Instance.QueueFree(); @@ -99,13 +114,59 @@ } } - public void CreateMarkTool(MarkInfo markInfo) + //刷新标记 + private void RefreshMark(object arg) + { + //删除之前的数据 + foreach (var keyValuePair in _currMarkToolsMap) + { + keyValuePair.Value.QueueFree(); + } + _currMarkToolsMap.Clear(); + //添加新的数据 + var selectPreinstall = EditorMap.Instance.SelectPreinstall; + if (selectPreinstall != null) + { + foreach (var markInfos in selectPreinstall.WaveList) + { + foreach (var markInfo in markInfos) + { + CreateMarkTool(markInfo); + } + } + } + } + + //创建标记 + private void OnCreateMarkTool(object arg) + { + var markInfo = (MarkInfo)arg; + CreateMarkTool(markInfo); + } + + //创建标记 + private void CreateMarkTool(MarkInfo markInfo) { var cloneAndPut = S_MarkTemplate.CloneAndPut(); - _markToolsMap.Add(markInfo, cloneAndPut); + _currMarkToolsMap.Add(markInfo, cloneAndPut); cloneAndPut.Instance.Visible = true; cloneAndPut.Instance.InitData(markInfo); } + + //选中标记 + private void OnSelectMarkTool(object arg) + { + if (arg is MarkInfo markInfo) + { + if (markInfo != ActiveMark.MarkInfo) + { + if (_currMarkToolsMap.TryGetValue(markInfo, out var markTemplate)) + { + SetActiveMark(markTemplate.Instance); + } + } + } + } /// /// 获取门区域对象 @@ -158,7 +219,25 @@ /// public void SetActiveMark(MarkTool markTool) { + if (ActiveMark == markTool) + { + return; + } + + if (ActiveMark != null) + { + ActiveMark.Modulate = Colors.White; + } ActiveMark = markTool; + if (markTool != null) + { + markTool.Modulate = Colors.Green; + EventManager.EmitEvent(EventEnum.OnSelectMark, markTool.MarkInfo); + } + else + { + EventManager.EmitEvent(EventEnum.OnSelectMark); + } } /// diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorTools/MarkTool.cs b/DungeonShooting_Godot/src/game/ui/mapEditorTools/MarkTool.cs index e8f1e80..0553ed3 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorTools/MarkTool.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorTools/MarkTool.cs @@ -7,10 +7,14 @@ /// public partial class MarkTool : TextureRect, IUiNodeScript { - private MapEditorTools.MarkTemplate _toolNode; - private MarkInfo _markInfo; + /// + /// 绑定的数据 + /// + public MarkInfo MarkInfo { get; private set; } private bool _enter; private bool _isMOve; + private MapEditorTools.MarkTemplate _toolNode; + private bool _isDown; private Vector2 _offset; public void SetUiNode(IUiNode uiNode) @@ -22,50 +26,53 @@ public override void _Process(double delta) { - if (_toolNode != null && _markInfo != null) + if (_toolNode != null && MarkInfo != null) { - //鼠标在节点内 if (_enter) { - if (_isMOve) + if (_isDown) { + //松开鼠标 if (!Input.IsMouseButtonPressed(MouseButton.Left)) { + _isDown = false; _isMOve = false; - if (_toolNode.UiPanel.ActiveMark == this) - { - _toolNode.UiPanel.SetActiveMark(null); - } } } - else if (!_isMOve) + else if (!_isDown) { + //按下鼠标 if (Input.IsMouseButtonPressed(MouseButton.Left)) { - _isMOve = true; - _offset = GlobalPosition - GetGlobalMousePosition(); - if (_toolNode.UiPanel.ActiveMark == null) + _isDown = true; + if (_toolNode.UiPanel.ActiveMark != this) { + _isMOve = false; _toolNode.UiPanel.SetActiveMark(this); } + else + { + _offset = GlobalPosition - GetGlobalMousePosition(); + _isMOve = true; + } } } } - + //移动中 if (_isMOve && _toolNode.UiPanel.ActiveMark == this) { GlobalPosition = _offset + GetGlobalMousePosition().Round(); - _markInfo.Position = new SerializeVector2((Position + (Size / 2).Ceil()).Round()); + MarkInfo.Position = new SerializeVector2((Position + (Size / 2).Ceil()).Round()); } - - //QueueRedraw(); + + QueueRedraw(); } } public void InitData(MarkInfo markInfo) { - _markInfo = markInfo; + MarkInfo = markInfo; Position = markInfo.Position.AsVector2() - (Size / 2).Ceil(); } @@ -76,17 +83,15 @@ private void OnMouseExited() { - if (!Input.IsMouseButtonPressed(MouseButton.Left)) - { - _enter = false; - } + _enter = false; } - // public override void _Draw() - // { - // if (_markInfo != null && _markInfo.Size.X != 0 && _markInfo.Size.Y != 0) - // { - // - // } - // } + public override void _Draw() + { + if (MarkInfo != null && MarkInfo.Size.X != 0 && MarkInfo.Size.Y != 0) + { + var size = MarkInfo.Size.AsVector2(); + DrawRect(new Rect2(-size / 2 + Size / 2, size.X, size.Y), new Color(1, 1, 1, 0.3f), false, 1); + } + } } \ No newline at end of file