Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / data / DoorAreaInfo.cs
@小李xl 小李xl on 26 Jul 2023 2 KB 创建门区域, 开发中

using System.Text.Json.Serialization;
using Godot;

/// <summary>
/// 用于描述门生成区域
/// </summary>
public class DoorAreaInfo : IClone<DoorAreaInfo>
{
    /// <summary>
    /// 门方向
    /// </summary>
    [JsonInclude]
    public DoorDirection Direction;
    /// <summary>
    /// 起始位置, 相对 tilemap 的横/纵轴原点, 单位: 像素
    /// </summary>
    [JsonInclude]
    public float Start = 0;
    /// <summary>
    /// 结束位置, 相对 tilemap 的横/纵轴原点, 单位: 像素
    /// </summary>
    [JsonInclude]
    public float End = 16;
    
    /// <summary>
    /// 起始点坐标, 该坐标为模板场景的世界坐标, 单位: 像素, 不参与序列化与反序列化
    /// </summary>
    public Vector2 StartPosition;
    /// <summary>
    /// 结束点坐标, 该坐标为模板场景的世界坐标, 单位: 像素, 不参与序列化与反序列化
    /// </summary>
    public Vector2 EndPosition;

    public DoorAreaInfo()
    {
    }

    public DoorAreaInfo(DoorDirection direction, float start, float end)
    {
        Direction = direction;
        Start = start;
        End = end;
    }
    
    /// <summary>
    /// 自动计算 startPosition 和 endPosition
    /// </summary>
    public void CalcPosition(Vector2 rootPosition, Vector2 rootSize)
    {
        switch (Direction)
        {
            case DoorDirection.E:
                StartPosition = new Vector2(rootPosition.X, rootPosition.Y + Start);
                EndPosition = new Vector2(rootPosition.X, rootPosition.Y + End);
                break;
            case DoorDirection.W:
                StartPosition = new Vector2(rootPosition.X + rootSize.X, rootPosition.Y + Start);
                EndPosition = new Vector2(rootPosition.X + rootSize.X, rootPosition.Y + End);
                break;
            case DoorDirection.S:
                StartPosition = new Vector2(rootPosition.X + Start, rootPosition.Y + rootSize.Y);
                EndPosition = new Vector2(rootPosition.X + End, rootPosition.Y + rootSize.Y);
                break;
            case DoorDirection.N:
                StartPosition = new Vector2(rootPosition.X + Start, rootPosition.Y);
                EndPosition = new Vector2(rootPosition.X + End, rootPosition.Y);
                break;
        }
    }

    public DoorAreaInfo Clone()
    {
        var data = new DoorAreaInfo();
        data.Start = Start;
        data.End = End;
        data.Direction = Direction;
        return data;
    }
    
    
}