refactoring GameManager and Ui

pull/32/head
Sascha 2023-10-31 16:31:27 +07:00
parent bb6b758857
commit 56f1a2f763
6 changed files with 161 additions and 160 deletions

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

@ -11,17 +11,14 @@
[sub_resource type="SphereShape3D" id="SphereShape3D_330dr"]
radius = 0.9
[node name="PlayerShip" type="Node3D" node_paths=PackedStringArray("cpulaser", "gpulaser", "jet", "PlayerRb", "shots", "healthBar")]
[node name="PlayerShip" type="Node3D" node_paths=PackedStringArray("jet", "PlayerRb", "shots")]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74227e-08, 0, -1, 0, 0, 0)
script = ExtResource("1_cpbf1")
cpulaser = NodePath("")
explosion = ExtResource("2_13dyf")
gpulaser = NodePath("")
jet = NodePath("RigidBody3D/Jet")
laser = ExtResource("9_kbdnc")
PlayerRb = NodePath("RigidBody3D")
shots = NodePath("Shots")
healthBar = NodePath("ProgressBar")
[node name="RigidBody3D" type="RigidBody3D" parent="."]
mass = 100.0
@ -54,23 +51,3 @@ texture = ExtResource("4_87x8f")
current = true
[node name="Shots" type="Node3D" parent="."]
[node name="ProgressBar" type="ProgressBar" parent="."]
anchors_preset = 7
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
offset_left = -238.0
offset_top = -1241.0
offset_right = 251.0
offset_bottom = -1214.0
grow_horizontal = 2
grow_vertical = 0
size_flags_horizontal = 4
size_flags_vertical = 8
max_value = 10.0
step = 1.0
value = 7.0
rounded = true
show_percentage = false

