From b4529a407be107950b775722e6567643c4914ce6 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Mon, 24 Nov 2025 23:30:57 +0300 Subject: [PATCH] Added enemy movement --- game/controllers/enemy_controller.gd | 24 +++++++++++++++---- game/controllers/enemy_controller.tscn | 7 ++++++ game/controllers/player_controller.gd | 14 ++++++----- game/entities/ships/abstract_ship.gd | 6 ----- .../ships/enemies/abstract_enemy_ship.gd | 19 +++++++++++++++ .../ships/enemies/abstract_enemy_ship.tscn | 10 +++++--- game/entities/ships/player/player_ship.gd | 6 +++++ game/entities/ships/player/player_ship.tscn | 2 +- .../weapons/minelayer/minelayer_projectile.gd | 5 +--- game/passage.gd | 3 ++- 10 files changed, 71 insertions(+), 25 deletions(-) diff --git a/game/controllers/enemy_controller.gd b/game/controllers/enemy_controller.gd index 5469aae..b3d27cc 100644 --- a/game/controllers/enemy_controller.gd +++ b/game/controllers/enemy_controller.gd @@ -1,11 +1,27 @@ class_name EnemyController extends Node + signal accelerate(direction: Vector2, delta: float) -signal shoot(weapon_index: int) +signal shoot() + + +@export var ship: AbstractEnemyShip + + +var target_position : Vector2 +var direction : Vector2 func _physics_process(delta: float) -> void: - for i in 10: - shoot.emit(i) - accelerate.emit(Vector2.ZERO, delta) + if ship.is_on_screen: + shoot.emit() + accelerate.emit(direction, delta) + + +func _on_direction_timer_timeout() -> void: + direction = get_acceleration_direction() + + +func get_acceleration_direction() -> Vector2: + return (target_position - ship.position).normalized() diff --git a/game/controllers/enemy_controller.tscn b/game/controllers/enemy_controller.tscn index 4fbbec8..7ebe354 100644 --- a/game/controllers/enemy_controller.tscn +++ b/game/controllers/enemy_controller.tscn @@ -4,3 +4,10 @@ [node name="EnemyController" type="Node"] script = ExtResource("1_10a67") + +[node name="DirectionTimer" type="Timer" parent="."] +process_callback = 0 +wait_time = 0.25 +autostart = true + +[connection signal="timeout" from="DirectionTimer" to="." method="_on_direction_timer_timeout"] diff --git a/game/controllers/player_controller.gd b/game/controllers/player_controller.gd index e4ba521..8ccb127 100644 --- a/game/controllers/player_controller.gd +++ b/game/controllers/player_controller.gd @@ -7,14 +7,16 @@ signal accelerate(direction: Vector2, delta: float) signal shoot(weapon_index: int) +const WEAPON_ACTIONS := { + 0: "shoot_weapon_1", + 1: "shoot_weapon_2", +} + + func _physics_process(delta: float) -> void: var input_direction := Input.get_vector("move_left", "move_right", "move_up", "move_down") accelerate.emit(input_direction, delta) - var weapon_actions := { - 0: "shoot_weapon_1", - 1: "shoot_weapon_2", - } - for index : int in weapon_actions: - if Input.is_action_pressed(weapon_actions[index]): + for index : int in WEAPON_ACTIONS: + if Input.is_action_pressed(WEAPON_ACTIONS[index]): shoot.emit(index) diff --git a/game/entities/ships/abstract_ship.gd b/game/entities/ships/abstract_ship.gd index 2f2ec4e..6234fbe 100644 --- a/game/entities/ships/abstract_ship.gd +++ b/game/entities/ships/abstract_ship.gd @@ -75,12 +75,6 @@ func accelerate(direction: Vector2, delta: float) -> void: velocity = velocity.normalized() * max_speed -func shoot(weapon_index: int) -> void: - if weapon_index >= _weapons.size(): return - - _weapons[weapon_index].shoot(velocity) - - func _get_new_speed(accel: float, decel: float, current_speed: float) -> float: if is_zero_approx(accel): if absf(current_speed) < decel: diff --git a/game/entities/ships/enemies/abstract_enemy_ship.gd b/game/entities/ships/enemies/abstract_enemy_ship.gd index 366028c..2ca9d8c 100644 --- a/game/entities/ships/enemies/abstract_enemy_ship.gd +++ b/game/entities/ships/enemies/abstract_enemy_ship.gd @@ -2,7 +2,26 @@ class_name AbstractEnemyShip extends AbstractShip +@onready var controller : EnemyController = $EnemyController + + +var is_on_screen : bool = false + + func _ready() -> void: super._ready() for weapon in _weapons: weapon.set_belonging(AbstractWeapon.Belonging.ENEMY) + + +func _on_enemy_controller_shoot() -> void: + for weapon in _weapons: + weapon.shoot(velocity) + + +func _on_visible_on_screen_notifier_2d_screen_entered() -> void: + is_on_screen = true + + +func _on_visible_on_screen_notifier_2d_screen_exited() -> void: + is_on_screen = false diff --git a/game/entities/ships/enemies/abstract_enemy_ship.tscn b/game/entities/ships/enemies/abstract_enemy_ship.tscn index 69f3f92..52f794a 100644 --- a/game/entities/ships/enemies/abstract_enemy_ship.tscn +++ b/game/entities/ships/enemies/abstract_enemy_ship.tscn @@ -9,8 +9,12 @@ collision_layer = 4 collision_mask = 2 script = ExtResource("2_fwvrd") -[node name="EnemyController" parent="." index="4" instance=ExtResource("3_l8c0n")] +[node name="EnemyController" parent="." index="4" node_paths=PackedStringArray("ship") instance=ExtResource("3_l8c0n")] +ship = NodePath("..") + +[node name="VisibleOnScreenNotifier2D" type="VisibleOnScreenNotifier2D" parent="." index="5"] [connection signal="accelerate" from="EnemyController" to="." method="accelerate"] -[connection signal="reload" from="EnemyController" to="." method="reload"] -[connection signal="shoot" from="EnemyController" to="." method="shoot"] +[connection signal="shoot" from="EnemyController" to="." method="_on_enemy_controller_shoot"] +[connection signal="screen_entered" from="VisibleOnScreenNotifier2D" to="." method="_on_visible_on_screen_notifier_2d_screen_entered"] +[connection signal="screen_exited" from="VisibleOnScreenNotifier2D" to="." method="_on_visible_on_screen_notifier_2d_screen_exited"] diff --git a/game/entities/ships/player/player_ship.gd b/game/entities/ships/player/player_ship.gd index 93fc6a4..d199882 100644 --- a/game/entities/ships/player/player_ship.gd +++ b/game/entities/ships/player/player_ship.gd @@ -6,3 +6,9 @@ func _ready() -> void: super._ready() for weapon in _weapons: weapon.set_belonging(AbstractWeapon.Belonging.PLAYER) + + +func _on_player_controller_shoot(weapon_index: int) -> void: + if weapon_index >= _weapons.size(): return + + _weapons[weapon_index].shoot(velocity) diff --git a/game/entities/ships/player/player_ship.tscn b/game/entities/ships/player/player_ship.tscn index f819e3b..db4765a 100644 --- a/game/entities/ships/player/player_ship.tscn +++ b/game/entities/ships/player/player_ship.tscn @@ -38,4 +38,4 @@ offset_bottom = 22.0 [node name="PlayerController" parent="." index="4" instance=ExtResource("3_4mjo1")] [connection signal="accelerate" from="PlayerController" to="." method="accelerate"] -[connection signal="shoot" from="PlayerController" to="." method="shoot"] +[connection signal="shoot" from="PlayerController" to="." method="_on_player_controller_shoot"] diff --git a/game/entities/weapons/minelayer/minelayer_projectile.gd b/game/entities/weapons/minelayer/minelayer_projectile.gd index 4561dc2..af24829 100644 --- a/game/entities/weapons/minelayer/minelayer_projectile.gd +++ b/game/entities/weapons/minelayer/minelayer_projectile.gd @@ -10,6 +10,7 @@ extends BlastProjectile @onready var livetime_timer := $LivetimeTimer @onready var sprite_on_timer := $SpriteOnTimer @onready var sprite_off_timer := $SpriteOffTimer +@onready var explosion_particles : ExplosionParticles = $ExplosionParticles const OFF_TIMES = [ @@ -108,10 +109,6 @@ func _switch_sprite(new_state_state: SpriteState) -> void: sprite_off.hide() -@onready var sprite : Sprite2D = $Sprite2D -@onready var explosion_particles : ExplosionParticles = $ExplosionParticles - - func _process_hit_for_projectile(_collided_body: Node2D) -> void: _current_sprite_state = SpriteState.Disabled explosion_particles.emitting = true diff --git a/game/passage.gd b/game/passage.gd index e644e54..6faa74d 100644 --- a/game/passage.gd +++ b/game/passage.gd @@ -25,5 +25,6 @@ func _create_random_enemy() -> void: var enemy : AbstractEnemyShip = ENEMIES.pick_random().instantiate() add_child(enemy) - enemy.position = Vector2(550, 180) + enemy.position = Vector2(750, randi_range(0, 360)) + enemy.controller.target_position = Vector2(550, 180) enemy.destroyed.connect(_create_random_enemy, CONNECT_DEFERRED)