using Godot;
public partial class Railgun : Node3D
{
[Export] private Timer _fireRateTimer;
[Export] private Node3D _weaponMount;
[Export] private Marker3D _muzzle;
[Export] private GpuParticles3D _muzzleFlash;
[Export] private AudioStreamPlayer3D _fireSound;
// ... rest van de code
}
public void OnShoot(RayCast3D raycast)
{
if (!_fireRateTimer.IsStopped())
return;
_fireRateTimer.Start();
// Trigger muzzle flash
_muzzleFlash.Emitting = true;
// Speel fire sound
_fireSound.Play();
// Bepaal het eindpunt van de beam
Vector3 beamEnd = raycast.IsColliding()
? raycast.GetCollisionPoint()
: _muzzle.GlobalPosition - raycast.GlobalBasis.Z * 100;
// Teken de beam naar het hit point
ShowBeam(_muzzle.GlobalPosition, beamEnd);
// Check target hit
if (raycast.GetCollider() is Target targetHit)
targetHit.OnHit();
GD.Print("Railgun fired!");
}
using Godot;
public partial class Target : RigidBody3D
{
[Export] private Node3D _root;
[Export] private GpuParticles3D _hitParticles;
[Export] private AudioStreamPlayer3D _deathSound;
// ... rest van de code
}
using Godot;
public partial class Target : RigidBody3D
{
[Export] private Node3D _root;
[Export] private GpuParticles3D _hitParticles;
[Export] private AudioStreamPlayer3D _deathSound;
public void OnHit()
{
// Speel death sound
_deathSound.Play();
// Trigger hit particles
_hitParticles.Emitting = true;
GD.Print("Target destroyed!");
// Verberg alle meshes in de enemy
foreach (var child in _root.GetChildren())
{
if (child is MeshInstance3D mesh)
mesh.Visible = false;
}
// Wacht 2 seconden voordat we de enemy verwijderen
// Zo kunnen de particles en audio hun animatie afspelen
GetTree().CreateTimer(2.0).Timeout += () => _root.QueueFree();
}
}
using Godot;
public partial class Railgun : Node3D
{
[Export] private Timer _fireRateTimer;
[Export] private Node3D _weaponMount;
[Export] private Marker3D _muzzle;
[Export] private GpuParticles3D _muzzleFlash;
[Export] private AudioStreamPlayer _fireSound;
public override void _Process(double delta)
{
GlobalTransform = _weaponMount.GlobalTransform;
}
public void OnShoot(RayCast3D raycast)
{
if (!_fireRateTimer.IsStopped())
return;
_fireRateTimer.Start();
// Trigger muzzle flash
_muzzleFlash.Emitting = true;
// Speel fire sound
if (_fireSound != null)
_fireSound.Play();
// Bepaal het eindpunt van de beam
Vector3 beamEnd = raycast.IsColliding()
? raycast.GetCollisionPoint()
: _muzzle.GlobalPosition - raycast.GlobalBasis.Z * 100;
// Teken de beam naar het hit point
ShowBeam(_muzzle.GlobalPosition, beamEnd);
// Check target hit
if (raycast.GetCollider() is Target targetHit)
targetHit.OnHit();
GD.Print("Railgun fired!");
}
private void ShowBeam(Vector3 start, Vector3 end)
{
// Maak een cilinder mesh voor de beam
var beamMesh = new CylinderMesh();
beamMesh.TopRadius = 0.02f;
beamMesh.BottomRadius = 0.02f;
beamMesh.Height = 1.0f;
var material = new StandardMaterial3D();
material.ShadingMode = BaseMaterial3D.ShadingModeEnum.Unshaded;
material.AlbedoColor = Colors.Cyan;
material.NoDepthTest = true;
var beamInstance = new MeshInstance3D
{
Mesh = beamMesh,
MaterialOverride = material,
CastShadow = GeometryInstance3D.ShadowCastingSetting.Off
};
GetTree().Root.AddChild(beamInstance);
Vector3 direction = end - start;
float distance = direction.Length();
beamInstance.GlobalPosition = start + direction / 2;
beamInstance.LookAt(end, Vector3.Up);
beamInstance.RotateObjectLocal(Vector3.Right, Mathf.Pi / 2);
beamInstance.Scale = new Vector3(1, distance, 1);
GetTree().CreateTimer(0.05).Timeout += () => beamInstance.QueueFree();
}
}
using Godot;
public partial class Target : RigidBody3D
{
[Export] private Node3D _root;
[Export] private GpuParticles3D _hitParticles;
[Export] private AudioStreamPlayer3D _deathSound;
public void OnHit()
{
// Speel death sound
if (_deathSound != null)
_deathSound.Play();
// Trigger hit particles
if (_hitParticles != null)
_hitParticles.Emitting = true;
GD.Print("Target destroyed!");
// Verberg alle meshes in de enemy
foreach (var child in _root.GetChildren())
{
if (child is MeshInstance3D mesh)
mesh.Visible = false;
}
// Wacht 2 seconden voordat we de enemy verwijderen
// Zo kunnen de particles en audio hun animatie afspelen
GetTree().CreateTimer(2.0).Timeout += () => _root.QueueFree();
}
}