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