mirror of
https://gitlab.com/MaddoScientisto/cirnogodot.git
synced 2026-06-10 04:35:54 +00:00
Lasers
This commit is contained in:
parent
95979bd3b8
commit
ba2f6a97fc
9 changed files with 254 additions and 26 deletions
82
Scripts/Weapons/LaserBullet.cs
Normal file
82
Scripts/Weapons/LaserBullet.cs
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
using System.Linq;
|
||||
using Godot;
|
||||
|
||||
namespace Cirno.Scripts.Weapons;
|
||||
|
||||
public partial class LaserBullet : Bullet
|
||||
{
|
||||
private Line2D _beam;
|
||||
private Timer _preFireTimer;
|
||||
private Timer _lethalTimer;
|
||||
private Timer _spawnDelayTimer;
|
||||
private bool _isLethal = false;
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
base._Ready();
|
||||
_beam = new Line2D
|
||||
{
|
||||
DefaultColor = BulletInfo.PreFireColor,
|
||||
Width = 1,
|
||||
Visible = false
|
||||
};
|
||||
AddChild(_beam);
|
||||
_beam.GlobalPosition = this.GlobalPosition;
|
||||
|
||||
// Delay before the beam appears
|
||||
_spawnDelayTimer = new Timer { WaitTime = BulletInfo.SpawnDelay, OneShot = true };
|
||||
_spawnDelayTimer.Timeout += ShowBeam;
|
||||
AddChild(_spawnDelayTimer);
|
||||
_spawnDelayTimer.Start();
|
||||
|
||||
FireLaser();
|
||||
}
|
||||
|
||||
public void FireLaser()
|
||||
{
|
||||
Vector2 endPoint = GetLaserEndPoint(GlobalPosition, BulletInfo.Direction);
|
||||
|
||||
_beam.ClearPoints();
|
||||
_beam.AddPoint(Vector2.Zero);
|
||||
_beam.AddPoint(ToLocal(endPoint));
|
||||
|
||||
_preFireTimer = new Timer { WaitTime = BulletInfo.PreFireTime, OneShot = true };
|
||||
_preFireTimer.Timeout += MakeLethal;
|
||||
AddChild(_preFireTimer);
|
||||
_preFireTimer.Start();
|
||||
}
|
||||
|
||||
private void ShowBeam()
|
||||
{
|
||||
_beam.Visible = true;
|
||||
}
|
||||
|
||||
private void MakeLethal()
|
||||
{
|
||||
_isLethal = true;
|
||||
_beam.DefaultColor = BulletInfo.LethalColor;
|
||||
_beam.Width = 3;
|
||||
|
||||
_lethalTimer = new Timer { WaitTime = BulletInfo.LethalTime, OneShot = true };
|
||||
_lethalTimer.Timeout += QueueFree; // Destroy after lethal phase
|
||||
AddChild(_lethalTimer);
|
||||
_lethalTimer.Start();
|
||||
}
|
||||
|
||||
protected override void RotateBullet(float degrees)
|
||||
{
|
||||
base.RotateBullet(degrees);
|
||||
|
||||
_beam.SetPointPosition(_beam.Points.Length -1, ToLocal(GetLaserEndPoint(GlobalPosition, _direction)));
|
||||
}
|
||||
|
||||
private Vector2 GetLaserEndPoint(Vector2 start, Vector2 direction)
|
||||
{
|
||||
var spaceState = GetWorld2D().DirectSpaceState;
|
||||
var query = PhysicsRayQueryParameters2D.Create(start, start + direction * 1000);
|
||||
query.CollisionMask = 1 << 0; // World layer
|
||||
var result = spaceState.IntersectRay(query);
|
||||
|
||||
return result.Count > 0 ? (Vector2)result["position"] : start + direction * 1000;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue