Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / serialize / DoorAreaInfo.cs
  1.  
  2. using System.Text.Json.Serialization;
  3. using Godot;
  4.  
  5. /// <summary>
  6. /// 用于描述门生成区域
  7. /// </summary>
  8. public class DoorAreaInfo : IClone<DoorAreaInfo>
  9. {
  10. /// <summary>
  11. /// 门方向
  12. /// </summary>
  13. [JsonInclude]
  14. public DoorDirection Direction;
  15. /// <summary>
  16. /// 起始位置, 相对 tilemap 的横/纵轴原点, 单位: 像素
  17. /// </summary>
  18. [JsonInclude]
  19. public int Start = 0;
  20. /// <summary>
  21. /// 结束位置, 相对 tilemap 的横/纵轴原点, 单位: 像素
  22. /// </summary>
  23. [JsonInclude]
  24. public int End = 16;
  25. /// <summary>
  26. /// 起始点坐标, 该坐标为模板场景的世界坐标, 单位: 像素, 不参与序列化与反序列化
  27. /// </summary>
  28. public Vector2I StartPosition;
  29. /// <summary>
  30. /// 结束点坐标, 该坐标为模板场景的世界坐标, 单位: 像素, 不参与序列化与反序列化
  31. /// </summary>
  32. public Vector2I EndPosition;
  33.  
  34. public DoorAreaInfo()
  35. {
  36. }
  37.  
  38. public DoorAreaInfo(DoorDirection direction, int start, int end)
  39. {
  40. Direction = direction;
  41. Start = start;
  42. End = end;
  43. }
  44. /// <summary>
  45. /// 自动计算 startPosition 和 endPosition
  46. /// </summary>
  47. public void CalcPosition(Vector2I rootPosition, Vector2I rootSize)
  48. {
  49. switch (Direction)
  50. {
  51. case DoorDirection.E:
  52. StartPosition = new Vector2I(rootPosition.X, rootPosition.Y + Start);
  53. EndPosition = new Vector2I(rootPosition.X, rootPosition.Y + End);
  54. break;
  55. case DoorDirection.W:
  56. StartPosition = new Vector2I(rootPosition.X + rootSize.X, rootPosition.Y + Start);
  57. EndPosition = new Vector2I(rootPosition.X + rootSize.X, rootPosition.Y + End);
  58. break;
  59. case DoorDirection.S:
  60. StartPosition = new Vector2I(rootPosition.X + Start, rootPosition.Y + rootSize.Y);
  61. EndPosition = new Vector2I(rootPosition.X + End, rootPosition.Y + rootSize.Y);
  62. break;
  63. case DoorDirection.N:
  64. StartPosition = new Vector2I(rootPosition.X + Start, rootPosition.Y);
  65. EndPosition = new Vector2I(rootPosition.X + End, rootPosition.Y);
  66. break;
  67. }
  68. }
  69.  
  70. public DoorAreaInfo Clone()
  71. {
  72. var data = new DoorAreaInfo();
  73. data.Start = Start;
  74. data.End = End;
  75. data.Direction = Direction;
  76. return data;
  77. }
  78. }