Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / room / RoomDoor.cs
@小李xl 小李xl on 3 Jun 2023 2 KB 引入Godot表格插件
  1.  
  2. using Godot;
  3.  
  4. /// <summary>
  5. /// 房间的门, 门有两种状态, 打开和关闭
  6. /// </summary>
  7. public partial class RoomDoor : ActivityObject
  8. {
  9. /// <summary>
  10. /// 门的方向
  11. /// </summary>
  12. public DoorDirection Direction => _door.Direction;
  13. /// <summary>
  14. /// 门是否关闭
  15. /// </summary>
  16. public bool IsClose { get; private set; }
  17. private RoomDoorInfo _door;
  18. private bool waitDisabledCollision = false;
  19.  
  20. public override void OnInit()
  21. {
  22. AnimatedSprite.AnimationFinished += OnAnimationFinished;
  23. }
  24.  
  25. /// <summary>
  26. /// 初始化调用
  27. /// </summary>
  28. public void Init(RoomDoorInfo doorInfo)
  29. {
  30. _door = doorInfo;
  31. IsClose = false;
  32. OpenDoorHandler();
  33. }
  34.  
  35. /// <summary>
  36. /// 打开当前的门
  37. /// </summary>
  38. public void OpenDoor()
  39. {
  40. IsClose = false;
  41. //Visible = false;
  42. waitDisabledCollision = true;
  43. if (AnimatedSprite.SpriteFrames.HasAnimation(AnimatorNames.OpenDoor))
  44. {
  45. AnimatedSprite.Play(AnimatorNames.OpenDoor);
  46. }
  47. }
  48.  
  49. /// <summary>
  50. /// 关闭当前的门
  51. /// </summary>
  52. public void CloseDoor()
  53. {
  54. IsClose = true;
  55. //Visible = true;
  56. Collision.Disabled = false;
  57. if (_door.Navigation != null)
  58. {
  59. _door.Navigation.OpenNavigationNode.Enabled = false;
  60. _door.Navigation.OpenNavigationNode.Visible = false;
  61. _door.Navigation.CloseNavigationNode.Enabled = true;
  62. _door.Navigation.CloseNavigationNode.Visible = true;
  63. }
  64. if (AnimatedSprite.SpriteFrames.HasAnimation(AnimatorNames.CloseDoor))
  65. {
  66. AnimatedSprite.Play(AnimatorNames.CloseDoor);
  67. }
  68. //调整门的层级
  69. switch (Direction)
  70. {
  71. case DoorDirection.E:
  72. case DoorDirection.W:
  73. case DoorDirection.S:
  74. ZIndex = GameConfig.TopMapLayer;
  75. break;
  76. case DoorDirection.N:
  77. ZIndex = GameConfig.MiddleMapLayer;
  78. break;
  79. }
  80. }
  81.  
  82. private void OnAnimationFinished()
  83. {
  84. if (!IsClose && waitDisabledCollision) //开门动画播放完成
  85. {
  86. waitDisabledCollision = false;
  87. OpenDoorHandler();
  88. }
  89. }
  90.  
  91. private void OpenDoorHandler()
  92. {
  93. Collision.Disabled = true;
  94. if (_door.Navigation != null)
  95. {
  96. _door.Navigation.OpenNavigationNode.Enabled = true;
  97. _door.Navigation.OpenNavigationNode.Visible = true;
  98. _door.Navigation.CloseNavigationNode.Enabled = false;
  99. _door.Navigation.CloseNavigationNode.Visible = false;
  100. }
  101. //调整门的层级
  102. ZIndex = GameConfig.FloorMapLayer;
  103. }
  104. }