Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / common / editor / toolBtn / EditorObjectTool.cs
@小李xl 小李xl on 17 Jul 3 KB 地牢编辑器移植完成

using System.Collections.Generic;
using Godot;
using UI.MapEditor;
using UI.MapEditorObject;
using UI.MapEditorTools;

public class EditorObjectTool : EditorToolBase
{
    private bool _isPressed;
    private int _flag = 0;
    //private Vector2 _offset;
    
    private UiGrid<MapEditorObject.Item, RoomObjectInfo> _objectGrid;
    private Dictionary<RoomObjectInfo, MapEditorToolsPanel.CustonObjectData> _customObjecMapping;

    
    public EditorObjectTool(EditorTileMap editorTileMap) : base(
        ResourcePath.resource_sprite_ui_commonIcon_DoorTool_png, "编辑物体", true, editorTileMap, EditorToolEnum.ObjectTool)
    {
    }

    public override void OnSetSelected(bool selected)
    {
        _objectGrid = EditorTileMap.MapEditorPanel.S_MapEditorObject.Instance.ObjectGrid;
        _customObjecMapping = EditorTileMap.MapEditorToolsPanel.CustomObjecMapping;
    }

    public override void OnMapInputEvent(InputEvent @event)
    {
        if (@event is InputEventMouseButton mouseButton)
        {
            if (mouseButton.ButtonIndex == MouseButton.Left)
            {
                _isPressed = mouseButton.Pressed;
                if (_isPressed)
                {
                    DoSelectObject();
                }
                else
                {
                    _flag = 0;
                }
            }
        }
        else if (_isPressed && _flag > 0 && _objectGrid.SelectData != null && @event is InputEventMouseMotion)
        {
            DoMoveObject();
        }
    }

    private void DoSelectObject()
    {
        var result = DoCollision();
        if (result != null)
        {
            if (_objectGrid.SelectData != result.Info)
            {
                //_offset = result.Position - EditorTileMap.GetLocalMousePosition();
                EventManager.EmitEvent(EventEnum.OnSelectObject, result.Info);
            }
            else
            {
                _flag++;
            }
        }
        else
        {
            _flag = 0;
        }
    }

    private void DoMoveObject()
    {
        if (_objectGrid.SelectData != null && _customObjecMapping.TryGetValue(_objectGrid.SelectData, out var objectData))
        {
            var position = EditorTileMap.GetLocalMousePosition();// - _offset;
            var nodeInstance = objectData.Node.Instance;
            nodeInstance.Position = position;
            nodeInstance.Info.X = (int)position.X;
            nodeInstance.Info.Y = (int)position.Y;
            
            EventManager.EmitEvent(EventEnum.OnTileMapDirty);
        }
    }

    private CustomObject DoCollision()
    {
        var param = new PhysicsPointQueryParameters2D();
        param.Position = EditorTileMap.GetGlobalMousePosition();
        param.CollisionMask = PhysicsLayer.UiMouse;
        param.CollideWithAreas = true;
        var result = EditorTileMap.GetWorld2D().DirectSpaceState.IntersectPoint(param);

        if (result.Count > 0)
        {
            foreach (var dictionary in result)
            {
                if (dictionary.TryGetValue("collider", out var collider))
                {
                    if ((Node2D)collider is CustomObject customObject)
                    {
                        return customObject;
                    }
                }
            }
        }

        return null;
    }
}