using Godot; using UI.TileSetEditor; namespace UI.TileSetEditorTerrain; public partial class TileSetEditorTerrainPanel : TileSetEditorTerrain { /// <summary> /// 父Ui /// </summary> public TileSetEditorPanel EditorPanel; /// <summary> /// 当前选中的地形索引 /// </summary> public int CurrTerrainIndex => TerrainTabGrid.SelectIndex; /// <summary> /// 当前选中的地形 /// </summary> public TileSetTerrainInfo CurrTerrain { get { var terrain = EditorPanel.TileSetSourceInfo?.Terrain; if (terrain == null) { return null; } if (CurrTerrainIndex < 0 || CurrTerrainIndex >= terrain.Count) { return null; } return terrain[CurrTerrainIndex]; } } /// <summary> /// 正在拖拽的图块 /// </summary> public MaskCell DraggingCell { get; set; } public UiGrid<TerrainTab, TileSetTerrainInfo> TerrainTabGrid; public UiGrid<RightCell, byte> TerrainGrid3x3; public UiGrid<RightCell, byte> TerrainGrid2x2; public UiGrid<RightCell, byte> TerrainGridMiddle; public UiGrid<RightCell, byte> TerrainGridFloor; public UiGrid<BottomCell, Rect2I> MaskGrid; private bool _refreshGridConnect = false; public override void OnCreateUi() { EditorPanel = (TileSetEditorPanel)ParentUi; S_DragSprite.Instance.Visible = false; //改变选中的TileSet资源 AddEventListener(EventEnum.OnSelectTileSetSource, OnSelectTileSetSource); //改变纹理事件 AddEventListener(EventEnum.OnSetTileTexture, (data) => { OnSetTileTexture(data); if (TerrainTabGrid.SelectIndex >= 0) { OnChangeTerrain(TerrainTabGrid.SelectIndex); } }); //背景颜色改变 AddEventListener(EventEnum.OnSetTileSetBgColor, OnChangeTileSetBgColor); //地形页签 TerrainTabGrid = CreateUiGrid<TerrainTab, TileSetTerrainInfo, TerrainTabCell>(S_TerrainTab); TerrainTabGrid.SetCellOffset(Vector2I.Zero); TerrainTabGrid.SetColumns(1); TerrainTabGrid.SetHorizontalExpand(true); MaskGrid = CreateUiGrid<BottomCell, Rect2I, MaskCell>(S_BottomCell); MaskGrid.SetCellOffset(Vector2I.Zero); MaskGrid.GridContainer.MouseFilter = MouseFilterEnum.Ignore; TerrainGrid3x3 = InitTopGrid(S_TerrainRoot.L_TerrainTexture1.Instance, GameConfig.TerrainBit3x3, TileSetTerrainInfo.TerrainLayerType); TerrainGrid2x2 = InitTopGrid(S_TerrainRoot.L_TerrainTexture4.Instance, GameConfig.TerrainBit2x2, TileSetTerrainInfo.TerrainLayerType); TerrainGridMiddle = InitTopGrid(S_TerrainRoot.L_TerrainTexture2.Instance, GameConfig.TerrainBitMiddle, TileSetTerrainInfo.MiddleLayerType); TerrainGridFloor = InitTopGrid(S_TerrainRoot.L_TerrainTexture3.Instance, GameConfig.TerrainBitFloor, TileSetTerrainInfo.FloorLayerType); //删除地形按钮 S_DeleteButton.Instance.Pressed += OnDeleteTerrainClick; //添加地形按钮 S_AddButton.Instance.Pressed += OnAddTerrainClick; //编辑地形 S_EditButton.Instance.Pressed += OnEditTerrainClick; OnSetTileTexture(EditorPanel.Texture); OnChangeTileSetBgColor(EditorPanel.BgColor); OnChangeTerrainType(-1); //改变选中的地形 TerrainTabGrid.SelectEvent += OnChangeTerrain; } public override void OnDestroyUi() { } public override void Process(float delta) { S_MaskBrush.Instance.Visible = DraggingCell == null; if (_refreshGridConnect) { _refreshGridConnect = false; var terrainList = EditorPanel.TileSetSourceInfo.Terrain; for (var i = 0; i < terrainList.Count; i++) { var terrain = terrainList[i]; if (terrain.TerrainType == 0) //选中47格Terrain { TerrainGrid3x3.ForEach(cell => RefreshTerrainCellUseFlag(terrain, cell)); if (EditorPanel.TileSetSourceIndex == 0 && CurrTerrainIndex == 0) //选中Main Source { TerrainGridMiddle.ForEach(cell => RefreshTerrainCellUseFlag(terrain, cell)); TerrainGridFloor.ForEach(cell => RefreshTerrainCellUseFlag(terrain, cell)); } } else //选中13格Terrain { TerrainGrid2x2.ForEach(cell => RefreshTerrainCellUseFlag(terrain, cell)); } } } } private UiGrid<RightCell, byte> InitTopGrid(Control texture, Vector2I size, byte type) { var cellRoot = S_TopBg.L_TerrainRoot.L_CellRoot; var sRightCell = cellRoot.L_RightCell; sRightCell.Instance.Position = texture.Position; var grid = CreateUiGrid<RightCell, byte, TerrainCell>(sRightCell, cellRoot.Instance); grid.GridContainer.MouseFilter = MouseFilterEnum.Ignore; grid.SetCellOffset(Vector2I.Zero); grid.SetColumns(size.X); for (var y = 0; y < size.Y; y++) { for (var x = 0; x < size.X; x++) { grid.Add(type); } } return grid; } //改变选中的TileSet资源 private void OnSelectTileSetSource(object obj) { TerrainTabGrid.RemoveAll(); //加载Terrain if (obj != null) { var terrainList = ((TileSetSourceInfo)obj).Terrain; if (terrainList.Count > 0) { TerrainTabGrid.SetDataList(terrainList.ToArray()); TerrainTabGrid.SelectIndex = 0; } } } private void SetTerrainCellData(TileSetTerrainInfo terrain, UiCell<RightCell, byte> cell) { var data = terrain.GetTerrainCell(cell.Index, cell.Data); if (data != null) { var terrainCell = (TerrainCell)cell; var x = data[0]; var y = data[1]; terrainCell.SetCell(new Rect2I(x, y, GameConfig.TileCellSize, GameConfig.TileCellSize)); } } private void RefreshConnectTerrainCell(TileSetTerrainInfo terrain, UiCell<RightCell, byte> cell) { var data = terrain.GetTerrainCell(cell.Index, cell.Data); if (data != null) { var terrainCell = (TerrainCell)cell; var x = data[0]; var y = data[1]; var index = x / GameConfig.TileCellSize + y / GameConfig.TileCellSize * MaskGrid.GetColumns(); var maskCell = (MaskCell)MaskGrid.GetCell(index); if (maskCell != null) { //绑定TerrainCell maskCell.SetConnectTerrainCell(terrainCell); } } } private void RefreshTerrainCellUseFlag(TileSetTerrainInfo terrain, UiCell<RightCell, byte> cell) { var data = terrain.GetTerrainCell(cell.Index, cell.Data); if (data != null) { var x = data[0]; var y = data[1]; var index = x / GameConfig.TileCellSize + y / GameConfig.TileCellSize * MaskGrid.GetColumns(); var maskCell = (MaskCell)MaskGrid.GetCell(index); if (maskCell != null) { maskCell.SetUseFlag(true); } } } /// <summary> /// 放置地形Cell纹理 /// </summary> public void OnDropCell(MaskCell maskCell) { var terrain = CurrTerrain; if (terrain == null) { return; } if (terrain.TerrainType == 0) //选中47个Terrain { var flag = true; TerrainGrid3x3.ForEach((cell) => { flag = !((TerrainCell)cell).OnDropCell(maskCell); return flag; }); if (EditorPanel.TileSetSourceIndex == 0 && CurrTerrainIndex == 0) //选中Main Source { if (flag) { TerrainGridMiddle.ForEach((cell) => { flag = !((TerrainCell)cell).OnDropCell(maskCell); return flag; }); } if (flag) { TerrainGridFloor.ForEach((cell) => { return ((TerrainCell)cell).OnDropCell(maskCell); }); } } } else //选中13格Terrain { TerrainGrid2x2.ForEach((cell) => { return !((TerrainCell)cell).OnDropCell(maskCell); }); } } //改变TileSet纹理 private void OnSetTileTexture(object arg) { S_BottomBg.Instance.OnChangeTileSetTexture(); MaskGrid.RemoveAll(); var cellHorizontal = EditorPanel.CellHorizontal; if (cellHorizontal <= 0) { return; } var cellVertical = EditorPanel.CellVertical; MaskGrid.SetColumns(cellHorizontal); for (var y = 0; y < cellVertical; y++) { for (var x = 0; x < cellHorizontal; x++) { MaskGrid.Add(new Rect2I(x * GameConfig.TileCellSize, y * GameConfig.TileCellSize, GameConfig.TileCellSize, GameConfig.TileCellSize)); } } _refreshGridConnect = true; } //更改背景颜色 private void OnChangeTileSetBgColor(object obj) { S_BottomBg.Instance.Color = EditorPanel.BgColor; S_TopBg.Instance.Color = EditorPanel.BgColor; } //切换选中的地形 private void OnChangeTerrain(int index) { //清除所有绑定的Terrain if (index >= 0) { TerrainGrid3x3.ForEach(cell => ((TerrainCell)cell).ClearCellTexture()); TerrainGridMiddle.ForEach(cell => ((TerrainCell)cell).ClearCellTexture()); TerrainGridFloor.ForEach(cell => ((TerrainCell)cell).ClearCellTexture()); TerrainGrid2x2.ForEach(cell => ((TerrainCell)cell).ClearCellTexture()); } S_TopBg.Instance.SetHoverCell(null); S_BottomBg.Instance.SetHoverCell(null); MaskGrid.ForEach(cell => { ((MaskCell)cell).SetConnectTerrainCell(null); }); var terrain = CurrTerrain; if (terrain != null) { if (terrain.TerrainType == 0) //选中47个Terrain { TerrainGrid3x3.ForEach(cell => { SetTerrainCellData(terrain, cell); RefreshConnectTerrainCell(terrain, cell); }); if (EditorPanel.TileSetSourceIndex == 0 && CurrTerrainIndex == 0) //选中Main Source { TerrainGridMiddle.ForEach(cell => { SetTerrainCellData(terrain, cell); RefreshConnectTerrainCell(terrain, cell); }); TerrainGridFloor.ForEach(cell => { SetTerrainCellData(terrain, cell); RefreshConnectTerrainCell(terrain, cell); }); } } else //选中13格Terrain { TerrainGrid2x2.ForEach(cell => { SetTerrainCellData(terrain, cell); RefreshConnectTerrainCell(terrain, cell); }); } } if (index >= 0) { OnChangeTerrainType(TerrainTabGrid.GetCell(index).Data.TerrainType); } else { OnChangeTerrainType(-1); } } /// <summary> /// 切换Terrain类型 /// </summary> private void OnChangeTerrainType(long index) { if (EditorPanel.TileSetSourceIndex == 0 && CurrTerrainIndex == 0) //选中 Main Source { S_TerrainTexture2.Instance.Visible = true; S_TerrainTexture3.Instance.Visible = true; TerrainGridMiddle.Visible = true; TerrainGridFloor.Visible = true; S_TerrainTexture1.L_Label.Instance.Text = "顶部墙壁"; } else { S_TerrainTexture2.Instance.Visible = false; S_TerrainTexture3.Instance.Visible = false; TerrainGridMiddle.Visible = false; TerrainGridFloor.Visible = false; S_TerrainTexture1.L_Label.Instance.Text = "地形"; } if (index == 0) //47 格子 { S_TerrainRoot.L_TerrainTexture1.Instance.Visible = true; TerrainGrid3x3.Visible = true; S_TerrainRoot.L_TerrainTexture4.Instance.Visible = false; TerrainGrid2x2.Visible = false; } else if (index == 1) //13 格子 { S_TerrainRoot.L_TerrainTexture1.Instance.Visible = false; TerrainGrid3x3.Visible = false; S_TerrainRoot.L_TerrainTexture4.Instance.Visible = true; TerrainGrid2x2.Visible = true; } else { S_TerrainRoot.L_TerrainTexture1.Instance.Visible = false; TerrainGrid3x3.Visible = false; S_TerrainRoot.L_TerrainTexture4.Instance.Visible = false; TerrainGrid2x2.Visible = false; } } //删除地形 private void OnDeleteTerrainClick() { if (EditorPanel.TileSetSourceIndex == 0 && CurrTerrainIndex == 0) //不能删除 Main Terrain { EditorWindowManager.ShowTips("警告", "不允许删除 Main Terrain!"); return; } var terrain = CurrTerrain; if (terrain != null) { EditorWindowManager.ShowConfirm("提示", $"是否删除地形'{terrain.Name}'?", (v) => { if (v) { var index = TerrainTabGrid.SelectIndex; //执行删除操作 //清除Mask if (terrain.TerrainType == 0) //47格 { TerrainGrid3x3.ForEach(cell => { var terrainCell = (TerrainCell)cell; terrainCell.ClearCellTexture(); if (terrainCell.ConnectMaskCell != null) { terrainCell.ConnectMaskCell.SetUseFlag(false); terrainCell.ConnectMaskCell.SetConnectTerrainCell(null); } }); } else //13格 { TerrainGrid2x2.ForEach(cell => { var terrainCell = (TerrainCell)cell; terrainCell.ClearCellTexture(); if (terrainCell.ConnectMaskCell != null) { terrainCell.ConnectMaskCell.SetUseFlag(false); terrainCell.ConnectMaskCell.SetConnectTerrainCell(null); } }); } EditorPanel.TileSetSourceInfo.Terrain.Remove(terrain); TerrainTabGrid.RemoveByIndex(index); if (index == TerrainTabGrid.Count) { TerrainTabGrid.SelectIndex = TerrainTabGrid.Count - 1; } else { TerrainTabGrid.SelectIndex = index; } //标记数据脏了 EventManager.EmitEvent(EventEnum.OnTileSetDirty); } }); } else { EditorWindowManager.ShowTips("提示", "清选择一个Terrain!"); } } //创建地形 private void OnAddTerrainClick() { EditorWindowManager.ShowCreateTerrain(EditorPanel.TileSetSourceInfo, terrainInfo => { //执行添加操作 EditorPanel.TileSetSourceInfo.Terrain.Add(terrainInfo); TerrainTabGrid.Add(terrainInfo, true); //标记数据脏了 EventManager.EmitEvent(EventEnum.OnTileSetDirty); }); } //编辑地形(重命名) private void OnEditTerrainClick() { if (EditorPanel.TileSetSourceIndex == 0 && CurrTerrainIndex == 0) //不能删除 Main Terrain { EditorWindowManager.ShowTips("警告", "不允许重命名 Main Terrain!"); return; } var terrain = CurrTerrain; if (terrain != null) { EditorWindowManager.ShowInput("提示", $"是否删除地形'{terrain.Name}'?", terrain.Name, (v, isClose) => { if (string.IsNullOrEmpty(v)) { EditorWindowManager.ShowTips("错误", $"名称不允许为空!"); return false; } if (terrain.Name != v && EditorPanel.TileSetSourceInfo.Terrain.FindIndex(info => info.Name == v) >= 0) { EditorWindowManager.ShowTips("错误", $"已经有相同名称的Terrain了!"); return false; } terrain.Name = v; //刷新页签 ((TerrainTabCell)TerrainTabGrid.GetCell(CurrTerrainIndex)).RefreshData(); //标记数据脏了 EventManager.EmitEvent(EventEnum.OnTileSetDirty); return true; }); } else { EditorWindowManager.ShowTips("提示", "清选择一个Terrain!"); } } }