Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / room / RoomDoor.cs
@王晗智 王晗智 on 9 Mar 2024 2 KB 7

using Godot;

/// <summary>
/// 房间的门, 门有两种状态, 打开和关闭
/// </summary>
[Tool]
public partial class RoomDoor : ActivityObject
{
	/// <summary>
	/// 门的方向
	/// </summary>
	public DoorDirection Direction => _door.Direction;
	
	/// <summary>
	/// 门是否关闭
	/// </summary>
	public bool IsClose { get; private set; }
	
	private RoomDoorInfo _door;
	private bool waitDisabledCollision = false;
	private AnimatedSprite2D _animatedDown;

	public override void OnInit()
	{
		AnimatedSprite.AnimationFinished += OnAnimationFinished;
	}

	/// <summary>
	/// 初始化调用
	/// </summary>
	public void Init(RoomDoorInfo doorInfo)
	{
		_door = doorInfo;
		IsClose = false;
		if (doorInfo.Direction == DoorDirection.E || doorInfo.Direction == DoorDirection.W)
		{
			_animatedDown = GetNode<AnimatedSprite2D>("AnimatedSpriteDown");
		}

		OpenDoorHandler();
	}

	/// <summary>
	/// 打开当前的门
	/// </summary>
	public void OpenDoor()
	{
		IsClose = false;
		//Visible = false;
		waitDisabledCollision = true;
		if (AnimatedSprite.SpriteFrames.HasAnimation(AnimatorNames.OpenDoor))
		{
			AnimatedSprite.Play(AnimatorNames.OpenDoor);
		}

		if (_animatedDown != null && _animatedDown.SpriteFrames.HasAnimation(AnimatorNames.OpenDoor))
		{
			_animatedDown.Play(AnimatorNames.OpenDoor);
		}
	}

	/// <summary>
	/// 关闭当前的门
	/// </summary>
	public void CloseDoor()
	{
		IsClose = true;
		//Visible = true;
		Collision.Disabled = false;

		if (AnimatedSprite.SpriteFrames.HasAnimation(AnimatorNames.CloseDoor))
		{
			AnimatedSprite.Play(AnimatorNames.CloseDoor);
		}

		if (_animatedDown != null)
		{
			_animatedDown.Visible = false;
		}

		if (Direction == DoorDirection.E || Direction == DoorDirection.W)
		{
			ZIndex = MapLayer.CustomMiddleLayer2;
		}
	}

	private void OnAnimationFinished()
	{
		if (!IsClose && waitDisabledCollision) //开门动画播放完成
		{
			waitDisabledCollision = false;
			if (_animatedDown != null)
			{
				_animatedDown.Visible = true;
			}

			if (Direction == DoorDirection.E || Direction == DoorDirection.W)
			{
				ZIndex = 0;
			}
			OpenDoorHandler();
		}
	}

	private void OpenDoorHandler()
	{
		Collision.Disabled = true;
		//调整门的层级
		//ZIndex = MapLayer.AutoFloorLayer;
	}
}