Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / image / FreezeSprite.cs
  1.  
  2. using Godot;
  3.  
  4. /// <summary>
  5. /// 用于绘制静止不动的 ActivityObject,从而优化性能
  6. /// </summary>
  7. public class FreezeSprite : IDestroy
  8. {
  9. public bool IsDestroyed { get; private set; }
  10. /// <summary>
  11. /// 所在位置
  12. /// </summary>
  13. public Vector2 Position { get; private set; }
  14. /// <summary>
  15. /// 所属对象
  16. /// </summary>
  17. public ActivityObject ActivityObject { get; }
  18. /// <summary>
  19. /// 是否已经被冻结
  20. /// </summary>
  21. public bool IsFrozen { get; private set; }
  22.  
  23. private Node _spriteParent;
  24. private int _spriteIndex;
  25. private Node _shadowParent;
  26. private int _shadowIndex;
  27. private Node _parent;
  28. public FreezeSprite(ActivityObject ao)
  29. {
  30. ActivityObject = ao;
  31. _spriteParent = ao.AnimatedSprite.GetParent();
  32. _shadowParent = ao.ShadowSprite.GetParent();
  33. }
  34.  
  35. /// <summary>
  36. /// 冻结精灵,这样 ActivityObject 多余的节点就会被移出场景树,逻辑也会被暂停,从而优化性能
  37. /// </summary>
  38. public void Freeze()
  39. {
  40. if (IsFrozen)
  41. {
  42. return;
  43. }
  44.  
  45. var affiliationArea = ActivityObject.AffiliationArea;
  46. if (affiliationArea == null)
  47. {
  48. Debug.LogError("物体的 AffiliationArea 属性为空,不能调用 Freeze() 函数!");
  49. return;
  50. }
  51.  
  52. Position = ActivityObject.Position;
  53. affiliationArea.RoomInfo.StaticSprite.AddFreezeSprite(this);
  54. HandlerFreezeSprite();
  55. }
  56.  
  57. /// <summary>
  58. /// 解冻精灵,让 ActivityObject 恢复正常功能
  59. /// </summary>
  60. public void Unfreeze()
  61. {
  62. if (!IsFrozen)
  63. {
  64. return;
  65. }
  66.  
  67. IsFrozen = false;
  68.  
  69. ActivityObject.AffiliationArea.RoomInfo.StaticSprite.RemoveFreezeSprite(this);
  70. HandlerUnfreezeSprite();
  71. }
  72.  
  73. public void HandlerFreezeSprite()
  74. {
  75. IsFrozen = true;
  76. var affiliationArea = ActivityObject.AffiliationArea;
  77. _spriteIndex = ActivityObject.AnimatedSprite.GetIndex();
  78. _shadowIndex = ActivityObject.ShadowSprite.GetIndex();
  79. var staticSprite = affiliationArea.RoomInfo.StaticSprite;
  80. ActivityObject.ShadowSprite.Reparent(staticSprite);
  81. ActivityObject.AnimatedSprite.Reparent(staticSprite);
  82. _parent = ActivityObject.GetParent();
  83. _parent.RemoveChild(ActivityObject);
  84. }
  85.  
  86. public void HandlerUnfreezeSprite()
  87. {
  88. IsFrozen = false;
  89. _parent.CallDeferred(Node.MethodName.AddChild, ActivityObject);
  90. ActivityObject.ShadowSprite.Reparent(_shadowParent);
  91. ActivityObject.AnimatedSprite.Reparent(_spriteParent);
  92.  
  93. if (_spriteIndex > _shadowIndex)
  94. {
  95. _shadowParent.MoveChild(ActivityObject.ShadowSprite, _shadowIndex);
  96. _spriteParent.MoveChild(ActivityObject.AnimatedSprite, _spriteIndex);
  97. }
  98. else
  99. {
  100. _spriteParent.MoveChild(ActivityObject.AnimatedSprite, _spriteIndex);
  101. _shadowParent.MoveChild(ActivityObject.ShadowSprite, _shadowIndex);
  102. }
  103. }
  104. public void Destroy()
  105. {
  106. if (IsDestroyed)
  107. {
  108. return;
  109. }
  110.  
  111. IsDestroyed = true;
  112. if (IsFrozen)
  113. {
  114. ActivityObject.Destroy();
  115. ActivityObject.AnimatedSprite.QueueFree();
  116. ActivityObject.ShadowSprite.QueueFree();
  117. }
  118. }
  119. }