Laser destroys Asteroid

pull/23/head
Sascha 2023-10-25 10:16:24 +07:00
parent 6f7d59682f
commit 9aff213b2d
20 changed files with 341 additions and 383 deletions

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

@ -20,3 +20,7 @@ scale_max = 0.02
scale_curve = SubResource("CurveTexture_s7b1r") scale_curve = SubResource("CurveTexture_s7b1r")
turbulence_noise_strength = 0.5 turbulence_noise_strength = 0.5
turbulence_influence_max = 0.2 turbulence_influence_max = 0.2
collision_mode = 1
collision_friction = 0.25
collision_bounce = 0.25
collision_use_scale = true

@ -0,0 +1,10 @@
[gd_resource type="StandardMaterial3D" load_steps=3 format=3 uid="uid://c8qfub1ip6uqj"]
[ext_resource type="Texture2D" uid="uid://x26n7stwftii" path="res://Textures/vehicle_playerShip_orange_dff.png" id="1_kbocw"]
[ext_resource type="Texture2D" uid="uid://bsoehauordi1i" path="res://Textures/vehicle_playerShip_orange_nrm.png" id="2_hmmbf"]
[resource]
albedo_texture = ExtResource("1_kbocw")
normal_enabled = true
normal_scale = 2.0
normal_texture = ExtResource("2_hmmbf")

@ -20,3 +20,7 @@ scale_max = 0.04
scale_curve = SubResource("CurveTexture_s7b1r") scale_curve = SubResource("CurveTexture_s7b1r")
turbulence_noise_strength = 0.5 turbulence_noise_strength = 0.5
turbulence_influence_max = 0.2 turbulence_influence_max = 0.2
collision_mode = 1
collision_friction = 0.25
collision_bounce = 0.25
collision_use_scale = true

@ -0,0 +1,10 @@
[gd_resource type="StandardMaterial3D" load_steps=3 format=3 uid="uid://cdygx16ou11yk"]
[ext_resource type="Texture2D" uid="uid://bt2aj3hcmb87q" path="res://Textures/prop_asteroid_01_dff.png" id="1_q5cc1"]
[ext_resource type="Texture2D" uid="uid://swmr1hw148bp" path="res://Textures/prop_asteroid_01_nrm.png" id="2_wilpe"]
[resource]
albedo_texture = ExtResource("1_q5cc1")
normal_enabled = true
normal_scale = 2.0
normal_texture = ExtResource("2_wilpe")

