Godot-SpaceShooter/Scripts/PlayerShip.cs

78 lines
2.6 KiB
C#

using Godot;
namespace GodotspaceShooter.Scripts;
public partial class PlayerShip : Node3D {
[Export] private PackedScene explosion;
[Export] private Node3D jet;
[Export] private PackedScene laser;
[Export] private RigidBody3D rbPlayer;
[Export] private Node3D shots;
private const float jetTimerMax = 0.5f;
private const float laserTimerMax = 1f;
private float laserTimer = laserTimerMax;
private float jetTimer = jetTimerMax;
public float MoveVelocity { get; private set; } = 10f;
public float RotationVelocity { get; private set; } = 15f;
public Vector3 MoveDirection { get; set; }
public Vector3 RotationDirection { get; set; }
public bool Shooting { get; set; }
public static PlayerShip Instance { get; private set; }
public override void _Ready() {
Position = new(0, 0, 5);
Instance = this;
}
public override void _Process(double delta) {
if (Shooting)
if (laser.Instantiate() is Node3D shot) {
shot.Position = rbPlayer.Position + new Vector3(0f, 0f, 0.74f);
shots.AddChild(shot);
SoundManager.Instance.Play(SoundManager.Sound.Laser, rbPlayer.Position);
Shooting = false;
}
}
public override void _PhysicsProcess(double delta) {
//Movement
if (MoveDirection != Vector3.Zero) {
jet.Visible = true;
KinematicCollision3D collision = rbPlayer.MoveAndCollide(MoveDirection * (float)delta);
if (collision?.GetCollider() is Node3D collider) {
Node3D parent = collider.GetParent<Node3D>();
Vector3 collisionPosition = collision.GetPosition();
switch (parent) {
case GameArea:
GD.Print($"PlayerShip hits GameArea");
break;
case Asteroid asteroid:
Explode(collisionPosition);
asteroid.Explode(collisionPosition);
break;
}
}
}
else {
jet.Visible = false;
}
//Rotation
rbPlayer.RotationDegrees = RotationDirection;
}
public void Explode(Vector3 collisionPosition) {
if (explosion?.Instantiate() is GpuParticles3D ex) {
GetParent().AddChild(ex);
ex.Position = collisionPosition;
ex.Emitting = true;
}
SoundManager.Instance.Play(SoundManager.Sound.PlayerExplosion, collisionPosition);
GameManager.Instance.Lives--;
}
}