- using Godot;
-
- /// <summary>
- /// 高速子弹
- /// </summary>
- public class HighSpeedBullet : Node2D, IBullet
- {
- public CampEnum TargetCamp { get; private set; }
-
- public Gun 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, Gun 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;
- }
- }