From 371ded7d06c683fa284e6f160f9ca5fa32e20590 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Sat, 29 Nov 2025 00:47:05 +0300 Subject: [PATCH] Added blinks --- game/controllers/player_controller.gd | 13 +++++++- game/entities/ships/player/player_ship.gd | 24 +++++++++++++++ game/entities/ships/player/player_ship.tscn | 34 +++++++++++++++++++-- images/ships/player.png | 4 +-- menu/credits.tscn | 3 ++ menu/game_over_screen.tscn | 4 ++- menu/options.tscn | 6 ++++ menu/pause_menu.tscn | 3 ++ 8 files changed, 85 insertions(+), 6 deletions(-) diff --git a/game/controllers/player_controller.gd b/game/controllers/player_controller.gd index 8ccb127..a6a07d4 100644 --- a/game/controllers/player_controller.gd +++ b/game/controllers/player_controller.gd @@ -6,6 +6,8 @@ signal accelerate(direction: Vector2, delta: float) signal shoot(weapon_index: int) +signal blink(direction: Vector2) + const WEAPON_ACTIONS := { 0: "shoot_weapon_1", @@ -14,9 +16,18 @@ const WEAPON_ACTIONS := { func _physics_process(delta: float) -> void: - var input_direction := Input.get_vector("move_left", "move_right", "move_up", "move_down") + var input_direction := _get_input_direction() accelerate.emit(input_direction, delta) for index : int in WEAPON_ACTIONS: if Input.is_action_pressed(WEAPON_ACTIONS[index]): shoot.emit(index) + + +func _input(event: InputEvent) -> void: + if event.is_action_pressed("blink"): + var input_direction := _get_input_direction() + blink.emit(input_direction) + +func _get_input_direction() -> Vector2: + return Input.get_vector("move_left", "move_right", "move_up", "move_down") diff --git a/game/entities/ships/player/player_ship.gd b/game/entities/ships/player/player_ship.gd index d199882..5d86c67 100644 --- a/game/entities/ships/player/player_ship.gd +++ b/game/entities/ships/player/player_ship.gd @@ -2,6 +2,13 @@ class_name PlayerShip extends AbstractShip +@export_range(0, 200) var blink_range := 0 + + +@onready var blink_timer : Timer = $BlinkTimer +@onready var blink_shadow : GPUParticles2D = $BlinkShadow + + func _ready() -> void: super._ready() for weapon in _weapons: @@ -12,3 +19,20 @@ func _on_player_controller_shoot(weapon_index: int) -> void: if weapon_index >= _weapons.size(): return _weapons[weapon_index].shoot(velocity) + + +func _blink(direction: Vector2) -> void: + if not blink_timer.is_stopped(): return + + blink_timer.start() + + var shadow : GPUParticles2D = blink_shadow.duplicate() + var process_material : ParticleProcessMaterial = shadow.process_material + process_material.direction = Vector3(direction.x, direction.y, 0) + + shadow.emitting = true + shadow.global_position = global_position + get_tree().current_scene.add_child(shadow) + shadow.finished.connect(shadow.queue_free) + + move_and_collide(direction * blink_range) diff --git a/game/entities/ships/player/player_ship.tscn b/game/entities/ships/player/player_ship.tscn index c3f8483..1808c07 100644 --- a/game/entities/ships/player/player_ship.tscn +++ b/game/entities/ships/player/player_ship.tscn @@ -1,21 +1,37 @@ -[gd_scene load_steps=5 format=3 uid="uid://br074cqcnul3d"] +[gd_scene load_steps=8 format=3 uid="uid://br074cqcnul3d"] [ext_resource type="PackedScene" uid="uid://jvyagshykmgb" path="res://game/entities/ships/abstract_ship.tscn" id="1_6otxb"] [ext_resource type="Script" uid="uid://ruxw1n03iq4i" path="res://game/entities/ships/player/player_ship.gd" id="2_625ti"] [ext_resource type="PackedScene" uid="uid://dh1oj1w5wx4je" path="res://game/controllers/player_controller.tscn" id="3_4mjo1"] [ext_resource type="Texture2D" uid="uid://y2yfli24n51v" path="res://images/ships/player.png" id="3_uf2n1"] +[sub_resource type="AtlasTexture" id="AtlasTexture_4mjo1"] +atlas = ExtResource("3_uf2n1") +region = Rect2(0, 0, 48, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_34rhw"] +atlas = ExtResource("3_uf2n1") +region = Rect2(0, 32, 48, 32) + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_pjmi2"] +particle_flag_disable_z = true +spread = 0.0 +initial_velocity_min = 500.0 +initial_velocity_max = 500.0 +gravity = Vector3(0, 0, 0) + [node name="PlayerShip" groups=["players"] instance=ExtResource("1_6otxb")] collision_layer = 3 collision_mask = 5 script = ExtResource("2_625ti") +blink_range = 75 acceleration = 92 deceleration = 46 max_speed = 92 mass = 250 [node name="Sprite2D" parent="." index="0"] -texture = ExtResource("3_uf2n1") +texture = SubResource("AtlasTexture_4mjo1") [node name="CollisionPolygon2D" parent="." index="1"] polygon = PackedVector2Array(-23, -10, -17, -14, -3, -15, 21, -13, 22, -12, 22, 12, 21, 13, -3, 15, -17, 14, -23, 10) @@ -36,5 +52,19 @@ position = Vector2(-2, 8) [node name="Second" type="Node2D" parent="WeaponSlots" index="1"] position = Vector2(-2, -8) +[node name="BlinkTimer" type="Timer" parent="." index="6"] +process_callback = 0 +wait_time = 3.0 +one_shot = true + +[node name="BlinkShadow" type="GPUParticles2D" parent="." index="7"] +emitting = false +amount = 2 +texture = SubResource("AtlasTexture_34rhw") +lifetime = 0.09999999999999999 +one_shot = true +process_material = SubResource("ParticleProcessMaterial_pjmi2") + [connection signal="accelerate" from="PlayerController" to="." method="accelerate"] +[connection signal="blink" from="PlayerController" to="." method="_blink"] [connection signal="shoot" from="PlayerController" to="." method="_on_player_controller_shoot"] diff --git a/images/ships/player.png b/images/ships/player.png index c4b5b8e..21d0434 100644 --- a/images/ships/player.png +++ b/images/ships/player.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d60419f26223e8cd09b75c4be15ee64553cb38cec53cf429f2cfccd1f8ded5d2 -size 516 +oid sha256:ed7172e04ab9a6e72de2cef0cb84617aa7561eb92ca6393d97b2ef4fe1fdd96c +size 765 diff --git a/menu/credits.tscn b/menu/credits.tscn index 8bb6e3f..658642c 100644 --- a/menu/credits.tscn +++ b/menu/credits.tscn @@ -27,11 +27,13 @@ layout_mode = 2 columns = 2 [node name="ProgrammingLabel" type="Label" parent="VBoxContainer/GridContainer"] +z_index = 100 layout_mode = 2 text = "Programming:" horizontal_alignment = 2 [node name="ProgrammersLabel" type="Label" parent="VBoxContainer/GridContainer"] +z_index = 100 layout_mode = 2 text = "Ruslan Ignatov" @@ -41,6 +43,7 @@ alignment = 2 [node name="BackButton" type="Button" parent="VBoxContainer/HBoxContainer"] unique_name_in_owner = true +z_index = 100 layout_mode = 2 mouse_filter = 2 theme = ExtResource("2_nidem") diff --git a/menu/game_over_screen.tscn b/menu/game_over_screen.tscn index 89fd0d0..12a4216 100644 --- a/menu/game_over_screen.tscn +++ b/menu/game_over_screen.tscn @@ -24,19 +24,21 @@ grow_vertical = 2 layout_mode = 2 [node name="Label" type="Label" parent="CenterContainer/VBoxContainer"] +z_index = 100 layout_mode = 2 text = "Game Over" horizontal_alignment = 1 [node name="MainMenuButton" type="Button" parent="CenterContainer/VBoxContainer"] unique_name_in_owner = true +z_index = 100 layout_mode = 2 mouse_filter = 2 theme = ExtResource("2_uh3ar") text = "Main Menu" [node name="ButtonFocusTimer" type="Timer" parent="."] -wait_time = 3.0 +wait_time = 1.5 one_shot = true [connection signal="visibility_changed" from="." to="." method="_on_visibility_changed"] diff --git a/menu/options.tscn b/menu/options.tscn index 7b3005d..6c45924 100644 --- a/menu/options.tscn +++ b/menu/options.tscn @@ -29,21 +29,25 @@ columns = 2 [node name="FullscreenLabel" type="Label" parent="VBoxContainer/OptionsGridContainer"] unique_name_in_owner = true +z_index = 100 layout_mode = 2 text = "Fullscreen" [node name="FullscreenCheckButton" type="CheckButton" parent="VBoxContainer/OptionsGridContainer"] unique_name_in_owner = true +z_index = 100 layout_mode = 2 mouse_filter = 2 [node name="WindowFactorLabel" type="Label" parent="VBoxContainer/OptionsGridContainer"] unique_name_in_owner = true +z_index = 100 layout_mode = 2 text = "Window Factor" [node name="WindowFactorOptionButton" type="OptionButton" parent="VBoxContainer/OptionsGridContainer"] unique_name_in_owner = true +z_index = 100 layout_mode = 2 mouse_filter = 2 selected = 0 @@ -67,6 +71,7 @@ alignment = 2 [node name="CreditsButton" type="Button" parent="VBoxContainer/HBoxContainer"] unique_name_in_owner = true +z_index = 100 layout_mode = 2 mouse_filter = 2 theme = ExtResource("2_1tdpy") @@ -74,6 +79,7 @@ text = "Credits" [node name="BackButton" type="Button" parent="VBoxContainer/HBoxContainer"] unique_name_in_owner = true +z_index = 100 layout_mode = 2 mouse_filter = 2 theme = ExtResource("2_1tdpy") diff --git a/menu/pause_menu.tscn b/menu/pause_menu.tscn index e55940f..a254399 100644 --- a/menu/pause_menu.tscn +++ b/menu/pause_menu.tscn @@ -21,6 +21,7 @@ offset_bottom = 166.0 [node name="ContinueButton" type="Button" parent="VBoxContainer"] unique_name_in_owner = true +z_index = 100 layout_mode = 2 mouse_filter = 2 theme = ExtResource("2_vy7sn") @@ -28,6 +29,7 @@ shortcut = SubResource("Shortcut_lgp46") text = "CONTINUE" [node name="OptionsButton" type="Button" parent="VBoxContainer"] +z_index = 100 layout_mode = 2 mouse_filter = 2 theme = ExtResource("2_vy7sn") @@ -35,6 +37,7 @@ text = "OPTIONS" [node name="MainMenuButton" type="Button" parent="VBoxContainer"] unique_name_in_owner = true +z_index = 100 layout_mode = 2 mouse_filter = 2 theme = ExtResource("2_vy7sn")