Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / activity / bullet / normal / Arrow.cs
@小李xl 小李xl on 15 Feb 2024 1 KB 地牢编辑器2格墙壁支持

using Godot;

[Tool]
public partial class Arrow : Bullet, IMountItem
{
    [Export, ExportFillNode]
    public AnimatedSprite2D HalfSprite { get; set; }

    public override void InitData(BulletData data, uint attackLayer)
    {
        base.InitData(data, attackLayer);
        EnableVerticalMotion = false;
        DefaultLayer = RoomLayerEnum.NormalLayer;
    }

    public override void OnPlayDisappearEffect()
    {
    }

    public override void OnPlayCollisionEffect(KinematicCollision2D collision)
    {
    }

    public override void OnCollisionTarget(IHurt hurt)
    {
        base.OnCollisionTarget(hurt);
        var activityObject = hurt.GetActivityObject();
        if (activityObject != null)
        {
            CallDeferred(nameof(OnBindTarget), activityObject);
        }
    }

    public override void LogicalFinish()
    {
        SetEnableMovement(false);
        var slideCollision = GetLastSlideCollision();
        if (slideCollision != null)
        {
            Position -= slideCollision.GetTravel();
        }
    }

    private void OnBindTarget(ActivityObject activityObject)
    {
        Altitude = -activityObject.ToLocal(GlobalPosition).Y;
        activityObject.AddMountObject(this);
    }

    public void OnMount(ActivityObject target)
    {
        Reparent(target);
        AnimatedSprite.Play(AnimatorNames.HalfEnd);
        HalfSprite.Visible = true;
    }

    public void OnUnmount(ActivityObject target)
    {
        AnimatedSprite.Play(AnimatorNames.Default);
        HalfSprite.Visible = false;
        SetEnableMovement(true);
        EnableVerticalMotion = true;
        MoveController.ClearForce();
        MoveController.BasisVelocity = Vector2.Zero;
        ShadowOffset = new Vector2(0, 1);
        Throw(10, 60, new Vector2(20, 0), 0);
    }
}