Rotation and Movement of Asteroids working with physics

pull/11/head
Sascha 2023-10-21 16:53:03 +07:00
parent 1de9b25241
commit 09ca8e591f
6 changed files with 29 additions and 12 deletions

@ -0,0 +1,6 @@
<Project Sdk="Godot.NET.Sdk/4.2.0-dev.6">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<EnableDynamicLoading>true</EnableDynamicLoading>
</PropertyGroup>
</Project>

@ -52,10 +52,11 @@ normal_enabled = true
normal_scale = 2.0
normal_texture = ExtResource("2_xbjvi")
[node name="Asteroid_01" type="Node3D" node_paths=PackedStringArray("asteroidRb")]
[node name="Asteroid_01" type="Node3D" node_paths=PackedStringArray("asteroidRb", "asteroidMesh")]
transform = Transform3D(0.25, 0, 0, 0, 0.25, 0, 0, 0, 0.25, 0, 0, 0)
script = ExtResource("1_ygr21")
asteroidRb = NodePath("RigidBody3D")
asteroidMesh = NodePath("RigidBody3D/CollisionShape3D/prop_asteroid_01")
[node name="RigidBody3D" type="RigidBody3D" parent="."]
gravity_scale = 0.0

@ -52,10 +52,11 @@ normal_enabled = true
normal_scale = 2.0
normal_texture = ExtResource("2_qs4n0")
[node name="Asteroid_02" type="Node3D" node_paths=PackedStringArray("asteroidRb")]
[node name="Asteroid_02" type="Node3D" node_paths=PackedStringArray("asteroidRb", "asteroidMesh")]
transform = Transform3D(0.25, 0, 0, 0, 0.25, 0, 0, 0, 0.25, 0, 0, 0)
script = ExtResource("1_vm3mg")
asteroidRb = NodePath("RigidBody3D")
asteroidMesh = NodePath("RigidBody3D/CollisionShape3D/prop_asteroid_02")
[node name="RigidBody3D" type="RigidBody3D" parent="."]
gravity_scale = 0.0

@ -52,10 +52,11 @@ normal_enabled = true
normal_scale = 2.0
normal_texture = ExtResource("2_5yqc5")
[node name="Asteroid_03" type="Node3D" node_paths=PackedStringArray("asteroidRb")]
[node name="Asteroid_03" type="Node3D" node_paths=PackedStringArray("asteroidRb", "asteroidMesh")]
transform = Transform3D(0.25, 0, 0, 0, 0.25, 0, 0, 0, 0.25, 0, 0, 0)
script = ExtResource("1_ph38x")
asteroidRb = NodePath("RigidBody3D")
asteroidMesh = NodePath("RigidBody3D/CollisionShape3D/prop_asteroid_03")
[node name="RigidBody3D" type="RigidBody3D" parent="."]
gravity_scale = 0.0

@ -4,6 +4,7 @@ namespace Scripts;
[GlobalClass]
public partial class Asteroid : Node3D {
[Export] private RigidBody3D asteroidRb;
[Export] private MeshInstance3D asteroidMesh;
private float speed;
private float rotSpeed = 100f;
@ -13,28 +14,32 @@ public partial class Asteroid : Node3D {
public override void _Ready() {
size = GD.Randf();
asteroidRb.Mass = size;
speed = GD.Randf() * 5f;
speed = GD.Randf() * 5f + 1f;
Scale = new(size, size,size);
asteroidRb.Scale = new(size, size,size);
asteroidMesh.Scale = new(size, size,size);
rotation = new((float)GD.RandRange(-rotSpeed, rotSpeed), (float)GD.RandRange(-rotSpeed, rotSpeed), (float)GD.RandRange(-rotSpeed, rotSpeed));
Position = new((float)GD.RandRange(-3.7, 3.7), 0, -6.4f);
}
public override void _Process(double delta) {
// Position += new Vector3(0, 0, speed * (float)delta);
RotationDegrees += rotation * (float)delta;
// RotationDegrees += rotation * (float)delta;
}
public override void _PhysicsProcess(double delta) {
KinematicCollision3D collision = asteroidRb.MoveAndCollide(new Vector3(0, 0, speed * (float)delta));
asteroidRb.Rotate(rotation.Normalized(), (float)delta);
KinematicCollision3D collision = asteroidRb.MoveAndCollide(new(0, 0, speed * (float)delta));
if (collision?.GetCollider() is Node3D collider) {
GD.Print($"{Name} collides with {collider.GetParentNode3D().Name}");
if (collider is Asteroid asteroid) asteroid.Explode();
Explode();
}
if (Position.Z > 7) {
//TODO: Change into collision with outer box
if (Position.Z >= 6.4f) {
GD.Print($"Asteroid {Name} below screen!");
Explode();
}

@ -5,13 +5,14 @@ namespace Scripts;
public partial class GameManager : Node
{
[Export] private Array<PackedScene> asteroids;
[Export] private float spawnRate = 1f;
[Export] private float spawnRate = 0.1f;
private float spawnTimer;
[Export] private RichTextLabel labelAsteroids;
[Export] private RichTextLabel labelLifes;
private int asteroidNumber;
private const int asteroidMaxNumber = 100;
private int lives = 3;
public static GameManager Instance { get; private set; }
@ -25,7 +26,10 @@ public partial class GameManager : Node
public override void _Process(double delta) {
spawnTimer -= (float)delta;
if (spawnTimer < 0) SpawnNewAsteroid();
if (spawnTimer < 0) {
if (asteroidNumber < asteroidMaxNumber) SpawnNewAsteroid();
spawnTimer = spawnRate;
}
}
private void SpawnNewAsteroid() {
@ -34,7 +38,6 @@ public partial class GameManager : Node
Node asteroid = asteroids.PickRandom().Instantiate();
asteroid.Name = $"Asteroid{asteroidNumber}";
AddChild(asteroid);
spawnTimer = spawnRate;
labelAsteroids.Text = $"Asteroids: {asteroidNumber}";
}