Merge pull request 'Explosions' (#8) from Explosions into master

Reviewed-on: #8
pull/11/head
Dr. Sascha Woitschetzki 2023-10-23 11:16:04 +07:00
commit dfcbc81913
13 changed files with 179 additions and 45 deletions

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

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

@ -0,0 +1,10 @@
[gd_resource type="SphereMesh" load_steps=2 format=3 uid="uid://c1bemmgv6st52"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_mh4r4"]
albedo_color = Color(1, 1, 0, 0.419608)
emission_enabled = true
emission = Color(1, 0, 0, 1)
emission_energy_multiplier = 10.0
[resource]
material = SubResource("StandardMaterial3D_mh4r4")

@ -1,7 +1,8 @@
[gd_scene load_steps=9 format=3 uid="uid://6dn1gjqffnt"]
[gd_scene load_steps=10 format=3 uid="uid://6dn1gjqffnt"]
[ext_resource type="Script" path="res://Scripts/Asteroid.cs" id="1_ygr21"]
[ext_resource type="Texture2D" uid="uid://bt2aj3hcmb87q" path="res://Textures/prop_asteroid_01_dff.png" id="1_yruod"]
[ext_resource type="PackedScene" uid="uid://chkv84s8orhbr" path="res://Packed-Scenes/explosion.tscn" id="2_d3riq"]
[ext_resource type="Texture2D" uid="uid://swmr1hw148bp" path="res://Textures/prop_asteroid_01_nrm.png" id="2_xbjvi"]
[sub_resource type="SphereShape3D" id="SphereShape3D_leouh"]
@ -52,11 +53,13 @@ normal_enabled = true
normal_scale = 2.0
normal_texture = ExtResource("2_xbjvi")
[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)
[node name="Asteroid_01" type="Node3D" node_paths=PackedStringArray("asteroidRb", "asteroidMesh", "asteroidCollisionShape")]
transform = Transform3D(1.025, 0, 0, 0, 1.025, 0, 0, 0, 1.025, 0, 0, 0)
script = ExtResource("1_ygr21")
asteroidRb = NodePath("RigidBody3D")
asteroidMesh = NodePath("RigidBody3D/CollisionShape3D/prop_asteroid_01")
asteroidMesh = NodePath("RigidBody3D/prop_asteroid_01")
asteroidCollisionShape = NodePath("RigidBody3D/CollisionShape3D")
explosion = ExtResource("2_d3riq")
[node name="RigidBody3D" type="RigidBody3D" parent="."]
gravity_scale = 0.0
@ -64,7 +67,7 @@ gravity_scale = 0.0
[node name="CollisionShape3D" type="CollisionShape3D" parent="RigidBody3D"]
shape = SubResource("SphereShape3D_leouh")
[node name="prop_asteroid_01" type="MeshInstance3D" parent="RigidBody3D/CollisionShape3D"]
[node name="prop_asteroid_01" type="MeshInstance3D" parent="RigidBody3D"]
transform = Transform3D(1, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0)
mesh = SubResource("ArrayMesh_rks3f")
skeleton = NodePath("")

@ -1,7 +1,8 @@
[gd_scene load_steps=9 format=3 uid="uid://cvlxm2yrohsca"]
[gd_scene load_steps=10 format=3 uid="uid://cvlxm2yrohsca"]
[ext_resource type="Texture2D" uid="uid://c48y5hkprbmre" path="res://Textures/prop_asteroid_02_dff.png" id="1_hvwuc"]
[ext_resource type="Script" path="res://Scripts/Asteroid.cs" id="1_vm3mg"]
[ext_resource type="PackedScene" uid="uid://chkv84s8orhbr" path="res://Packed-Scenes/explosion.tscn" id="2_m7nsk"]
[ext_resource type="Texture2D" uid="uid://8uqgmlpi6x21" path="res://Textures/prop_asteroid_02_nrm.png" id="2_qs4n0"]
[sub_resource type="SphereShape3D" id="SphereShape3D_f4akn"]
@ -52,11 +53,13 @@ normal_enabled = true
normal_scale = 2.0
normal_texture = ExtResource("2_qs4n0")
[node name="Asteroid_02" type="Node3D" node_paths=PackedStringArray("asteroidRb", "asteroidMesh")]
[node name="Asteroid_02" type="Node3D" node_paths=PackedStringArray("asteroidRb", "asteroidMesh", "asteroidCollisionShape")]
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")
asteroidMesh = NodePath("RigidBody3D/prop_asteroid_02")
asteroidCollisionShape = NodePath("RigidBody3D/CollisionShape3D")
explosion = ExtResource("2_m7nsk")
[node name="RigidBody3D" type="RigidBody3D" parent="."]
gravity_scale = 0.0
@ -64,7 +67,7 @@ gravity_scale = 0.0
[node name="CollisionShape3D" type="CollisionShape3D" parent="RigidBody3D"]
shape = SubResource("SphereShape3D_f4akn")
[node name="prop_asteroid_02" type="MeshInstance3D" parent="RigidBody3D/CollisionShape3D"]
[node name="prop_asteroid_02" type="MeshInstance3D" parent="RigidBody3D"]
transform = Transform3D(1, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0)
mesh = SubResource("ArrayMesh_jk0jt")
skeleton = NodePath("")

@ -1,7 +1,8 @@
[gd_scene load_steps=9 format=3 uid="uid://brqqgidqchi88"]
[gd_scene load_steps=10 format=3 uid="uid://brqqgidqchi88"]
[ext_resource type="Script" path="res://Scripts/Asteroid.cs" id="1_ph38x"]
[ext_resource type="Texture2D" uid="uid://4sc40fjd4myy" path="res://Textures/prop_asteroid_03_dff.png" id="1_wdgmr"]
[ext_resource type="PackedScene" uid="uid://chkv84s8orhbr" path="res://Packed-Scenes/explosion.tscn" id="2_00f7o"]
[ext_resource type="Texture2D" uid="uid://qy0a83vkelqe" path="res://Textures/prop_asteroid_03_nrm.png" id="2_5yqc5"]
[sub_resource type="SphereShape3D" id="SphereShape3D_iq8kl"]
@ -52,11 +53,13 @@ normal_enabled = true
normal_scale = 2.0
normal_texture = ExtResource("2_5yqc5")
[node name="Asteroid_03" type="Node3D" node_paths=PackedStringArray("asteroidRb", "asteroidMesh")]
[node name="Asteroid_03" type="Node3D" node_paths=PackedStringArray("asteroidRb", "asteroidMesh", "asteroidCollisionShape")]
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")
asteroidMesh = NodePath("RigidBody3D/prop_asteroid_03")
asteroidCollisionShape = NodePath("RigidBody3D/CollisionShape3D")
explosion = ExtResource("2_00f7o")
[node name="RigidBody3D" type="RigidBody3D" parent="."]
gravity_scale = 0.0
@ -64,7 +67,7 @@ gravity_scale = 0.0
[node name="CollisionShape3D" type="CollisionShape3D" parent="RigidBody3D"]
shape = SubResource("SphereShape3D_iq8kl")
[node name="prop_asteroid_03" type="MeshInstance3D" parent="RigidBody3D/CollisionShape3D"]
[node name="prop_asteroid_03" type="MeshInstance3D" parent="RigidBody3D"]
mesh = SubResource("ArrayMesh_rnkma")
skeleton = NodePath("")
surface_material_override/0 = SubResource("StandardMaterial3D_mggxn")

@ -0,0 +1,67 @@
[gd_scene load_steps=11 format=3 uid="uid://chkv84s8orhbr"]
[ext_resource type="SphereMesh" uid="uid://c1bemmgv6st52" path="res://Material/explosion.tres" id="1_6sgsn"]
[ext_resource type="Script" path="res://Scripts/Explosion.cs" id="2_y6oxt"]
[sub_resource type="Curve" id="Curve_i7efe"]
_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
point_count = 2
[sub_resource type="CurveTexture" id="CurveTexture_xp5x6"]
curve = SubResource("Curve_i7efe")
[sub_resource type="Curve" id="Curve_43f32"]
_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
point_count = 2
[sub_resource type="CurveTexture" id="CurveTexture_s7b1r"]
curve = SubResource("Curve_43f32")
[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_ssaw8"]
emission_shape = 1
emission_sphere_radius = 1.0
radial_velocity_min = 0.5
radial_velocity_max = 1.0
radial_velocity_curve = SubResource("CurveTexture_xp5x6")
gravity = Vector3(0, 0, 0)
scale_min = 0.01
scale_max = 0.02
scale_curve = SubResource("CurveTexture_s7b1r")
turbulence_noise_strength = 0.5
turbulence_influence_max = 0.2
collision_mode = 2
collision_use_scale = true
sub_emitter_mode = 3
sub_emitter_amount_at_collision = 32
sub_emitter_keep_velocity = true
[sub_resource type="Curve" id="Curve_w41ea"]
_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
point_count = 2
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_0gt11"]
albedo_color = Color(1, 1, 0, 1)
albedo_texture_msdf = true
emission_enabled = true
emission = Color(1, 0, 0, 1)
emission_energy_multiplier = 10.0
use_particle_trails = true
[sub_resource type="RibbonTrailMesh" id="RibbonTrailMesh_gna8o"]
material = SubResource("StandardMaterial3D_0gt11")
size = 0.2
curve = SubResource("Curve_w41ea")
[node name="Explosion" type="GPUParticles3D"]
emitting = false
amount = 250
sub_emitter = NodePath(".")
one_shot = true
explosiveness = 1.0
trail_enabled = true
trail_lifetime = 0.5
process_material = SubResource("ParticleProcessMaterial_ssaw8")
draw_passes = 2
draw_pass_1 = ExtResource("1_6sgsn")
draw_pass_2 = SubResource("RibbonTrailMesh_gna8o")
script = ExtResource("2_y6oxt")

@ -36,6 +36,7 @@ script = ExtResource("3_imgbw")
[node name="BackgroundMusic" type="AudioStreamPlayer" parent="."]
stream = ExtResource("8_4ms0p")
volume_db = -20.0
autoplay = true
[node name="GameManager" type="Node" parent="." node_paths=PackedStringArray("labelAsteroids", "labelLifes")]
script = ExtResource("9_rsrr5")

@ -5,6 +5,8 @@ namespace Scripts;
public partial class Asteroid : Node3D {
[Export] private RigidBody3D asteroidRb;
[Export] private MeshInstance3D asteroidMesh;
[Export] private CollisionShape3D asteroidCollisionShape;
[Export] private PackedScene explosion;
private float speed;
private float rotSpeed = 100f;
@ -12,20 +14,16 @@ public partial class Asteroid : Node3D {
private Vector3 rotation;
public override void _Ready() {
size = GD.Randf();
asteroidRb.Mass = size;
speed = GD.Randf() * 5f + 1f;
asteroidRb.Position = new((float)GD.RandRange(-3.7, 3.7), 0, -6.4f);
asteroidRb.Scale = new(size, size,size);
asteroidMesh.Scale = new(size, size,size);
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() * 5f + 1f;
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;
}
public override void _PhysicsProcess(double delta) {
@ -34,18 +32,25 @@ public partial class Asteroid : Node3D {
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();
Vector3 collisionPosition = collision.GetPosition();
// if (collider is Asteroid asteroid) asteroid.Explode(collisionPosition);
Explode(collisionPosition);
}
//TODO: Change into collision with outer box
if (Position.Z >= 6.4f) {
if (asteroidRb.Position.Z >= 8f) {
GD.Print($"Asteroid {Name} below screen!");
Explode();
Explode(asteroidRb.Position);
}
}
private void Explode(Vector3 collisionPosition) {
if (explosion.Instantiate() is GpuParticles3D ex) {
GetParent().AddChild(ex);
ex.Position = collisionPosition;
ex.Emitting = true;
}
private void Explode() {
GameManager.Instance.AsteroidNumber--;
QueueFree();
}
}

@ -0,0 +1,8 @@
using Godot;
public partial class Explosion : GpuParticles3D
{
public override void _Process(double delta) {
if (!Emitting) QueueFree();
}
}

@ -5,45 +5,64 @@ namespace Scripts;
public partial class GameManager : Node
{
[Export] private Array<PackedScene> asteroids;
[Export] private float spawnRate = 0.1f;
[Export] private float spawnRate = 1f;
private float spawnTimer;
[Export] private RichTextLabel labelAsteroids;
[Export] private RichTextLabel labelLifes;
private int asteroidNumber;
private const int asteroidMaxNumber = 100;
public int AsteroidNumber {
get => asteroidNumber;
set {
asteroidNumber = value;
RefreshUi();
}
}
private int Lives {
get => lives;
set {
lives = value;
RefreshUi();
}
}
private const int asteroidMaxNumber = 3;
private int lives = 3;
private int asteroidNumber;
public static GameManager Instance { get; private set; }
public override void _Ready() {
Instance = this;
spawnTimer = spawnRate;
labelLifes.Text = $"Lives: {lives}";
labelAsteroids.Text = $"Asteroids: {asteroidNumber}";
RefreshUi();
}
public override void _Process(double delta) {
spawnTimer -= (float)delta;
if (spawnTimer < 0) {
if (asteroidNumber < asteroidMaxNumber) SpawnNewAsteroid();
if (AsteroidNumber < asteroidMaxNumber) SpawnNewAsteroid();
spawnTimer = spawnRate;
}
}
private void SpawnNewAsteroid() {
GD.Print("Spawn new asteroid");
asteroidNumber++;
AsteroidNumber++;
Node asteroid = asteroids.PickRandom().Instantiate();
asteroid.Name = $"Asteroid{asteroidNumber}";
asteroid.Name = $"Asteroid{AsteroidNumber}";
AddChild(asteroid);
labelAsteroids.Text = $"Asteroids: {asteroidNumber}";
}
public void RemoveLife() {
lives--;
private void RefreshUi() {
labelLifes.Text = $"Lives: {lives}";
if (lives <= 0 ) { GD.Print("GAME OVER!");}
labelAsteroids.Text = $"Asteroids: {asteroidNumber}";
}
private void RemoveLife() {
Lives--;
if (Lives <= 0 ) { GD.Print("GAME OVER!");}
}
}

@ -0,0 +1,9 @@
shader_type particles;
void start() {
// Called when a particle is spawned.
}
void process() {
// Called every frame on existing particles (according to the Fixed FPS property).
}