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(); 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(); } }