Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / activity / role / enemy / NoWeaponEnemy.cs
@小李xl 小李xl on 28 Nov 2023 2 KB 将将液体材质抽成配置表

using Config;
using Godot;

/// <summary>
/// 没有武器的敌人
/// </summary>
[Tool]
public partial class NoWeaponEnemy : Enemy
{
    private Vector2I? _prevPosition = null;
    private BrushImageData _brushData3;
    
    public override void OnInit()
    {
        base.OnInit();
        NoWeaponAttack = true;
        AnimationPlayer.AnimationFinished += OnAnimationFinished;
        
        _brushData3 = new BrushImageData(ExcelConfig.LiquidMaterial_Map["0002"]);
    }

    protected override void Process(float delta)
    {
        base.Process(delta);

        if (AffiliationArea != null)
        {
            var pos = AffiliationArea.RoomInfo.LiquidCanvas.ToLiquidCanvasPosition(Position);
            AffiliationArea.RoomInfo.LiquidCanvas.DrawBrush(_brushData3, _prevPosition, pos, 0);
            _prevPosition = pos;
        }
    }

    public override void Attack()
    {
        if (AnimationPlayer.CurrentAnimation != AnimatorNames.Attack)
        {
            AnimationPlayer.Play(AnimatorNames.Attack);
        }
    }

    public void ShootBullet()
    {
        var targetPosition = LookTarget.GetCenterPosition();
        var bulletData = FireManager.GetBulletData(this, 0, ExcelConfig.BulletBase_Map["0006"]);
        for (var i = 0; i < 8; i++)
        {
            var data = bulletData.Clone();
            var tempPos = new Vector2(targetPosition.X + Utils.Random.RandomRangeInt(-30, 30), targetPosition.Y +  + Utils.Random.RandomRangeInt(-30, 30));
            FireManager.SetParabolaTarget(data, tempPos);
            FireManager.ShootBullet(data, AttackLayer);
        }
    }

    protected override void OnDie()
    {
        var realVelocity = GetRealVelocity();
        var effPos = Position;
        var debris = Create(Ids.Id_enemy_dead0002);
        debris.PutDown(effPos, RoomLayerEnum.NormalLayer);
        debris.MoveController.AddForce(Velocity + realVelocity);
        debris.SetFace(Face);
        
        //派发敌人死亡信号
        EventManager.EmitEvent(EventEnum.OnEnemyDie, this);
        Destroy();
    }

    private void OnAnimationFinished(StringName name)
    {
        if (name == AnimatorNames.Attack)
        {
            AttackTimer = 2f;
        }
    }
}