78 lines
2.8 KiB
C#
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();
|
|
}
|
|
} |