@ -0,0 +1,10 @@
[gd_resource type="StandardMaterial3D" load_steps=3 format=3 uid="uid://ck5lw8ahodm7l"]
[ext_resource type="Texture2D" uid="uid://4sc40fjd4myy" path="res://Textures/prop_asteroid_03_dff.png" id="1_spi38"]
[ext_resource type="Texture2D" uid="uid://qy0a83vkelqe" path="res://Textures/prop_asteroid_03_nrm.png" id="2_rt7ui"]
[resource]
albedo_texture = ExtResource("1_spi38")
normal_enabled = true
normal_scale = 2.0
normal_texture = ExtResource("2_rt7ui")

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -1,16 +1,28 @@
[gd_scene load_steps=4 format=3 uid="uid://ck31g3hvggoh"] [gd_scene load_steps=4 format=3 uid="uid://ck31g3hvggoh"]
[ext_resource type="Material" uid="uid://jsqnryvk0qes" path="res://Material/LaserBeamProcess.tres" id="1_6pmub"] [ext_resource type="Script" path="res://Scripts/LaserBeam.cs" id="1_52i1t"]
[ext_resource type="CapsuleMesh" uid="uid://yydtguqwa6us" path="res://Material/LaserBeamMaterial.tres" id="2_tfobi"]
[ext_resource type="TubeTrailMesh" uid="uid://c1o741o1u6ad7" path="res://Material/LaserBeamTrail.tres" id="3_ntth3"]
[node name="LaserBeam" type="Node3D"] [sub_resource type="SphereShape3D" id="SphereShape3D_n8opw"]
radius = 0.05
[node name="GPUParticles3D" type="GPUParticles3D" parent="."] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_wdq46"]
emitting = false emission_enabled = true
amount = 1 emission = Color(1, 1, 0, 1)
trail_enabled = true emission_energy_multiplier = 10.0
process_material = ExtResource("1_6pmub")
draw_passes = 2 [node name="LaserBeam" type="Node3D" node_paths=PackedStringArray("rigidBody")]
draw_pass_1 = ExtResource("2_tfobi") script = ExtResource("1_52i1t")
draw_pass_2 = ExtResource("3_ntth3") rigidBody = NodePath("RigidBody3D")
[node name="RigidBody3D" type="RigidBody3D" parent="."]
mass = 0.1
gravity_scale = 0.0
[node name="CollisionShape3D" type="CollisionShape3D" parent="RigidBody3D"]
shape = SubResource("SphereShape3D_n8opw")
[node name="CSGSphere3D" type="CSGSphere3D" parent="RigidBody3D/CollisionShape3D"]
radius = 0.05
radial_segments = 24
rings = 12
material = SubResource("StandardMaterial3D_wdq46")

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -36,11 +36,46 @@ region_enabled = true
region_rect = Rect2(0, 0, 810, 1380) region_rect = Rect2(0, 0, 810, 1380)
script = ExtResource("3_imgbw") script = ExtResource("3_imgbw")
[node name="GameManager" type="Node" parent="." node_paths=PackedStringArray("labelAsteroids", "labelLifes")] [node name="GameArea" type="Node3D" parent="."]
script = ExtResource("11_p0rh7")
[node name="GameAreaRigidBody3D" type="RigidBody3D" parent="GameArea"]
gravity_scale = 0.0
freeze = true
freeze_mode = 1
[node name="GameAreaCollisionShape3D" type="CollisionShape3D" parent="GameArea/GameAreaRigidBody3D"]
transform = Transform3D(9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 12.4454)
shape = SubResource("BoxShape3D_bw288")
[node name="SoundManager" type="Node" parent="." node_paths=PackedStringArray("explosionSound", "backgroundMusic", "laserSound")]
script = ExtResource("8_4ksf0")
explosionSound = NodePath("ExplosionSound")
backgroundMusic = NodePath("BackgroundMusic")
laserSound = NodePath("LaserSound")
[node name="ExplosionSound" type="AudioStreamPlayer3D" parent="SoundManager"]
stream = ExtResource("9_2dqf6")
[node name="BackgroundMusic" type="AudioStreamPlayer" parent="SoundManager"]
stream = ExtResource("8_4ms0p")
volume_db = -20.0
autoplay = true
[node name="LaserSound" type="AudioStreamPlayer3D" parent="SoundManager"]
stream = ExtResource("11_bbedd")
[node name="GameManager" type="Node" parent="." node_paths=PackedStringArray("labelAsteroids", "labelLifes", "labelPoints", "labelLevel", "labelNextLevel", "asteroidsContainer")]
script = ExtResource("9_rsrr5") script = ExtResource("9_rsrr5")
asteroids = Array[PackedScene]([ExtResource("5_do6ba"), ExtResource("6_tqoe7"), ExtResource("7_v6ul2")]) asteroids = Array[PackedScene]([ExtResource("5_do6ba"), ExtResource("6_tqoe7"), ExtResource("7_v6ul2")])
labelAsteroids = NodePath("../Control/LabelAsteroids") labelAsteroids = NodePath("../Control/LabelAsteroids")
labelLifes = NodePath("../Control/LabelLives") labelLifes = NodePath("../Control/LabelLives")
labelPoints = NodePath("../Control/LabelPoints")
labelLevel = NodePath("../Control/LabelLevel")
labelNextLevel = NodePath("../Control/LabelNextLevel")
asteroidsContainer = NodePath("../Asteroids")
[node name="Asteroids" type="Node3D" parent="."]
[node name="Control" type="Control" parent="."] [node name="Control" type="Control" parent="."]
layout_mode = 3 layout_mode = 3
@ -59,36 +94,31 @@ text = "Asteroids: 0"
[node name="LabelLives" type="RichTextLabel" parent="Control"] [node name="LabelLives" type="RichTextLabel" parent="Control"]
layout_mode = 2 layout_mode = 2
offset_left = 20.0 offset_left = 20.0
offset_top = 47.0 offset_top = 40.0
offset_right = 260.0 offset_right = 260.0
offset_bottom = 67.0 offset_bottom = 60.0
text = "Lives: 3" text = "Lives: 3"
[node name="SoundManager" type="Node" parent="." node_paths=PackedStringArray("explosionSound", "backgroundMusic", "laserSound")] [node name="LabelPoints" type="RichTextLabel" parent="Control"]
script = ExtResource("8_4ksf0") layout_mode = 2
explosionSound = NodePath("ExplosionSound") offset_left = 20.0
backgroundMusic = NodePath("BackgroundMusic") offset_top = 60.0
laserSound = NodePath("LaserSound") offset_right = 260.0
offset_bottom = 80.0
[node name="ExplosionSound" type="AudioStreamPlayer3D" parent="SoundManager"] text = "Points: 0"
stream = ExtResource("9_2dqf6")
[node name="BackgroundMusic" type="AudioStreamPlayer" parent="SoundManager"]
stream = ExtResource("8_4ms0p")
volume_db = -20.0
autoplay = true
[node name="LaserSound" type="AudioStreamPlayer3D" parent="SoundManager"]
stream = ExtResource("11_bbedd")
[node name="GameArea" type="Node3D" parent="."]
script = ExtResource("11_p0rh7")
[node name="GameAreaRigidBody3D" type="RigidBody3D" parent="GameArea"] [node name="LabelLevel" type="RichTextLabel" parent="Control"]
gravity_scale = 0.0 layout_mode = 2
freeze = true offset_left = 20.0
freeze_mode = 1 offset_top = 80.0
offset_right = 260.0
offset_bottom = 100.0
text = "Level: 1"
[node name="GameAreaCollisionShape3D" type="CollisionShape3D" parent="GameArea/GameAreaRigidBody3D"] [node name="LabelNextLevel" type="RichTextLabel" parent="Control"]
transform = Transform3D(9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 12.4454) layout_mode = 2
shape = SubResource("BoxShape3D_bw288") offset_left = 20.0
offset_top = 100.0
offset_right = 260.0
offset_bottom = 120.0
text = "Next Level: 10"

