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>
<TargetFramework>net6.0</TargetFramework>
<EnableDynamicLoading>true</EnableDynamicLoading>

@ -20,3 +20,7 @@ scale_max = 0.02
scale_curve = SubResource("CurveTexture_s7b1r")
turbulence_noise_strength = 0.5
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")
turbulence_noise_strength = 0.5
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"]
[ext_resource type="Material" uid="uid://jsqnryvk0qes" path="res://Material/LaserBeamProcess.tres" id="1_6pmub"]
[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"]
[ext_resource type="Script" path="res://Scripts/LaserBeam.cs" id="1_52i1t"]
[node name="LaserBeam" type="Node3D"]
[sub_resource type="SphereShape3D" id="SphereShape3D_n8opw"]
radius = 0.05
[node name="GPUParticles3D" type="GPUParticles3D" parent="."]
emitting = false
amount = 1
trail_enabled = true
process_material = ExtResource("1_6pmub")
draw_passes = 2
draw_pass_1 = ExtResource("2_tfobi")
draw_pass_2 = ExtResource("3_ntth3")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_wdq46"]
emission_enabled = true
emission = Color(1, 1, 0, 1)
emission_energy_multiplier = 10.0
[node name="LaserBeam" type="Node3D" node_paths=PackedStringArray("rigidBody")]
script = ExtResource("1_52i1t")
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)
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")
asteroids = Array[PackedScene]([ExtResource("5_do6ba"), ExtResource("6_tqoe7"), ExtResource("7_v6ul2")])
labelAsteroids = NodePath("../Control/LabelAsteroids")
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="."]
layout_mode = 3
@ -59,36 +94,31 @@ text = "Asteroids: 0"
[node name="LabelLives" type="RichTextLabel" parent="Control"]
layout_mode = 2
offset_left = 20.0
offset_top = 47.0
offset_top = 40.0
offset_right = 260.0
offset_bottom = 67.0
offset_bottom = 60.0
text = "Lives: 3"
[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="GameArea" type="Node3D" parent="."]
script = ExtResource("11_p0rh7")
[node name="LabelPoints" type="RichTextLabel" parent="Control"]
layout_mode = 2
offset_left = 20.0
offset_top = 60.0
offset_right = 260.0
offset_bottom = 80.0
text = "Points: 0"
[node name="GameAreaRigidBody3D" type="RigidBody3D" parent="GameArea"]
gravity_scale = 0.0
freeze = true
freeze_mode = 1
[node name="LabelLevel" type="RichTextLabel" parent="Control"]
layout_mode = 2
offset_left = 20.0
offset_top = 80.0
offset_right = 260.0
offset_bottom = 100.0
text = "Level: 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="LabelNextLevel" type="RichTextLabel" parent="Control"]
layout_mode = 2
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] private MeshInstance3D asteroidMesh;
[Export] private CollisionShape3D asteroidCollisionShape;
[Export] private GpuParticlesCollisionSphere3D particleCollision;
[Export] private PackedScene explosion;
private float speed;
@ -16,13 +17,13 @@ public partial class Asteroid : Node3D {
public override void _EnterTree() {
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);
asteroidMesh.Scale = scale;
AsteroidRb.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));
}
@ -39,8 +40,8 @@ public partial class Asteroid : Node3D {
Vector3 collisionPosition = collision.GetPosition();
switch (parent) {
case Asteroid collidedAsteroid:
collidedAsteroid.Explode(collisionPosition);
Explode(collisionPosition);
// collidedAsteroid.Explode(collisionPosition);
// Explode(collisionPosition);
break;
case PlayerShip:
GameManager.Instance.Lives--;
@ -48,15 +49,18 @@ public partial class Asteroid : Node3D {
Explode(collisionPosition);
break;
case GameArea:
GameManager.Instance.AsteroidNumber--;
Explode(Vector3.Zero);
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) {

@ -2,71 +2,119 @@ using Godot;
using Godot.Collections;
namespace Scripts;
public partial class GameManager : Node
{
[Export] private Array<PackedScene> asteroids;
[Export] private float spawnRate = 1f;
private float spawnTimer;
[Export] private RichTextLabel labelAsteroids;
[Export] private RichTextLabel labelLifes;
public int AsteroidNumber {
get => asteroidNumber;
set {
asteroidNumber = value;
RefreshUi();
}
}
public int Lives {
get => lives;
set {
lives = value;
if (lives <= 0) GameOver();
RefreshUi();
}
}
private const int asteroidMaxNumber = 10;
private int lives = 3;
private int asteroidNumber;
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();
asteroid.Name = $"Asteroid{AsteroidNumber}";
AddChild(asteroid);
}
private void RefreshUi() {
labelLifes.Text = $"Lives: {lives}";
labelAsteroids.Text = $"Asteroids: {asteroidNumber}";
}
private static void GameOver() {
GD.Print("GAME OVER!");
}
public void OnGameAreaBodyExited(Node body) {
GD.Print($"{body.Name} leaved GameArea!");
}
}
public partial class GameManager : Node {
[Export] private Array<PackedScene> asteroids;
private float spawnTimer;
[Export] private RichTextLabel labelAsteroids;
[Export] private RichTextLabel labelLifes;
[Export] private RichTextLabel labelPoints;
[Export] private RichTextLabel labelLevel;
[Export] private RichTextLabel labelNextLevel;
[Export] private Node3D asteroidsContainer;
public int AsteroidNumber {
get => asteroidNumber;
set {
asteroidNumber = value;
RefreshUi();
}
}
public int Lives {
get => lives;
set {
lives = value;
if (lives <= 0) GameOver();
RefreshUi();
}
}
public int Points {
get => points;
set {
points = value;
if (points >= nextLevelPoints) NextLevel();
RefreshUi();
}
}
public int Level {
get => level;
private set {
level = value;
RefreshUi();
}
}
private int NextLevelPoints {
get => nextLevelPoints;
set {
nextLevelPoints = value;
RefreshUi();
}
}
private int AsteroidMaxNumber {
get => asteroidMaxNumber;
set {
asteroidMaxNumber = value;
RefreshUi();
}
}
private int asteroidMaxNumber = 3;
private int lives = 10;
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;
namespace Scripts;
@ -8,7 +8,10 @@ public partial class PlayerShip : Node3D {
[Export] private Node3D jet;
[Export] public RigidBody3D PlayerRb;
[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;}
@ -34,36 +37,6 @@ public partial class PlayerShip : Node3D {
}
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;
rotDir = Vector3.Zero;
@ -77,6 +50,28 @@ public partial class PlayerShip : Node3D {
if (Input.IsActionPressed(PLAYER_MOVE_RIGHT)) moveDir.X += moveVelocity;
if (Input.IsActionJustPressed(PLAYER_MOVE_RIGHT)) rotDir.Z = +rotVelocity * 2;
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() {