using Godot; namespace 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(-3.7, 3.7), 0, -6.4f); size = (float)GD.RandRange(0.5f, 1f); 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); KinematicCollision3D collision = AsteroidRb.MoveAndCollide(new(0, 0, speed * (float)delta)); if (collision?.GetCollider() is Node3D collider) { Node3D parent = collider.GetParent(); GD.Print($"{Name} collides with {parent.Name}"); Vector3 collisionPosition = collision.GetPosition(); switch (parent) { case Asteroid collidedAsteroid: // collidedAsteroid.Explode(collisionPosition); // Explode(collisionPosition); break; case PlayerShip: GameManager.Instance.Lives--; PlayerShip.Instance.Explode(collisionPosition); Explode(collisionPosition); break; case GameArea: Explode(Vector3.Zero); break; case LaserBeam laserBeam: GameManager.Instance.Points++; laserBeam.QueueFree(); Explode(collisionPosition); break; default: GD.Print("Asteroid collided with unknown."); break; } } } public void Explode(Vector3 exPosition) { if (exPosition != Vector3.Zero) { SoundManager.Instance.PlayExplosion(exPosition); if (explosion?.Instantiate() is GpuParticles3D ex) { GetParent().AddChild(ex); ex.Position = exPosition; ex.Emitting = true; } } GameManager.Instance.AsteroidNumber--; QueueFree(); } }