Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / props / weapon / bullet / HighSpeedBullet.cs
@小李xl 小李xl on 24 Aug 2022 1 KB 架构调整
using Godot;

/// <summary>
/// 高速子弹
/// </summary>
public class HighSpeedBullet : Node2D, IBullet
{
    public CampEnum TargetCamp { get; private set; }

    public Weapon Gun { get; private set; }

    public Node2D Master { get; private set; }

    /// <summary>
    /// 碰撞物体后产生的火花
    /// </summary>
    [Export] public PackedScene Hit;

    //射线检测节点
    private RayCast2D RayCast2D;
    private Line2D Line;
    private float ca = 1;

    public void Init(CampEnum target, Weapon gun, Node2D master)
    {
        TargetCamp = target;
        Gun = gun;
        Master = master;

        //飞行距离
        var distance = MathUtils.RandRange(gun.Attribute.MinDistance, gun.Attribute.MaxDistance);

        //初始化子弹数据
        RayCast2D = GetNode<RayCast2D>("RayCast2D");
        Line = GetNode<Line2D>("Line");
        Modulate = Colors.White;

        // 目标点
        Vector2 targetPos = new Vector2(distance, 0);
        RayCast2D.CastTo = targetPos;
        RayCast2D.ForceRaycastUpdate();
        if (RayCast2D.IsColliding())
        {
            //碰到物体
            Vector2 collPosition = RayCast2D.GetCollisionPoint();
            Node2D hit = Hit.Instance<Node2D>();
            hit.RotationDegrees = MathUtils.RandRangeInt(0, 360);
            hit.GlobalPosition = collPosition;
            GetTree().CurrentScene.AddChild(hit);
            //划线的点坐标
            Line.SetPointPosition(1, new Vector2(Line.GlobalPosition.DistanceTo(collPosition), 0));
        }
        else
        {
            //划线的点坐标
            Line.SetPointPosition(1, targetPos);
        }
        RayCast2D.Enabled = false;
    }

    public override void _Process(float delta)
    {
        ca -= 12 * delta;
        if (ca <= 0) {
            QueueFree();
            return;
        }
        Color c = Modulate;
        c.a = ca;
        Modulate = c;
    }
}