using Godot; using UI.MapEditor; /// <summary> /// 瓷砖画笔 /// </summary> public class EditorTilePen : EditorToolBase { private bool _isPressed; private MouseButton _buttonIndex; //单次绘制是否改变过tile数据 private bool _changeFlag = false; private Vector2 _mousePosition; private Vector2I _mouseCellPosition; //上一帧鼠标所在的cell坐标 private Vector2I _prevMouseCellPosition = new Vector2I(-99999, -99999); public EditorTilePen(EditorTileMap editorTileMap) : base( ResourcePath.resource_sprite_ui_commonIcon_PenTool_png, "绘制瓷砖", true, editorTileMap, EditorToolEnum.TilePen) { } public override void Process(float delta) { var mousePosition = EditorTileMap.GetLocalMousePosition(); //绘制2x2地形 if ((!_isPressed || _buttonIndex != MouseButton.Right) && EditorTileMap.CurrBrushType == EditorTileMap.TileMapDrawMode.Terrain && EditorTileMap.CurrTerrain != null && EditorTileMap.CurrTerrain.TerrainInfo.TerrainType == 1) { mousePosition -= new Vector2(GameConfig.TileCellSize / 2f, GameConfig.TileCellSize / 2f); } _mouseCellPosition = EditorTileMap.LocalToMap(mousePosition); _mousePosition = _mouseCellPosition * GameConfig.TileCellSize; } public override void OnMapInputEvent(InputEvent @event) { if (@event is InputEventMouseButton mouseButton) { _buttonIndex = mouseButton.ButtonIndex; if (mouseButton.ButtonIndex == MouseButton.Left || mouseButton.ButtonIndex == MouseButton.Right) { _isPressed = mouseButton.Pressed; if (!_isPressed) { _changeFlag = false; } else if (_buttonIndex == MouseButton.Left) //绘制 { DoDrawCell(); } else if (_buttonIndex == MouseButton.Right) //擦除 { DoEraseCell(); } } } else if (@event is InputEventMouseMotion && _isPressed) { if (_buttonIndex == MouseButton.Left) //绘制 { DoDrawCell(); } else if (_buttonIndex == MouseButton.Right) //擦除 { DoEraseCell(); } } } private void DoDrawCell() { if (_prevMouseCellPosition != _mouseCellPosition || !_changeFlag) //鼠标位置变过 { _changeFlag = true; _prevMouseCellPosition = _mouseCellPosition; //绘制图块 EditorTileMap.SetSingleCell(_mouseCellPosition); } } private void DoEraseCell() { var position = EditorTileMap.GetLocalMousePosition(); var mouseCellPosition = EditorTileMap.LocalToMap(position); if (_prevMouseCellPosition != mouseCellPosition || !_changeFlag) //鼠标位置变过 { _changeFlag = true; _prevMouseCellPosition = mouseCellPosition; //绘制图块 EditorTileMap.EraseSingleCell(mouseCellPosition); } } public override void OnMapDrawTool(CanvasItem brush) { var canvasItem = brush; if (EditorTileMap.CurrLayer.Layer == MapLayer.AutoFloorLayer) //选择自动地板层 { DrawCellOutline(canvasItem); } else //自定义层 { if (EditorTileMap.CurrBrushType == EditorTileMap.TileMapDrawMode.Free || EditorTileMap.CurrBrushType == EditorTileMap.TileMapDrawMode.Combination) //自由绘制 或者 绘制组合 { if (_isPressed && _buttonIndex == MouseButton.Right) //按下了左键擦除 { DrawCellOutline(canvasItem); } else //正常绘制 { foreach (var item in EditorTileMap.CurrBrush) { var rect = new Rect2( _mousePosition + (item.Key + EditorTileMap.BrushOffset) * GameConfig.TileCellSize, GameConfig.TileCellSize, GameConfig.TileCellSize); var srcRect = new Rect2(item.Value * GameConfig.TileCellSize, GameConfig.TileCellSize, GameConfig.TileCellSize); canvasItem.DrawTextureRectRegion(EditorTileMap.CurrBrushTexture, rect, srcRect, new Color(1, 1, 1, 0.3f)); } } } else if (EditorTileMap.CurrBrushType == EditorTileMap.TileMapDrawMode.Terrain) //绘制地形 { if (EditorTileMap.CurrTerrain == null) //未选择地形 { DrawCellOutline(canvasItem); } else if (EditorTileMap.CurrTerrain.TerrainInfo.TerrainType == 0) //3x3 { DrawCellOutline(canvasItem); } else //2x2 { DrawCellOutline(canvasItem); if (!_isPressed || _buttonIndex != MouseButton.Right) //没按下左键擦除 { DrawCellOutline(canvasItem, new Vector2I(GameConfig.TileCellSize, 0)); DrawCellOutline(canvasItem, new Vector2I(0, GameConfig.TileCellSize)); DrawCellOutline(canvasItem, new Vector2I(GameConfig.TileCellSize, GameConfig.TileCellSize)); } } } } } private void DrawCellOutline(CanvasItem canvasItem) { canvasItem.DrawRect(new Rect2(_mousePosition, EditorTileMap.TileSet.TileSize), Colors.White, false, 2f / EditorTileMap.Scale.X); } private void DrawCellOutline(CanvasItem canvasItem, Vector2I offset) { canvasItem.DrawRect( new Rect2(_mousePosition + offset, EditorTileMap.TileSet.TileSize), Colors.White, false, 2f / EditorTileMap.Scale.X); } }