@ -1,4 +1,4 @@
[gd_scene load_steps=19 format=3 uid="uid://det8556rpxhbv"]
[gd_scene load_steps=20 format=3 uid="uid://det8556rpxhbv"]
[ext_resource type="PackedScene" uid="uid://tlr55u0gn20l" path="res://Packed-Scenes/PlayerShip.tscn" id="1_njb5h"]
[ext_resource type="Texture2D" uid="uid://cg6n1hh3lj7rn" path="res://Textures/tile_nebula_green_dff.png" id="2_43vix"]
@ -15,6 +15,7 @@
[ext_resource type="AudioStream" uid="uid://dlml6o3xscxqf" path="res://Sounds/weapon_player.wav" id="11_bbedd"]
[ext_resource type="Script" path="res://Scripts/GameArea.cs" id="11_p0rh7"]
[ext_resource type="Texture2D" uid="uid://b8gy1u2i0jkyd" path="res://Images/restart.svg" id="15_nxptg"]
[ext_resource type="Script" path="res://Scripts/Ui.cs" id="15_xl7yx"]
[sub_resource type="BoxShape3D" id="BoxShape3D_bw288"]
@ -46,6 +47,8 @@ region_enabled = true
region_rect = Rect2(0, 0, 810, 1380)
script = ExtResource("3_imgbw")
[node name="Asteroids" type="Node3D" parent="."]
[node name="GameArea" type="Node3D" parent="."]
script = ExtResource("11_p0rh7")
@ -103,118 +106,121 @@ stream = ExtResource("9_rtdps")
[node name="LaserSound" type="AudioStreamPlayer3D" parent="SoundManager"]
stream = ExtResource("11_bbedd")
[node name="GameManager" type="Node" parent="." node_paths=PackedStringArray("asteroidsContainer", "labelAsteroids", "labelLevel", "labelLifes", "labelNextLevel", "labelPoints", "labelDebug", "labelGameOver", "restartButton", "reachedPointsLabel")]
script = ExtResource("9_rsrr5")
debug = false
asteroids = Array[PackedScene]([ExtResource("5_do6ba"), ExtResource("6_tqoe7"), ExtResource("7_v6ul2")])
asteroidsContainer = NodePath("../Asteroids")
labelAsteroids = NodePath("../Control/LabelAsteroids")
labelLevel = NodePath("../Control/LabelLevel")
labelLifes = NodePath("../Control/LabelLives")
labelNextLevel = NodePath("../Control/LabelNextLevel")
labelPoints = NodePath("../Control/LabelPoints")
labelDebug = NodePath("../Control/LabelDebug")
labelGameOver = NodePath("../Control/LabelGameOver")
restartButton = NodePath("../Control/RestartButton")
reachedPointsLabel = NodePath("../Control/ReachedPointsLabel")
[node name="Asteroids" type="Node3D" parent="."]
[node name="Control" type="Control" parent="."]
layout_mode = 3
anchors_preset = 0
offset_right = 40.0
offset_bottom = 40.0
[node name="LabelAsteroids" type="RichTextLabel" parent="Control"]
[node name="Ui" type="Node2D" parent="." node_paths=PackedStringArray("labelAsteroids", "labelLevel", "labelLifes", "labelNextLevel", "labelPoints", "labelGameOver", "restartButton", "reachedPointsLabel", "healthBar")]
script = ExtResource("15_xl7yx")
labelAsteroids = NodePath("VBoxLabels/LabelAsteroids")
labelLevel = NodePath("VBoxLabels/LabelLevel")
labelLifes = NodePath("VBoxLabels/LabelLives")
labelNextLevel = NodePath("VBoxLabels/LabelNextLevel")
labelPoints = NodePath("VBoxLabels/LabelPoints")
labelGameOver = NodePath("VBoxGameOver/LabelGameOver")
restartButton = NodePath("VBoxGameOver/RestartButton")
reachedPointsLabel = NodePath("VBoxGameOver/ReachedPointsLabel")
healthBar = NodePath("VBoxHealth/HealthBar")
[node name="VBoxLabels" type="VBoxContainer" parent="Ui"]
anchors_preset = 2
anchor_top = 1.0
anchor_bottom = 1.0
offset_top = 1138.0
offset_right = 152.0
offset_bottom = 1278.0
grow_vertical = 0
[node name="LabelAsteroids" type="RichTextLabel" parent="Ui/VBoxLabels"]
layout_mode = 2
offset_left = 20.0
offset_top = 20.0
offset_right = 260.0
offset_bottom = 40.0
size_flags_vertical = 3
text = "Asteroids: 0"
scroll_active = false
shortcut_keys_enabled = false
[node name="LabelLives" type="RichTextLabel" parent="Control"]
[node name="LabelLevel" type="RichTextLabel" parent="Ui/VBoxLabels"]
layout_mode = 2
offset_left = 20.0
offset_top = 40.0
offset_right = 260.0
offset_bottom = 60.0
text = "Lives: 3"
size_flags_vertical = 3
text = "Level: 1"
scroll_active = false
shortcut_keys_enabled = false
[node name="LabelPoints" type="RichTextLabel" parent="Control"]
[node name="LabelLives" type="RichTextLabel" parent="Ui/VBoxLabels"]
layout_mode = 2
offset_left = 20.0
offset_top = 60.0
offset_right = 260.0
offset_bottom = 80.0
text = "Points: 0"
size_flags_vertical = 3
text = "Lives: 3"
scroll_active = false
shortcut_keys_enabled = false
[node name="LabelLevel" type="RichTextLabel" parent="Control"]
[node name="LabelNextLevel" type="RichTextLabel" parent="Ui/VBoxLabels"]
layout_mode = 2
offset_left = 20.0
offset_top = 80.0
offset_right = 260.0
offset_bottom = 100.0
text = "Level: 1"
size_flags_vertical = 3
text = "Next Level: 10"
scroll_active = false
shortcut_keys_enabled = false
[node name="LabelNextLevel" type="RichTextLabel" parent="Control"]
[node name="LabelPoints" type="RichTextLabel" parent="Ui/VBoxLabels"]
layout_mode = 2
offset_left = 20.0
offset_top = 100.0
offset_right = 260.0
offset_bottom = 120.0
text = "Next Level: 10"
size_flags_vertical = 3
text = "Points: 0"
scroll_active = false
shortcut_keys_enabled = false
[node name="LabelDebug" type="RichTextLabel" parent="Control"]
[node name="VBoxGameOver" type="VBoxContainer" parent="Ui"]
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = 195.5
offset_top = 490.0
offset_right = 603.5
offset_bottom = 788.0
grow_horizontal = 2
grow_vertical = 2
[node name="LabelGameOver" type="RichTextLabel" parent="Ui/VBoxGameOver"]
layout_mode = 2
offset_left = 543.0
offset_top = 1225.0
offset_right = 783.0
offset_bottom = 1245.0
scale = Vector2(1, 1.88)
bbcode_enabled = true
text = "[right][color=red]Debug[/color][/right]"
size_flags_vertical = 3
theme_override_colors/default_color = Color(1, 0, 0, 1)
theme_override_colors/font_shadow_color = Color(0, 0, 0, 1)
theme_override_colors/font_outline_color = Color(1, 1, 1, 1)
theme_override_constants/shadow_offset_x = 1
theme_override_constants/shadow_offset_y = -1
theme_override_constants/shadow_outline_size = 0
theme_override_font_sizes/normal_font_size = 20
text = "Game Over"
scroll_active = false
shortcut_keys_enabled = false
[node name="LabelGameOver" type="RichTextLabel" parent="Control"]
[node name="ReachedPointsLabel" type="RichTextLabel" parent="Ui/VBoxGameOver"]
layout_mode = 2
offset_left = 12.0
offset_top = 437.0
offset_right = 230.0
offset_bottom = 460.0
scale = Vector2(3.6, 7.48)
size_flags_vertical = 3
bbcode_enabled = true
text = "[center][shake rate=30 level=10 connected=1][rainbow freq=1.0 sat=0.8 val=0.8]Game Over[/rainbow][/shake][/center]"
scroll_active = false
shortcut_keys_enabled = false
text = "[center]You have reached level 1 and 0 points![/center]"
[node name="RestartButton" type="Button" parent="Control"]
layout_mode = 0
offset_left = 354.0
offset_top = 644.0
offset_right = 462.0
offset_bottom = 777.0
[node name="RestartButton" type="Button" parent="Ui/VBoxGameOver"]
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 6
shortcut = SubResource("Shortcut_soxs4")
icon = ExtResource("15_nxptg")
icon_alignment = 1
[node name="ReachedPointsLabel" type="RichTextLabel" parent="Control"]
layout_mode = 0
offset_left = 173.0
offset_top = 600.0
offset_right = 652.0
offset_bottom = 626.0
bbcode_enabled = true
text = "[center]You have reached level 1 and 0 points![/center]"
[node name="VBoxHealth" type="VBoxContainer" parent="Ui"]
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = 45.0
offset_right = 754.0
offset_bottom = 22.0
grow_horizontal = 2
[node name="HealthBar" type="ProgressBar" parent="Ui/VBoxHealth"]
layout_mode = 2
size_flags_vertical = 3
max_value = 10.0
value = 7.0
rounded = true
show_percentage = false
[node name="GameManager" type="Node" parent="." node_paths=PackedStringArray("asteroidsContainer")]
script = ExtResource("9_rsrr5")
asteroids = Array[PackedScene]([ExtResource("5_do6ba"), ExtResource("6_tqoe7"), ExtResource("7_v6ul2")])
asteroidsContainer = NodePath("../Asteroids")

