Add Countdown

pull/32/head
Sascha 2024-01-26 11:24:00 +07:00
parent 6fa2fd932a
commit e456608f06
8 changed files with 156 additions and 13 deletions

@ -4,4 +4,7 @@
<EnableDynamicLoading>true</EnableDynamicLoading>
<RootNamespace>GodotspaceShooter</RootNamespace>
</PropertyGroup>
<ItemGroup>
<Folder Include="Scenes\" />
</ItemGroup>
</Project>

Binary file not shown.

After

Width:  |  Height:  |  Size: 405 B

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c5tms7y368pit"
path="res://.godot/imported/keyboard_any.png-2a9a0ec0e27526a6030a1d6924359c1a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Images/keyboard_any.png"
dest_files=["res://.godot/imported/keyboard_any.png-2a9a0ec0e27526a6030a1d6924359c1a.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

@ -0,0 +1,8 @@
[gd_resource type="LabelSettings" format=3 uid="uid://cdqcuhuk1yclm"]
[resource]
font_size = 200
outline_size = 5
outline_color = Color(1, 1, 0, 1)
shadow_size = 10
shadow_offset = Vector2(5, 5)

@ -1,4 +1,4 @@
[gd_scene load_steps=32 format=3 uid="uid://det8556rpxhbv"]
[gd_scene load_steps=34 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"]
@ -26,6 +26,8 @@
[ext_resource type="Texture2D" uid="uid://dkc2vx71bnhdh" path="res://Images/keyboard_space.png" id="24_cuten"]
[ext_resource type="Texture2D" uid="uid://dojdjls5b310j" path="res://Images/keyboard_enter.png" id="25_u4r31"]
[ext_resource type="Texture2D" uid="uid://dh4l4vkgkjxup" path="res://Images/keyboard_escape.png" id="26_oxfmw"]
[ext_resource type="LabelSettings" uid="uid://cdqcuhuk1yclm" path="res://Material/lblSettingsCountdown.tres" id="27_0p8jc"]
[ext_resource type="Texture2D" uid="uid://c5tms7y368pit" path="res://Images/keyboard_any.png" id="28_g1v6s"]
[sub_resource type="BoxShape3D" id="BoxShape3D_bw288"]
@ -153,7 +155,7 @@ asteroidsContainer = NodePath("../Asteroids")
process_mode = 3
script = ExtResource("15_uovst")
[node name="Ui" type="Node2D" parent="." node_paths=PackedStringArray("rtlAsteroids", "rtlLevel", "rtlLifes", "rtlNextLevel", "rtlPoints", "vBoxGameOver", "lblGameOver", "buttonRestart", "lblReachedPoints", "healthBar", "vBoxPause", "buttonResume", "buttonPauseRestart")]
[node name="Ui" type="Node2D" parent="." node_paths=PackedStringArray("rtlAsteroids", "rtlLevel", "rtlLifes", "rtlNextLevel", "rtlPoints", "vBoxGameOver", "lblGameOver", "buttonRestart", "lblReachedPoints", "healthBar", "vBoxPause", "buttonResume", "buttonPauseRestart", "vBoxCountdown", "lblCountdown", "textAnyKey", "lblAnyKey")]
process_mode = 3
script = ExtResource("15_xl7yx")
rtlAsteroids = NodePath("VBoxStats/rtlAsteroids")
@ -169,6 +171,10 @@ healthBar = NodePath("VBoxHealth/HealthBar")
vBoxPause = NodePath("VBoxPause")
buttonResume = NodePath("VBoxPause/ButtonResume")
buttonPauseRestart = NodePath("VBoxPause/PauseRestartButton")
vBoxCountdown = NodePath("VBoxCountdown")
lblCountdown = NodePath("VBoxCountdown/lblCountdown")
textAnyKey = NodePath("VBoxCountdown/textPressKey")
lblAnyKey = NodePath("VBoxCountdown/lblPressKey")
[node name="VBoxStats" type="VBoxContainer" parent="Ui"]
anchors_preset = 2
@ -216,6 +222,7 @@ scroll_active = false
shortcut_keys_enabled = false
[node name="VBoxGameOver" type="VBoxContainer" parent="Ui"]
visible = false
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
@ -379,3 +386,41 @@ texture = ExtResource("26_oxfmw")
[node name="lblPause" type="Label" parent="Ui/BoxHelp/VBoxHelp/HBoxPause"]
layout_mode = 2
text = "Pause"
[node name="VBoxCountdown" 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 = 330.0
offset_top = 524.0
offset_right = 496.0
offset_bottom = 892.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 4
size_flags_vertical = 4
alignment = 1
[node name="lblCountdown" type="Label" parent="Ui/VBoxCountdown"]
layout_mode = 2
size_flags_horizontal = 4
text = "3"
label_settings = ExtResource("27_0p8jc")
horizontal_alignment = 1
vertical_alignment = 1
[node name="textPressKey" type="TextureRect" parent="Ui/VBoxCountdown"]
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 4
texture = ExtResource("28_g1v6s")
stretch_mode = 2
[node name="lblPressKey" type="Label" parent="Ui/VBoxCountdown"]
layout_mode = 2
size_flags_horizontal = 4
text = "Press any key to start"
horizontal_alignment = 1
vertical_alignment = 1

@ -32,6 +32,7 @@ public partial class GameManager : Node {
private float spawnTimer;
public event EventHandler RefreshUi;
public event EventHandler NewCountdown;
public int AsteroidNumber {
get => asteroidNumber;
@ -84,7 +85,7 @@ public partial class GameManager : Node {
}
private bool gamePaused;
public bool GamePaused {
public bool GamePaused{
get => gamePaused;
set {
gamePaused = value;
@ -92,23 +93,29 @@ public partial class GameManager : Node {
RefreshUi?.Invoke(this, EventArgs.Empty);
}
}
public bool Countdown { get; set; }
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);
RefreshUi?.Invoke(this, EventArgs.Empty);
Countdown = true;
NewCountdown?.Invoke(this, EventArgs.Empty);
}
public override void _Process(double delta) {
spawnTimer -= (float)delta;
if (spawnTimer < 0) {
if (AsteroidNumber < asteroidMaxNumber) SpawnNewAsteroid();
spawnTimer = spawnRate;
if (!GamePaused && !Countdown) {
spawnTimer -= (float)delta;
if (spawnTimer < 0) {
if (AsteroidNumber < asteroidMaxNumber) SpawnNewAsteroid();
spawnTimer = spawnRate;
}
}
}

@ -1,3 +1,4 @@
using System;
using Godot;
namespace GodotspaceShooter.Scripts;
@ -13,11 +14,21 @@ public partial class InputManager : Node
private Vector3 moveDirection;
private Vector3 rotationDirection;
public event EventHandler StartCountdown;
public static InputManager Instance { get; private set; }
public override void _Ready() => Instance = this;
public override void _UnhandledInput(InputEvent @event) {
//Countdown
if (GameManager.Instance.Countdown && Input.IsAnythingPressed()) StartCountdown?.Invoke(this,EventArgs.Empty);
//Pause
if (Input.IsActionJustReleased(GAME_PAUSE)) GameManager.Instance.GamePaused = GameManager.Instance.GamePaused switch { true => false, false => true };
if (GameManager.Instance.GamePaused || GameManager.Instance.Countdown) return;
//Movement
float moveVelocity = PlayerShip.Instance.MoveVelocity;
float rotationVelocity = PlayerShip.Instance.RotationVelocity;

@ -1,4 +1,5 @@
using System;
using System.Globalization;
using Godot;
namespace GodotspaceShooter.Scripts;
@ -17,6 +18,14 @@ public partial class Ui : Node2D
[Export] private VBoxContainer vBoxPause;
[Export] private Button buttonResume;
[Export] private Button buttonPauseRestart;
[Export] private VBoxContainer vBoxCountdown;
[Export] private Label lblCountdown;
[Export] private TextureRect textAnyKey;
[Export] private Label lblAnyKey;
private const double countdownMaxTimer = 3;
private double countdownTimer = countdownMaxTimer;
private bool countdownRunning;
public static Ui Instance { get; private set; }
@ -25,19 +34,45 @@ public partial class Ui : Node2D
if (GameManager.Instance is null)
GD.PrintErr("No GameManager found!");
else {
GameManager.Instance.RefreshUi += RefreshUi;
GameManager.Instance.RefreshUi += GameManager_RefreshUi;
GameManager.Instance.NewCountdown += GameManager_NewCountdown;
InputManager.Instance.StartCountdown += InputManager_StartCountdown;
lblGameOver.Visible = GameManager.Instance.GameOver;
buttonRestart.Visible = GameManager.Instance.GameOver;
lblReachedPoints.Visible = GameManager.Instance.GameOver;
buttonRestart.Pressed += ButtonRestartOnPressed;
buttonResume.Pressed += ButtonResumeOnPressed;
buttonPauseRestart.Pressed += ButtonPauseRestartOnPressed;
RefreshUi(this, EventArgs.Empty);
GameManager_RefreshUi(this, EventArgs.Empty);
}
}
private void InputManager_StartCountdown(object sender, EventArgs e) {
lblAnyKey.Visible = false;
textAnyKey.Visible = false;
countdownRunning = true;
}
private void GameManager_NewCountdown(object sender, EventArgs e) {
lblCountdown.Text = countdownTimer.ToString(CultureInfo.InvariantCulture);
vBoxCountdown.Visible = true;
lblAnyKey.Visible = true;
textAnyKey.Visible = true;
}
public override void _Process(double delta) {
if (GameManager.Instance.Countdown && countdownRunning) {
countdownTimer -= delta;
lblCountdown.Text = Mathf.RoundToInt(countdownTimer).ToString();
if (countdownTimer <= 0) {
vBoxCountdown.Visible = false;
countdownRunning = false;
GameManager.Instance.Countdown = false;
}
}
}
private void RefreshUi(object sender, EventArgs e) {
private void GameManager_RefreshUi(object sender, EventArgs e) {
rtlLifes.Text = $"Lives: {GameManager.Instance.Lives}";
rtlAsteroids.Text = $"Asteroids: {GameManager.Instance.AsteroidNumber} / {GameManager.Instance.AsteroidMaxNumber}";
rtlPoints.Text = $"Points: {GameManager.Instance.Points}";