From af8c90be1eef0d8e301e77b9748fb3da76cf889e Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Tue, 25 Nov 2025 23:56:51 +0300 Subject: [PATCH] Added enemy movement randomization --- game/controllers/enemy_swamp_controller.gd | 39 +++++++++++++++++++ .../controllers/enemy_swamp_controller.gd.uid | 1 + game/controllers/enemy_swamp_controller.tscn | 12 ++++++ game/passage.gd | 20 ++++------ game/passage.tscn | 13 ++++++- 5 files changed, 72 insertions(+), 13 deletions(-) create mode 100644 game/controllers/enemy_swamp_controller.gd create mode 100644 game/controllers/enemy_swamp_controller.gd.uid create mode 100644 game/controllers/enemy_swamp_controller.tscn diff --git a/game/controllers/enemy_swamp_controller.gd b/game/controllers/enemy_swamp_controller.gd new file mode 100644 index 0000000..3449c4c --- /dev/null +++ b/game/controllers/enemy_swamp_controller.gd @@ -0,0 +1,39 @@ +class_name EnemySwampController +extends Node + + +@export var passage : Passage + + +const SMALL_ENEMY = preload("res://game/entities/ships/enemies/small/small_enemy_ship.tscn") +const MEDIUM_ENEMY = preload("res://game/entities/ships/enemies/medium/medium_enemy_ship.tscn") +const HEAVY_ENEMY = preload("res://game/entities/ships/enemies/heavy/heavy_enemy_ship.tscn") + +const ENEMY_TYPES := [ SMALL_ENEMY, MEDIUM_ENEMY, HEAVY_ENEMY ] + + +@onready var enemy_update_timer : Timer = $EnemyUpdateTimer + + +func create_enemy() -> void: + var enemy : AbstractEnemyShip = ENEMY_TYPES.pick_random().instantiate() + enemy.position = Vector2(750, randi_range(0, 360)) + passage.add_child(enemy) + + _update_enemy.call_deferred(enemy) + + +func _on_enemy_update_timer_timeout() -> void: + enemy_update_timer.start(randi_range(3, 9)) + + var enemies := get_tree().get_nodes_in_group("enemies") + if enemies.is_empty(): return + + var enemy : Node = enemies.pick_random() + if not enemy is AbstractEnemyShip: return + + _update_enemy(enemy) + + +func _update_enemy(enemy: AbstractEnemyShip) -> void: + enemy.controller.target_position = Vector2(randi_range(300, 600), randi_range(30, 330)) diff --git a/game/controllers/enemy_swamp_controller.gd.uid b/game/controllers/enemy_swamp_controller.gd.uid new file mode 100644 index 0000000..da43c5c --- /dev/null +++ b/game/controllers/enemy_swamp_controller.gd.uid @@ -0,0 +1 @@ +uid://drxv4egqcamtw diff --git a/game/controllers/enemy_swamp_controller.tscn b/game/controllers/enemy_swamp_controller.tscn new file mode 100644 index 0000000..6fa6c4f --- /dev/null +++ b/game/controllers/enemy_swamp_controller.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=2 format=3 uid="uid://cpn5x0ijgl7ei"] + +[ext_resource type="Script" uid="uid://drxv4egqcamtw" path="res://game/controllers/enemy_swamp_controller.gd" id="1_ol8cy"] + +[node name="EnemySwampController" type="Node"] +script = ExtResource("1_ol8cy") + +[node name="EnemyUpdateTimer" type="Timer" parent="."] +one_shot = true +autostart = true + +[connection signal="timeout" from="EnemyUpdateTimer" to="." method="_on_enemy_update_timer_timeout"] diff --git a/game/passage.gd b/game/passage.gd index ddcd36a..406c386 100644 --- a/game/passage.gd +++ b/game/passage.gd @@ -1,16 +1,16 @@ +class_name Passage extends Node2D -const SMALL_ENEMY = preload("res://game/entities/ships/enemies/small/small_enemy_ship.tscn") -const MEDIUM_ENEMY = preload("res://game/entities/ships/enemies/medium/medium_enemy_ship.tscn") -const HEAVY_ENEMY = preload("res://game/entities/ships/enemies/heavy/heavy_enemy_ship.tscn") - const PLAYER := preload("res://game/entities/ships/player/player_ship.tscn") +@onready var enemy_swamp_controller : EnemySwampController = $EnemySwampController +@onready var enemy_timer : Timer = $EnemyTimer + + func _ready() -> void: _create_player() - _create_random_enemy() func _create_player() -> void: @@ -20,11 +20,7 @@ func _create_player() -> void: add_child(player) -func _create_random_enemy() -> void: - const ENEMIES := [ SMALL_ENEMY, MEDIUM_ENEMY, HEAVY_ENEMY ] +func _on_enemy_timer_timeout() -> void: + enemy_swamp_controller.create_enemy() - var enemy : AbstractEnemyShip = ENEMIES.pick_random().instantiate() - enemy.position = Vector2(750, randi_range(0, 360)) - enemy.destroyed.connect(_create_random_enemy, CONNECT_DEFERRED) - add_child(enemy) - enemy.controller.target_position = Vector2(550, 180) + enemy_timer.start(randi_range(3, 9)) diff --git a/game/passage.tscn b/game/passage.tscn index 16c6268..7c54a8c 100644 --- a/game/passage.tscn +++ b/game/passage.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=3 format=3 uid="uid://dgc0087kvarx6"] +[gd_scene load_steps=4 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"] [sub_resource type="WorldBoundaryShape2D" id="WorldBoundaryShape2D_ltkyg"] @@ -32,3 +33,13 @@ position = Vector2(640, 180) rotation = -1.5707964 shape = SubResource("WorldBoundaryShape2D_ltkyg") one_way_collision = true + +[node name="EnemySwampController" parent="." node_paths=PackedStringArray("passage") instance=ExtResource("2_72vqi")] +passage = NodePath("..") + +[node name="EnemyTimer" type="Timer" parent="."] +wait_time = 10.0 +one_shot = true +autostart = true + +[connection signal="timeout" from="EnemyTimer" to="." method="_on_enemy_timer_timeout"]