Godot-SpaceShooter/Scripts/Asteroid.cs

78 lines
2.8 KiB
C#

using Godot;
namespace GodotspaceShooter.Scripts;
[GlobalClass]
public partial class Asteroid : Node3D {
[Export] private CollisionShape3D asteroidCollisionShape;
[Export] private MeshInstance3D asteroidMesh;
[Export] public RigidBody3D AsteroidRb;
[Export] private PackedScene explosion;
[Export] private GpuParticlesCollisionSphere3D particleCollision;
private Vector3 rotation;
private float rotSpeed = 100f;
private float size;
private float speed;
public override void _EnterTree() {
Position = new((float)GD.RandRange(-4f, 4f), 0, -6.4f);
size = (float)GD.RandRange(0.25f, 0.75f);
Vector3 scale = new(size, size, size);
asteroidMesh.Scale = scale;
AsteroidRb.Scale = scale;
asteroidCollisionShape.Scale = scale;
speed = GD.Randf() * GameManager.Instance.Level * 0.1f + 1f;
rotation = new((float)GD.RandRange(-rotSpeed, rotSpeed), (float)GD.RandRange(-rotSpeed, rotSpeed), (float)GD.RandRange(-rotSpeed, rotSpeed));
}
public override void _Ready() { }
public override void _PhysicsProcess(double delta) {
AsteroidRb.Rotate(rotation.Normalized(), (float)delta);
if (GameManager.Instance.GameOver) return;
KinematicCollision3D collision = AsteroidRb.MoveAndCollide(new(0, 0, speed * (float)delta));
if (collision?.GetCollider() is Node3D collider) {
Node3D parent = collider.GetParent<Node3D>();
Vector3 collisionPosition = collision.GetPosition();
switch (parent) {
// case Asteroid collidedAsteroid:
// // collidedAsteroid.Explode(collisionPosition);
// // Explode(collisionPosition);
// break;
case PlayerShip:
PlayerShip.Instance.Explode(collisionPosition);
Explode(collisionPosition);
break;
case GameArea:
Explode(Vector3.Zero);
break;
case LaserBeam laserBeam:
GameManager.Instance.Points += GameManager.Instance.Level;
laserBeam.QueueFree();
Explode(collisionPosition);
break;
default:
GD.Print("Asteroid collided with unknown.");
break;
}
}
}
public void Explode(Vector3 exPosition) {
if (exPosition != Vector3.Zero) {
SoundManager.Instance.Play(SoundManager.Sound.AsteroidExplosion, exPosition);
if (explosion?.Instantiate() is GpuParticles3D ex) {
GetParent().AddChild(ex);
ex.Position = exPosition;
ex.Emitting = true;
}
}
GameManager.Instance.AsteroidNumber--;
QueueFree();
}
}