@ -6,6 +6,7 @@ public partial class Asteroid : Node3D {
[Export] public RigidBody3D AsteroidRb; [Export] public RigidBody3D AsteroidRb;
[Export] private MeshInstance3D asteroidMesh; [Export] private MeshInstance3D asteroidMesh;
[Export] private CollisionShape3D asteroidCollisionShape; [Export] private CollisionShape3D asteroidCollisionShape;
[Export] private GpuParticlesCollisionSphere3D particleCollision;
[Export] private PackedScene explosion; [Export] private PackedScene explosion;
private float speed; private float speed;
@ -16,13 +17,13 @@ public partial class Asteroid : Node3D {
public override void _EnterTree() { public override void _EnterTree() {
Position = new((float)GD.RandRange(-3.7, 3.7), 0, -6.4f); Position = new((float)GD.RandRange(-3.7, 3.7), 0, -6.4f);
size = (float)GD.RandRange(0.25f, 0.75f); size = (float)GD.RandRange(0.5f, 1f);
Vector3 scale = new(size, size,size); Vector3 scale = new(size, size,size);
asteroidMesh.Scale = scale; asteroidMesh.Scale = scale;
AsteroidRb.Scale = scale; AsteroidRb.Scale = scale;
asteroidCollisionShape.Scale = scale; asteroidCollisionShape.Scale = scale;
speed = GD.Randf() * 5f + 1f; 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)); rotation = new((float)GD.RandRange(-rotSpeed, rotSpeed), (float)GD.RandRange(-rotSpeed, rotSpeed), (float)GD.RandRange(-rotSpeed, rotSpeed));
} }
@ -39,8 +40,8 @@ public partial class Asteroid : Node3D {
Vector3 collisionPosition = collision.GetPosition(); Vector3 collisionPosition = collision.GetPosition();
switch (parent) { switch (parent) {
case Asteroid collidedAsteroid: case Asteroid collidedAsteroid:
collidedAsteroid.Explode(collisionPosition); // collidedAsteroid.Explode(collisionPosition);
Explode(collisionPosition); // Explode(collisionPosition);
break; break;
case PlayerShip: case PlayerShip:
GameManager.Instance.Lives--; GameManager.Instance.Lives--;
@ -48,15 +49,18 @@ public partial class Asteroid : Node3D {
Explode(collisionPosition); Explode(collisionPosition);
break; break;
case GameArea: case GameArea:
GameManager.Instance.AsteroidNumber--;
Explode(Vector3.Zero); Explode(Vector3.Zero);
break; break;
case LaserBeam laserBeam:
GameManager.Instance.Points++;
laserBeam.QueueFree();
Explode(collisionPosition);
break;
default:
GD.Print($"Asteroid collided with unknown.");
break;
} }
} }
// if (asteroidRb.Position.Z >= 8f) {
// QueueFree();
// }
} }
public void Explode(Vector3 exPosition) { public void Explode(Vector3 exPosition) {

@ -2,71 +2,119 @@ using Godot;
using Godot.Collections; using Godot.Collections;
namespace Scripts; namespace Scripts;
public partial class GameManager : Node
{ public partial class GameManager : Node {
[Export] private Array<PackedScene> asteroids; [Export] private Array<PackedScene> asteroids;
[Export] private float spawnRate = 1f;
private float spawnTimer;
private float spawnTimer;
[Export] private RichTextLabel labelAsteroids;
[Export] private RichTextLabel labelAsteroids; [Export] private RichTextLabel labelLifes;
[Export] private RichTextLabel labelLifes; [Export] private RichTextLabel labelPoints;
[Export] private RichTextLabel labelLevel;
public int AsteroidNumber { [Export] private RichTextLabel labelNextLevel;
get => asteroidNumber; [Export] private Node3D asteroidsContainer;
set {
asteroidNumber = value; public int AsteroidNumber {
RefreshUi(); get => asteroidNumber;
} set {
} asteroidNumber = value;
RefreshUi();
public int Lives { }
get => lives; }
set {
lives = value; public int Lives {
if (lives <= 0) GameOver(); get => lives;
RefreshUi(); set {
} lives = value;
} if (lives <= 0) GameOver();
RefreshUi();
private const int asteroidMaxNumber = 10; }
private int lives = 3; }
private int asteroidNumber;
public int Points {
public static GameManager Instance { get; private set; } get => points;
set {
public override void _Ready() { points = value;
Instance = this; if (points >= nextLevelPoints) NextLevel();
spawnTimer = spawnRate; RefreshUi();
RefreshUi(); }
} }
public override void _Process(double delta) { public int Level {
spawnTimer -= (float)delta; get => level;
if (spawnTimer < 0) { private set {
if (AsteroidNumber < asteroidMaxNumber) SpawnNewAsteroid(); level = value;
spawnTimer = spawnRate; RefreshUi();
} }
} }
private void SpawnNewAsteroid() { private int NextLevelPoints {
GD.Print("Spawn new asteroid"); get => nextLevelPoints;
AsteroidNumber++; set {
Node asteroid = asteroids.PickRandom().Instantiate(); nextLevelPoints = value;
asteroid.Name = $"Asteroid{AsteroidNumber}"; RefreshUi();
AddChild(asteroid); }
} }
private void RefreshUi() { private int AsteroidMaxNumber {
labelLifes.Text = $"Lives: {lives}"; get => asteroidMaxNumber;
labelAsteroids.Text = $"Asteroids: {asteroidNumber}"; set {
} asteroidMaxNumber = value;
RefreshUi();
private static void GameOver() { }
GD.Print("GAME OVER!"); }
}
private int asteroidMaxNumber = 3;
public void OnGameAreaBodyExited(Node body) { private int lives = 10;
GD.Print($"{body.Name} leaved GameArea!"); private int points;
} private int nextLevelPoints = 11;
} private int level = 1;
private int asteroidNumber;
private float spawnRate = 1f;
public static GameManager Instance { get; private set; }
public override void _Ready() {
Instance = this;
spawnTimer = spawnRate;
RefreshUi();
}
public override void _Process(double delta) {
spawnTimer -= (float)delta;
if (spawnTimer < 0) {
if (AsteroidNumber < asteroidMaxNumber) SpawnNewAsteroid();
spawnTimer = spawnRate;
}
}
private void SpawnNewAsteroid() {
GD.Print("Spawn new asteroid");
AsteroidNumber++;
Node asteroid = asteroids.PickRandom().Instantiate();
asteroidsContainer.AddChild(asteroid);
asteroid.Name = $"Asteroid{AsteroidNumber}";
}
private void RefreshUi() {
labelLifes.Text = $"Lives: {lives}";
labelAsteroids.Text = $"Asteroids: {asteroidNumber} / {asteroidMaxNumber}";
labelPoints.Text = $"Points: {points}";
labelNextLevel.Text = $"Next Level at: {NextLevelPoints}";
labelLevel.Text = $"Actual Level: {Level}";
}
private static void GameOver() => GD.Print("GAME OVER!");
private void NextLevel() {
GD.Print("Next Level!");
Level++;
NextLevelPoints = Level * 11;
AsteroidMaxNumber = 3 + Level;
spawnRate = 1f - Level * 0.1f;
}
public void OnGameAreaBodyExited(Node body) => GD.Print($"{body.Name} leaved GameArea!");
}

@ -0,0 +1,10 @@
using Godot;
public partial class LaserBeam : Node3D {
[Export] private RigidBody3D rigidBody;
private float speed = 10f;
public override void _Ready() {
Vector3 movement = new(0f, 0f, -speed);
rigidBody.AddConstantForce(movement);
}
}

@ -1,4 +1,4 @@
using System; using System.Diagnostics;
using Godot; using Godot;
namespace Scripts; namespace Scripts;
@ -8,7 +8,10 @@ public partial class PlayerShip : Node3D {
[Export] private Node3D jet; [Export] private Node3D jet;
[Export] public RigidBody3D PlayerRb; [Export] public RigidBody3D PlayerRb;
[Export] private PackedScene explosion; [Export] private PackedScene explosion;
[Export] private GpuParticles3D laser; [Export] private GpuParticles3D gpulaser;
[Export] private CpuParticles3D cpulaser;
[Export] private PackedScene laser;
[Export] private Node3D shots;
public static PlayerShip Instance { get; private set;} public static PlayerShip Instance { get; private set;}
@ -34,36 +37,6 @@ public partial class PlayerShip : Node3D {
} }
public override void _Process(double delta) { public override void _Process(double delta) {
//Shooting
laser.Emitting = Input.IsActionPressed(PLAYER_FIRE);
if (Input.IsActionJustPressed(PLAYER_FIRE)) SoundManager.Instance.PlayLaserSound(PlayerRb.Position);
//
// if (!shooting) return;
// if (Math.Abs(laserTimer - laserTimerMax) < 0.1f) {
// SoundManager.Instance.PlayLaserSound(PlayerRb.Position);
// laser.Emitting = true;
// }
// else if (laserTimer < 0) {
// laser.Emitting = false;
// laserTimer = laserTimerMax;
// }
// laserTimer -= (float)delta;
}
public override void _PhysicsProcess(double delta) {
if (moveDir != Vector3.Zero) {
jet.Visible = true;
KinematicCollision3D collision = PlayerRb.MoveAndCollide(moveDir * (float)delta);
if (collision?.GetCollider() is Node3D collider) GD.Print($"{Name} collides with {collider.GetParentNode3D().Name}");
}
else {
jet.Visible = false;
}
PlayerRb.RotationDegrees = rotDir;
CheckBoundaries();
}
public override void _UnhandledInput(InputEvent @event) {
moveDir = Vector3.Zero; moveDir = Vector3.Zero;
rotDir = Vector3.Zero; rotDir = Vector3.Zero;
@ -77,6 +50,28 @@ public partial class PlayerShip : Node3D {
if (Input.IsActionPressed(PLAYER_MOVE_RIGHT)) moveDir.X += moveVelocity; if (Input.IsActionPressed(PLAYER_MOVE_RIGHT)) moveDir.X += moveVelocity;
if (Input.IsActionJustPressed(PLAYER_MOVE_RIGHT)) rotDir.Z = +rotVelocity * 2; if (Input.IsActionJustPressed(PLAYER_MOVE_RIGHT)) rotDir.Z = +rotVelocity * 2;
if (Input.IsActionJustReleased(PLAYER_MOVE_LEFT) || Input.IsActionJustReleased(PLAYER_MOVE_RIGHT)) rotDir = Vector3.Zero; if (Input.IsActionJustReleased(PLAYER_MOVE_LEFT) || Input.IsActionJustReleased(PLAYER_MOVE_RIGHT)) rotDir = Vector3.Zero;
//Fire
if (Input.IsActionJustPressed(PLAYER_FIRE)) {
if (laser.Instantiate() is Node3D shot) {
shot.Position = PlayerRb.Position + new Vector3(0f, 0f, 0.74f);
shots.AddChild(shot);
SoundManager.Instance.PlayLaserSound(PlayerRb.Position);
}
}
}
public override void _PhysicsProcess(double delta) {
if (moveDir != Vector3.Zero) {
jet.Visible = true;
KinematicCollision3D collision = PlayerRb.MoveAndCollide(moveDir * (float)delta);
if (collision?.GetCollider() is Node3D collider) GD.Print($"{Name} collides with {collider.GetParentNode3D().Name}");
}
else {
jet.Visible = false;
}
PlayerRb.RotationDegrees = rotDir;
CheckBoundaries();
} }
private void CheckBoundaries() { private void CheckBoundaries() {