Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / mapEditor / TileView / EditorTileMap.cs
using Godot;

namespace UI.MapEditor;

public partial class EditorTileMap : TileMap
{
    //鼠标坐标
    private Vector2 _mousePosition;
    //鼠标所在的cell坐标
    private Vector2I _mouseCellPosition;
    //上一帧鼠标所在的cell坐标
    private Vector2I _prevMouseCellPosition = new Vector2I(-99999, -99999);
    //鼠标中建是否按下
    private bool _isMiddlePressed = false;
    private Vector2 _moveOffset;

    public override void _Process(double delta)
    {
        var position = GetLocalMousePosition();
        _mouseCellPosition = new Vector2I(
            Mathf.FloorToInt(position.X / GameConfig.TileCellSize),
            Mathf.FloorToInt(position.Y / GameConfig.TileCellSize)
        );
        _mousePosition = new Vector2(
            _mouseCellPosition.X * GameConfig.TileCellSize,
            _mouseCellPosition.Y * GameConfig.TileCellSize
        );

        //左键绘制
        if (Input.IsMouseButtonPressed(MouseButton.Left))
        {
            if (_prevMouseCellPosition != _mouseCellPosition)
            {
                _prevMouseCellPosition = _mouseCellPosition;
                SetCell(GameConfig.FloorMapLayer, _mouseCellPosition, 0, new Vector2I(0,8));
            }
        }
        else if (Input.IsMouseButtonPressed(MouseButton.Right)) //右键擦除
        {
            if (_prevMouseCellPosition != _mouseCellPosition)
            {
                _prevMouseCellPosition = _mouseCellPosition;
                EraseCell(GameConfig.FloorMapLayer, _mouseCellPosition);
            }
        }
        else if (_isMiddlePressed) //中建移动
        {
            //GD.Print("移动...");
            Position = GetGlobalMousePosition() + _moveOffset;
        }
    }

    public override void _Draw()
    {
        DrawRect(new Rect2(_mousePosition, GameConfig.TileCellSize, GameConfig.TileCellSize), Colors.Wheat, false);
        DrawLine(new Vector2(0, 2000), new Vector2(0, -2000), Colors.Green);
        DrawLine(new Vector2(2000, 0), new Vector2( -2000, 0), Colors.Red);
    }

    public override void _Input(InputEvent @event)
    {
        if (@event is InputEventMouseButton mouseButton)
        {
            if (mouseButton.ButtonIndex == MouseButton.WheelDown)
            {
                //缩小
                Shrink();
            }
            else if (mouseButton.ButtonIndex == MouseButton.WheelUp)
            {
                //放大
                Magnify();
            }
            else if (mouseButton.ButtonIndex == MouseButton.Middle)
            {
                _isMiddlePressed = mouseButton.Pressed;
                if (_isMiddlePressed)
                {
                    _moveOffset = Position - mouseButton.GlobalPosition;
                    GD.Print(_moveOffset);
                }
            }
        }
    }

    //缩小
    private void Shrink()
    {
        var pos = GetLocalMousePosition();
        var scale = Scale / 1.1f;
        if (scale.LengthSquared() >= 0.5f)
        {
            Scale = scale;
            Position += pos * 0.1f * scale;
        }
        else
        {
            GD.Print("太小了");
        }
    }
    //放大
    private void Magnify()
    {
        var pos = GetLocalMousePosition();
        var prevScale = Scale;
        var scale = prevScale * 1.1f;
        if (scale.LengthSquared() <= 2000)
        {
            Scale = scale;
            Position -= pos * 0.1f * prevScale;
        }
        else
        {
            GD.Print("太大了");
        }
    }
}