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