- using Godot;
- using static TerrainPeering;
-
- namespace UI.MapEditorMapTile;
-
- /// <summary>
- /// 地形选项
- /// </summary>
- public class TerrainCell : UiCell<MapEditorMapTile.TerrainItem, TerrainData>
- {
- private Image _image;
- private ImageTexture _texture;
-
- public override void OnInit()
- {
- _texture = new ImageTexture();
- CellNode.L_TerrainPreview.Instance.Texture = _texture;
- CellNode.L_Select.Instance.Visible = false;
- CellNode.L_ErrorIcon.Instance.Visible = false;
- }
-
- public override void OnSetData(TerrainData data)
- {
- //是否可以使用
- if (!data.TerrainInfo.Ready)
- {
- CellNode.L_ErrorIcon.Instance.Visible = true;
- CellNode.Instance.TooltipText = "该地形Bit配置未完成,请在TileSet编辑器中配置!";
- }
- else
- {
- CellNode.L_ErrorIcon.Instance.Visible = false;
- CellNode.Instance.TooltipText = "";
- }
-
- if (_image != null)
- {
- _image.Dispose();
- }
-
- //创建预览图
- _image = Image.Create(
- 3 * GameConfig.TileCellSize,
- 3 * GameConfig.TileCellSize,
- false, Image.Format.Rgba8
- );
- if (data.TerrainInfo.TerrainType == 0) //3x3
- {
- CellNode.L_TerrainName.Instance.Text = data.TerrainInfo.Name + "\n3x3";
- var src = CellNode.UiPanel.TileSetSourceInfo.GetSourceImage();
-
- SetImageSrc(src, Center | Right | Bottom | RightBottom, new Vector2I(0, 0));
- SetImageSrc(src, Center | Left | Right | Bottom | LeftBottom | RightBottom, new Vector2I(GameConfig.TileCellSize, 0));
- SetImageSrc(src, Center | Left | Bottom | LeftBottom, new Vector2I(GameConfig.TileCellSize * 2, 0));
-
- SetImageSrc(src, Center | Right | Top | Bottom | RightTop | RightBottom, new Vector2I(0, GameConfig.TileCellSize));
- SetImageSrc(src, Center | Left | Right | Bottom | Top | LeftTop | LeftBottom | RightTop | RightBottom, new Vector2I(GameConfig.TileCellSize, GameConfig.TileCellSize));
- SetImageSrc(src, Center | Left | Top | Bottom | LeftTop | LeftBottom, new Vector2I(GameConfig.TileCellSize * 2, GameConfig.TileCellSize));
-
- SetImageSrc(src, Center | Right | Top | RightTop, new Vector2I(0, GameConfig.TileCellSize * 2));
- SetImageSrc(src, Center | Left | Top | Right | LeftTop | RightTop, new Vector2I(GameConfig.TileCellSize, GameConfig.TileCellSize * 2));
- SetImageSrc(src, Center | Left | Top | LeftTop, new Vector2I(GameConfig.TileCellSize * 2, GameConfig.TileCellSize * 2));
- }
- else //2x2
- {
- CellNode.L_TerrainName.Instance.Text = data.TerrainInfo.Name + "\n2x2";
- var src = CellNode.UiPanel.TileSetSourceInfo.GetSourceImage();
-
- SetImageSrc(src, Center | RightBottom, new Vector2I(0, 0));
- SetImageSrc(src, Center | LeftBottom | RightBottom, new Vector2I(GameConfig.TileCellSize, 0));
- SetImageSrc(src, Center | LeftBottom, new Vector2I(GameConfig.TileCellSize * 2, 0));
-
- SetImageSrc(src, Center | RightTop | RightBottom, new Vector2I(0, GameConfig.TileCellSize));
- SetImageSrc(src, Center | LeftTop | LeftBottom | RightTop | RightBottom, new Vector2I(GameConfig.TileCellSize, GameConfig.TileCellSize));
- SetImageSrc(src, Center | LeftTop | LeftBottom, new Vector2I(GameConfig.TileCellSize * 2, GameConfig.TileCellSize));
-
- SetImageSrc(src, Center | RightTop, new Vector2I(0, GameConfig.TileCellSize * 2));
- SetImageSrc(src, Center | LeftTop | RightTop, new Vector2I(GameConfig.TileCellSize, GameConfig.TileCellSize * 2));
- SetImageSrc(src, Center | LeftTop, new Vector2I(GameConfig.TileCellSize * 2, GameConfig.TileCellSize * 2));
- }
-
- _texture.SetImage(_image);
- }
-
- private void SetImageSrc(Image src, uint bit, Vector2I dst)
- {
- if (Data.TerrainInfo.T.TryGetValue(bit, out var temp))
- {
- var pos = Data.TerrainInfo.GetPosition(temp);
- _image.BlitRect(src, new Rect2I(pos * GameConfig.TileCellSize, GameConfig.TileCellSizeVector2I), dst);
- }
- }
-
- public override void OnDestroy()
- {
- if (_texture != null)
- {
- _texture.Dispose();
- _texture = null;
- }
-
- if (_image != null)
- {
- _image.Dispose();
- _image = null;
- }
- }
-
- public override void OnSelect()
- {
- CellNode.L_Select.Instance.Visible = true;
- CellNode.UiPanel.EditorTileMap.SetCurrTerrain(Data);
- }
-
- public override void OnUnSelect()
- {
- CellNode.L_Select.Instance.Visible = false;
- }
- }