using System.Text.Json.Serialization; using Godot; /// <summary> /// 用于描述门生成区域 /// </summary> public class 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; } } }