Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / DungeonRoomTemplate.cs
@lijincheng lijincheng on 17 Feb 2023 4 KB 编辑门区域工具开发

using System.Collections.Generic;
using Godot;

[Tool]
public partial class DungeonRoomTemplate : TileMap
{
    //是否悬停在线上
    private bool _hover = false;
    
    //悬停点
    private bool _hasHoverPoint = false;
    private Vector2 _hoverPoint1;
    private Vector2 _hoverPoint2;
    private bool _canPut = false;

    //选中点
    private bool _hasActivePoint = false;
    private byte _activePointType = 0;
    private DoorAreaInfo _activeArea = null;
    
    private bool _mouseDown = false;

    //
    private List<DoorAreaInfo> _doorConfigs = new List<DoorAreaInfo>();

    public override void _Process(double delta)
    {
        var isClick = false;
        if (Input.IsMouseButtonPressed(MouseButton.Left))
        {
            if (!_mouseDown)
            {
                _mouseDown = true;
                isClick = true;
            }
        }
        else if (_mouseDown)
        {
            _mouseDown = false;
            isClick = false;
        }
        
        if (TileSet != null)
        {
            var rect = CalcTileRange();
            var mousePosition = GetLocalMousePosition();

            var tileSize = TileSet.TileSize;
            if (Mathf.Abs(mousePosition.Y - rect.Position.Y) <= 2 && mousePosition.X >= rect.Position.X &&
                mousePosition.X <= rect.Position.X + rect.Size.X) //上
            {
                _hover = true;
                _hoverPoint1 = new Vector2(Approach(mousePosition.X, tileSize.X) - tileSize.X * 2, rect.Position.Y);
                _hoverPoint2 = new Vector2(_hoverPoint1.X + tileSize.X * 4, _hoverPoint1.Y);

                if (_hoverPoint1.X <= rect.Position.X && _hoverPoint2.X >= rect.Position.X + rect.Size.X)
                {
                    _canPut = false;
                }
                else
                {
                    _canPut = true;
                }
            }
            else if (Mathf.Abs(mousePosition.X - rect.Position.X) <= 2 && mousePosition.Y >= rect.Position.Y &&
                     mousePosition.Y <= rect.Position.Y + rect.Size.Y) //左
            {
                _hover = true;
                _hoverPoint1 = new Vector2(rect.Position.X, Approach(mousePosition.Y, tileSize.Y) - tileSize.Y * 2);
                _hoverPoint2 = new Vector2(_hoverPoint1.X, _hoverPoint1.Y + tileSize.X * 4);
            }
            else if (Mathf.Abs(mousePosition.Y - (rect.Position.Y + rect.Size.Y)) <= 2 &&
                     mousePosition.X >= rect.Position.X && mousePosition.X <= rect.Position.X + rect.Size.X) //下
            {
                _hover = true;
                _hoverPoint1 = new Vector2(Approach(mousePosition.X, tileSize.X) - tileSize.X * 2, rect.Position.Y + rect.Size.Y);
                _hoverPoint2 = new Vector2(_hoverPoint1.X + tileSize.X * 4, _hoverPoint1.Y);
                
                if (_hoverPoint1.X <= rect.Position.X && _hoverPoint2.X >= rect.Position.X + rect.Size.X)
                {
                    _canPut = false;
                }
                else
                {
                    _canPut = true;
                }
            }
            else if (Mathf.Abs(mousePosition.X - (rect.Position.X + rect.Size.X)) <= 2 &&
                     mousePosition.Y >= rect.Position.Y && mousePosition.Y <= rect.Position.Y + rect.Size.Y) //右
            {
                _hover = true;
                _hoverPoint1 = new Vector2(rect.Position.X + rect.Size.X, Approach(mousePosition.Y, tileSize.Y) - tileSize.Y * 2);
                _hoverPoint2 = new Vector2(_hoverPoint1.X, _hoverPoint1.Y + tileSize.X * 4);
            }
            else
            {
                _hover = false;
                _hasHoverPoint = false;
                _canPut = false;
            }

            QueueRedraw();
        }
    }

    public override void _Draw()
    {
        if (TileSet != null)
        {
            //绘制地图轮廓
            DrawRect(CalcTileRange(), _hover ? Colors.Green : new Color(0.03137255F,0.59607846F,0.03137255F), false, 2);
            //DrawCircle(GetLocalMousePosition(), 10, new Color(1, 0, 0,  0.5f));
            if (_hasHoverPoint)
            {
                DrawCircle(_hoverPoint1, 3, new Color(1, 0, 0, 0.5f));
                DrawCircle(_hoverPoint2, 3, new Color(1, 0, 0, 0.5f));
            }
        }
    }

    private void CreateDoorArea()
    {
        
    }

    private Rect2 CalcTileRange()
    {
        var usedRect = GetUsedRect();
        var pos = usedRect.Position * TileSet.TileSize;
        var size = usedRect.Size * TileSet.TileSize;
        return new Rect2(ToLocal(pos), size);
    }

    private float Approach(float value, float period)
    {
        var temp = value % period;
        if (Mathf.Abs(temp) >= period / 2)
        {
            return ((int)(value / period) + (value >= 0 ? 1 : -1)) * period;
        }

        return (int)(value / period) * period;
    }
}