From 93b1bca915c5a0d36dccb1546e741d24b717e731 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Thu, 27 Nov 2025 17:36:34 +0300 Subject: [PATCH] Added game over screen --- game/entities/ships/player/player_ship.tscn | 1 + .../weapons/launcher/launcher_projectile.gd | 3 +- .../weapons/launcher/launcher_projectile.tscn | 2 +- .../weapons/tesla/tesla_projectile.tscn | 2 +- game/game.gd | 8 +++- game/game.tscn | 26 ++++++++--- game/passage.gd | 21 ++++----- game/passage.tscn | 9 +++- menu/game_over_screen.gd | 21 +++++++++ menu/game_over_screen.gd.uid | 1 + menu/game_over_screen.tscn | 44 +++++++++++++++++++ 11 files changed, 113 insertions(+), 25 deletions(-) create mode 100644 menu/game_over_screen.gd create mode 100644 menu/game_over_screen.gd.uid create mode 100644 menu/game_over_screen.tscn diff --git a/game/entities/ships/player/player_ship.tscn b/game/entities/ships/player/player_ship.tscn index a960c1f..c3f8483 100644 --- a/game/entities/ships/player/player_ship.tscn +++ b/game/entities/ships/player/player_ship.tscn @@ -21,6 +21,7 @@ texture = ExtResource("3_uf2n1") polygon = PackedVector2Array(-23, -10, -17, -14, -3, -15, 21, -13, 22, -12, 22, 12, 21, 13, -3, 15, -17, 14, -23, 10) [node name="Health" parent="." index="2"] +max_shield = 250 max_hull = 1000 [node name="HeathBar" parent="." index="3"] diff --git a/game/entities/weapons/launcher/launcher_projectile.gd b/game/entities/weapons/launcher/launcher_projectile.gd index 40b5059..266a512 100644 --- a/game/entities/weapons/launcher/launcher_projectile.gd +++ b/game/entities/weapons/launcher/launcher_projectile.gd @@ -23,6 +23,7 @@ func _ready() -> void: func _physics_process(delta: float) -> void: _apply_homing_guidance(delta) super._physics_process(delta) + _update_sprite(_velocity) func _acquire_target() -> void: @@ -40,8 +41,6 @@ func _apply_homing_guidance(delta: float) -> void: var angle_diff := wrapf(target_angle - current_angle, -PI, PI) var angle_change := clampf(angle_diff, -max_angle_change, max_angle_change) _velocity = _velocity.rotated(angle_change) - - _update_sprite(_velocity) func _update_sprite(velocity: Vector2) -> void: diff --git a/game/entities/weapons/launcher/launcher_projectile.tscn b/game/entities/weapons/launcher/launcher_projectile.tscn index 0bc561f..963c21a 100644 --- a/game/entities/weapons/launcher/launcher_projectile.tscn +++ b/game/entities/weapons/launcher/launcher_projectile.tscn @@ -77,7 +77,7 @@ turbulence_noise_speed = Vector3(0.1, 0.1, 0.1) collision_layer = 0 collision_mask = 0 script = ExtResource("2_6hdsf") -rotation_speed = 90 +rotation_speed = 5 speed = 300 [node name="GPUParticles2D" type="GPUParticles2D" parent="." index="0"] diff --git a/game/entities/weapons/tesla/tesla_projectile.tscn b/game/entities/weapons/tesla/tesla_projectile.tscn index 6320c68..415f349 100644 --- a/game/entities/weapons/tesla/tesla_projectile.tscn +++ b/game/entities/weapons/tesla/tesla_projectile.tscn @@ -11,7 +11,7 @@ [sub_resource type="Resource" id="Resource_1121u"] resource_local_to_scene = true script = ExtResource("3_l65ib") -value = 45 +value = 30 metadata/_custom_type_script = "uid://c27v705giygv4" [sub_resource type="CircleShape2D" id="CircleShape2D_l65ib"] diff --git a/game/game.gd b/game/game.gd index 3255825..0a20b84 100644 --- a/game/game.gd +++ b/game/game.gd @@ -2,10 +2,12 @@ extends Node @onready var pause_screen : Control = $PauseScreen +@onready var game_over_screen : Control = $GameOverScreen func _ready() -> void: pause_screen.hide() + game_over_screen.hide() func _input(event: InputEvent) -> void: @@ -18,6 +20,10 @@ func _on_pause_screen_continue_game() -> void: pause_screen.hide() -func _on_pause_screen_show_main_menu() -> void: +func _on_show_main_menu() -> void: get_tree().paused = false get_tree().change_scene_to_file("res://menu/title_screen.tscn") + + +func _on_passage_player_died() -> void: + game_over_screen.show() diff --git a/game/game.tscn b/game/game.tscn index b15ad51..56aa626 100644 --- a/game/game.tscn +++ b/game/game.tscn @@ -1,16 +1,32 @@ -[gd_scene load_steps=4 format=3 uid="uid://dl7m4rqyj8mck"] +[gd_scene load_steps=5 format=3 uid="uid://dl7m4rqyj8mck"] [ext_resource type="Script" uid="uid://1wfu4iuddo25" path="res://game/game.gd" id="1_l1rk1"] [ext_resource type="PackedScene" uid="uid://d34nh3lc1gpb" path="res://menu/pause_screen.tscn" id="2_h7iqs"] [ext_resource type="PackedScene" uid="uid://dgc0087kvarx6" path="res://game/passage.tscn" id="3_4fuuu"] +[ext_resource type="PackedScene" uid="uid://duxm8n62j2qt6" path="res://menu/game_over_screen.tscn" id="4_4fuuu"] [node name="Game" type="Node2D"] script = ExtResource("1_l1rk1") -[node name="PauseScreen" parent="." instance=ExtResource("2_h7iqs")] -process_mode = 2 - [node name="Passage" parent="." instance=ExtResource("3_4fuuu")] +[node name="PauseScreen" parent="." instance=ExtResource("2_h7iqs")] +process_mode = 2 +z_index = 100 + +[node name="GameOverScreen" parent="." instance=ExtResource("4_4fuuu")] +z_index = 100 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = 320.0 +offset_top = 172.0 +offset_right = 320.0 +offset_bottom = 172.0 + +[connection signal="player_died" from="Passage" to="." method="_on_passage_player_died"] [connection signal="continue_game" from="PauseScreen" to="." method="_on_pause_screen_continue_game"] -[connection signal="show_main_menu" from="PauseScreen" to="." method="_on_pause_screen_show_main_menu"] +[connection signal="show_main_menu" from="PauseScreen" to="." method="_on_show_main_menu"] +[connection signal="show_main_menu" from="GameOverScreen" to="." method="_on_show_main_menu"] diff --git a/game/passage.gd b/game/passage.gd index 06e3403..c047d8b 100644 --- a/game/passage.gd +++ b/game/passage.gd @@ -2,6 +2,9 @@ class_name Passage extends Node2D +signal player_died + + const PLAYER := preload("res://game/entities/ships/player/player_ship.tscn") @@ -9,21 +12,13 @@ const PLAYER := preload("res://game/entities/ships/player/player_ship.tscn") @onready var enemy_timer : Timer = $EnemyTimer -func _ready() -> void: - _create_player() - - -func _create_player() -> void: - var player : PlayerShip = PLAYER.instantiate() - player.position = Vector2(100, 100) - player.destroyed.connect(_create_player, CONNECT_DEFERRED) - add_child(player) - - func _on_enemy_timer_timeout() -> void: - var enemies := get_tree().get_nodes_in_group("enemies") if enemies.size() < 25: enemy_swamp_controller.create_enemy() - enemy_timer.start(randi_range(3, 9)) + enemy_timer.start(randi_range(1, 3)) + + +func _on_player_ship_destroyed() -> void: + player_died.emit() diff --git a/game/passage.tscn b/game/passage.tscn index 7c54a8c..e6e9226 100644 --- a/game/passage.tscn +++ b/game/passage.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=4 format=3 uid="uid://dgc0087kvarx6"] +[gd_scene load_steps=5 format=3 uid="uid://dgc0087kvarx6"] [ext_resource type="Script" uid="uid://c6gpm3edyr4nu" path="res://game/passage.gd" id="1_ltkyg"] [ext_resource type="PackedScene" uid="uid://cpn5x0ijgl7ei" path="res://game/controllers/enemy_swamp_controller.tscn" id="2_72vqi"] +[ext_resource type="PackedScene" uid="uid://br074cqcnul3d" path="res://game/entities/ships/player/player_ship.tscn" id="3_r3x05"] [sub_resource type="WorldBoundaryShape2D" id="WorldBoundaryShape2D_ltkyg"] @@ -34,12 +35,16 @@ rotation = -1.5707964 shape = SubResource("WorldBoundaryShape2D_ltkyg") one_way_collision = true +[node name="PlayerShip" parent="." instance=ExtResource("3_r3x05")] +position = Vector2(100, 100) + [node name="EnemySwampController" parent="." node_paths=PackedStringArray("passage") instance=ExtResource("2_72vqi")] passage = NodePath("..") [node name="EnemyTimer" type="Timer" parent="."] -wait_time = 10.0 +wait_time = 3.0 one_shot = true autostart = true +[connection signal="destroyed" from="PlayerShip" to="." method="_on_player_ship_destroyed"] [connection signal="timeout" from="EnemyTimer" to="." method="_on_enemy_timer_timeout"] diff --git a/menu/game_over_screen.gd b/menu/game_over_screen.gd new file mode 100644 index 0000000..76ff42d --- /dev/null +++ b/menu/game_over_screen.gd @@ -0,0 +1,21 @@ +extends Control + + +signal show_main_menu + + +@onready var main_menu_button : Button = $%MainMenuButton +@onready var button_focus_timer : Timer = $ButtonFocusTimer + + +func _on_timer_timeout() -> void: + main_menu_button.grab_focus() + + +func _on_main_menu_button_pressed() -> void: + show_main_menu.emit() + + +func _on_visibility_changed() -> void: + if visible and button_focus_timer: + button_focus_timer.start() diff --git a/menu/game_over_screen.gd.uid b/menu/game_over_screen.gd.uid new file mode 100644 index 0000000..8828727 --- /dev/null +++ b/menu/game_over_screen.gd.uid @@ -0,0 +1 @@ +uid://bkj8s7588e1ho diff --git a/menu/game_over_screen.tscn b/menu/game_over_screen.tscn new file mode 100644 index 0000000..89fd0d0 --- /dev/null +++ b/menu/game_over_screen.tscn @@ -0,0 +1,44 @@ +[gd_scene load_steps=3 format=3 uid="uid://duxm8n62j2qt6"] + +[ext_resource type="Script" uid="uid://bkj8s7588e1ho" path="res://menu/game_over_screen.gd" id="1_rkkr6"] +[ext_resource type="Theme" uid="uid://dtnd3tqllufey" path="res://images/menu_button.tres" id="2_uh3ar"] + +[node name="GameOverScreen" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_rkkr6") + +[node name="CenterContainer" type="CenterContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="CenterContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="CenterContainer/VBoxContainer"] +layout_mode = 2 +text = "Game Over" +horizontal_alignment = 1 + +[node name="MainMenuButton" type="Button" parent="CenterContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +mouse_filter = 2 +theme = ExtResource("2_uh3ar") +text = "Main Menu" + +[node name="ButtonFocusTimer" type="Timer" parent="."] +wait_time = 3.0 +one_shot = true + +[connection signal="visibility_changed" from="." to="." method="_on_visibility_changed"] +[connection signal="pressed" from="CenterContainer/VBoxContainer/MainMenuButton" to="." method="_on_main_menu_button_pressed"] +[connection signal="timeout" from="ButtonFocusTimer" to="." method="_on_timer_timeout"]