Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / activity / currency / Gold.cs

using System.Collections.Generic;
using Godot;

/// <summary>
/// 金币类
/// </summary>
[Tool]
public partial class Gold : ActivityObject, IPoolItem
{
    /// <summary>
    /// 金币数量
    /// </summary>
    [Export]
    public int GoldCount { get; set; } = 1;
    
    public bool IsRecycled { get; set; }
    public string Logotype { get; set; }
    
    private float _maxSpeed = 250;
    private float _speed = 0;
    private Role _moveTarget;
    
    public override void OnInit()
    {
        DefaultLayer = RoomLayerEnum.YSortLayer;
    }

    protected override void OnThrowOver()
    {
        var current = World.Player;
        if (current != null)
        {
            this.CallDelay(0.3f, () =>
            {
                _moveTarget = current;
                MoveController.Enable = false;
            });
        }
    }

    protected override void Process(float delta)
    {
        if (_moveTarget != null && !_moveTarget.IsDestroyed)
        {
            var position = Position;
            var targetPosition = _moveTarget.Position;
            if (position.DistanceSquaredTo(targetPosition) < 3 * 3)
            {
                _moveTarget.AddGold(GoldCount);
                ObjectPool.Reclaim(this);
            }
            else
            {
                _speed = Mathf.MoveToward(_speed, _maxSpeed, _maxSpeed * delta);
                Position = position.MoveToward(targetPosition, _speed * delta);
            }
        }
    }
    
    public void OnReclaim()
    {
        GetParent().RemoveChild(this);
        _moveTarget = null;
    }

    public void OnLeavePool()
    {
        _speed = 0;
        MoveController.Enable = true;
        MoveController.ClearForce();
        MoveController.SetAllVelocity(Vector2.Zero);
    }
    
    /// <summary>
    /// 创建散落的金币
    /// </summary>
    /// <param name="position">位置</param>
    /// <param name="count">金币数量</param>
    /// <param name="force">投抛力度</param>
    public static List<Gold> CreateGold(Vector2 position, int count, int force = 10)
    {
        var list = new List<Gold>();
        var goldList = Utils.GetGoldList(count);
        foreach (var id in goldList)
        {
            var o = ObjectManager.GetActivityObject<Gold>(id);
            o.Position = position;
            o.Throw(0,
                Utils.Random.RandomRangeInt(5 * force, 11 * force),
                new Vector2(Utils.Random.RandomRangeInt(-2 * force, 2 * force), Utils.Random.RandomRangeInt(-2 * force, 2 * force)),
                0
            );
            list.Add(o);
        }

        return list;
    }
}