@ -1,3 +1,4 @@
using System;
using Godot;
using Godot.Collections;
@ -7,45 +8,36 @@ public partial class GameManager : Node {
private int asteroidMaxNumber = 3;
private int asteroidNumber;
public bool GameOver { get; private set; }
[Export] private bool debug = true;
[Export] private Array<PackedScene> asteroids;
[Export] private Node3D asteroidsContainer;
[Export] private RichTextLabel labelAsteroids;
[Export] private RichTextLabel labelLevel;
[Export] private RichTextLabel labelLifes;
[Export] private RichTextLabel labelNextLevel;
[Export] private RichTextLabel labelPoints;
[Export] private RichTextLabel labelDebug;
[Export] private RichTextLabel labelGameOver;
[Export] private Button restartButton;
[Export] private RichTextLabel reachedPointsLabel;
private int level = 1;
public int MaxLives { get; private set; } = 10;
private int lives = 10;
private int nextLevelPoints = 11;
private int points;
private float spawnRate = 1f;
private float spawnTimer;
public event EventHandler RefreshUi;
public int AsteroidNumber {
get => asteroidNumber;
set {
asteroidNumber = value;
RefreshUi();
RefreshUi?.Invoke(this, EventArgs.Empty);
}
}
public bool GamePaused { get; private set; } = true;
public int Lives {
get => lives;
set {
lives = value;
if (lives <= 0) SetGameOver();
RefreshUi();
PlayerShip.Instance.RefreshUi();
RefreshUi?.Invoke(this, EventArgs.Empty);
}
}
@ -54,7 +46,7 @@ public partial class GameManager : Node {
set {
points = value;
if (points >= nextLevelPoints) NextLevel();
RefreshUi();
RefreshUi?.Invoke(this, EventArgs.Empty);
}
}
@ -62,40 +54,39 @@ public partial class GameManager : Node {
get => level;
private set {
level = value;
RefreshUi();
RefreshUi?.Invoke(this, EventArgs.Empty);
}
}
private int NextLevelPoints {
public int NextLevelPoints {
get => nextLevelPoints;
set {
nextLevelPoints = value;
RefreshUi();
RefreshUi?.Invoke(this, EventArgs.Empty);
}
}
private int AsteroidMaxNumber {
public int AsteroidMaxNumber {
get => asteroidMaxNumber;
set {
asteroidMaxNumber = value;
RefreshUi();
RefreshUi?.Invoke(this, EventArgs.Empty);
}
}
public static GameManager Instance { get; private set; }
[Export] public bool Debug { get; private set; } = true;
public override void _Ready() {
Instance = this;
Lives = MaxLives;
spawnTimer = spawnRate;
SoundManager.Instance.Play(SoundManager.Sound.BackgroundMusic);
restartButton.Pressed += RestartButtonOnPressed;
RefreshUi();
PlayerShip.Instance.RefreshUi();
SoundManager.Instance.Ready += SoundManagerReady;
RefreshUi?.Invoke(this, EventArgs.Empty);
}
private void RestartButtonOnPressed() => GetTree().ReloadCurrentScene();
private void SoundManagerReady() => SoundManager.Instance.Play(SoundManager.Sound.BackgroundMusic);
public override void _Process(double delta) {
spawnTimer -= (float)delta;
@ -113,34 +104,17 @@ public partial class GameManager : Node {
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}";
labelDebug.Visible = debug;
labelGameOver.Visible = GameOver;
restartButton.Visible = GameOver;
reachedPointsLabel.Visible = GameOver;
}
private void NextLevel() {
GD.Print("Next Level!");
Ui.Instance.ShowMessage("Next Level!");
Level++;
NextLevelPoints = Level * 33;
AsteroidMaxNumber = 3 + Level;
spawnRate = 1f - Level * 0.1f;
}
public void OnGameAreaBodyExited(Node body) {
GD.Print($"{body.Name} leaved GameArea!");
}
private void SetGameOver() {
GameOver = true;
reachedPointsLabel.Text = $"[center]You have reached level {Level} and {Points} points![/center]";
SoundManager.Instance.Stop(SoundManager.Sound.BackgroundMusic);
SoundManager.Instance.Play(SoundManager.Sound.GameOver);
}
}
}

@ -28,7 +28,6 @@ public partial class PlayerShip : Node3D {
private bool shooting;
[Export] private Node3D shots;
[Export] private ProgressBar healthBar;
public static PlayerShip Instance { get; private set; }
@ -37,11 +36,6 @@ public partial class PlayerShip : Node3D {
Instance = this;
}
public void RefreshUi() {
healthBar.MaxValue = GameManager.Instance.MaxLives;
healthBar.Value = GameManager.Instance.Lives;
}
public override void _Process(double delta) {
if (GameManager.Instance.GameOver) return;

@ -0,0 +1,50 @@
using System;
using Godot;
namespace Scripts;
public partial class Ui : Node2D
{
[Export] private RichTextLabel labelAsteroids;
[Export] private RichTextLabel labelLevel;
[Export] private RichTextLabel labelLifes;
[Export] private RichTextLabel labelNextLevel;
[Export] private RichTextLabel labelPoints;
[Export] private RichTextLabel labelGameOver;
[Export] private Button restartButton;
[Export] private RichTextLabel reachedPointsLabel;
[Export] private ProgressBar healthBar;
public static Ui Instance { get; private set; }
public override void _Ready() {
Instance = this;
GameManager.Instance.RefreshUi += RefreshUi;
restartButton.Pressed += RestartButtonOnPressed;
labelGameOver.Visible = GameManager.Instance.GameOver;
restartButton.Visible = GameManager.Instance.GameOver;
reachedPointsLabel.Visible = GameManager.Instance.GameOver;
RefreshUi(this, EventArgs.Empty);
}
private void RefreshUi(object sender, EventArgs e) {
labelLifes.Text = $"Lives: {GameManager.Instance.Lives}";
labelAsteroids.Text = $"Asteroids: {GameManager.Instance.AsteroidNumber} / {GameManager.Instance.AsteroidMaxNumber}";
labelPoints.Text = $"Points: {GameManager.Instance.Points}";
labelNextLevel.Text = $"Next Level at: {GameManager.Instance.NextLevelPoints}";
labelLevel.Text = $"Actual Level: {GameManager.Instance.Level}";
healthBar.MaxValue = GameManager.Instance.MaxLives;
healthBar.Value = GameManager.Instance.Lives;
if (GameManager.Instance.GameOver) {
reachedPointsLabel.Text = $"[center]You have reached level {GameManager.Instance.Level} and {GameManager.Instance.Points} points![/center]";
labelGameOver.Visible = GameManager.Instance.GameOver;
restartButton.Visible = GameManager.Instance.GameOver;
reachedPointsLabel.Visible = GameManager.Instance.GameOver;
}
}
private void RestartButtonOnPressed() => GetTree().ReloadCurrentScene();
public void ShowMessage(string message) {
GD.Print(message);
}
}