Added enemy movement
This commit is contained in:
@@ -1,11 +1,27 @@
|
|||||||
class_name EnemyController
|
class_name EnemyController
|
||||||
extends Node
|
extends Node
|
||||||
|
|
||||||
|
|
||||||
signal accelerate(direction: Vector2, delta: float)
|
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:
|
func _physics_process(delta: float) -> void:
|
||||||
for i in 10:
|
if ship.is_on_screen:
|
||||||
shoot.emit(i)
|
shoot.emit()
|
||||||
accelerate.emit(Vector2.ZERO, delta)
|
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()
|
||||||
|
|||||||
@@ -4,3 +4,10 @@
|
|||||||
|
|
||||||
[node name="EnemyController" type="Node"]
|
[node name="EnemyController" type="Node"]
|
||||||
script = ExtResource("1_10a67")
|
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"]
|
||||||
|
|||||||
@@ -7,14 +7,16 @@ signal accelerate(direction: Vector2, delta: float)
|
|||||||
signal shoot(weapon_index: int)
|
signal shoot(weapon_index: int)
|
||||||
|
|
||||||
|
|
||||||
|
const WEAPON_ACTIONS := {
|
||||||
|
0: "shoot_weapon_1",
|
||||||
|
1: "shoot_weapon_2",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
func _physics_process(delta: float) -> void:
|
func _physics_process(delta: float) -> void:
|
||||||
var input_direction := Input.get_vector("move_left", "move_right", "move_up", "move_down")
|
var input_direction := Input.get_vector("move_left", "move_right", "move_up", "move_down")
|
||||||
accelerate.emit(input_direction, delta)
|
accelerate.emit(input_direction, delta)
|
||||||
|
|
||||||
var weapon_actions := {
|
for index : int in WEAPON_ACTIONS:
|
||||||
0: "shoot_weapon_1",
|
if Input.is_action_pressed(WEAPON_ACTIONS[index]):
|
||||||
1: "shoot_weapon_2",
|
|
||||||
}
|
|
||||||
for index : int in weapon_actions:
|
|
||||||
if Input.is_action_pressed(weapon_actions[index]):
|
|
||||||
shoot.emit(index)
|
shoot.emit(index)
|
||||||
|
|||||||
@@ -75,12 +75,6 @@ func accelerate(direction: Vector2, delta: float) -> void:
|
|||||||
velocity = velocity.normalized() * max_speed
|
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:
|
func _get_new_speed(accel: float, decel: float, current_speed: float) -> float:
|
||||||
if is_zero_approx(accel):
|
if is_zero_approx(accel):
|
||||||
if absf(current_speed) < decel:
|
if absf(current_speed) < decel:
|
||||||
|
|||||||
@@ -2,7 +2,26 @@ class_name AbstractEnemyShip
|
|||||||
extends AbstractShip
|
extends AbstractShip
|
||||||
|
|
||||||
|
|
||||||
|
@onready var controller : EnemyController = $EnemyController
|
||||||
|
|
||||||
|
|
||||||
|
var is_on_screen : bool = false
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
super._ready()
|
super._ready()
|
||||||
for weapon in _weapons:
|
for weapon in _weapons:
|
||||||
weapon.set_belonging(AbstractWeapon.Belonging.ENEMY)
|
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
|
||||||
|
|||||||
@@ -9,8 +9,12 @@ collision_layer = 4
|
|||||||
collision_mask = 2
|
collision_mask = 2
|
||||||
script = ExtResource("2_fwvrd")
|
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="accelerate" from="EnemyController" to="." method="accelerate"]
|
||||||
[connection signal="reload" from="EnemyController" to="." method="reload"]
|
[connection signal="shoot" from="EnemyController" to="." method="_on_enemy_controller_shoot"]
|
||||||
[connection signal="shoot" from="EnemyController" to="." method="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"]
|
||||||
|
|||||||
@@ -6,3 +6,9 @@ func _ready() -> void:
|
|||||||
super._ready()
|
super._ready()
|
||||||
for weapon in _weapons:
|
for weapon in _weapons:
|
||||||
weapon.set_belonging(AbstractWeapon.Belonging.PLAYER)
|
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)
|
||||||
|
|||||||
@@ -38,4 +38,4 @@ offset_bottom = 22.0
|
|||||||
[node name="PlayerController" parent="." index="4" instance=ExtResource("3_4mjo1")]
|
[node name="PlayerController" parent="." index="4" instance=ExtResource("3_4mjo1")]
|
||||||
|
|
||||||
[connection signal="accelerate" from="PlayerController" to="." method="accelerate"]
|
[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"]
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ extends BlastProjectile
|
|||||||
@onready var livetime_timer := $LivetimeTimer
|
@onready var livetime_timer := $LivetimeTimer
|
||||||
@onready var sprite_on_timer := $SpriteOnTimer
|
@onready var sprite_on_timer := $SpriteOnTimer
|
||||||
@onready var sprite_off_timer := $SpriteOffTimer
|
@onready var sprite_off_timer := $SpriteOffTimer
|
||||||
|
@onready var explosion_particles : ExplosionParticles = $ExplosionParticles
|
||||||
|
|
||||||
|
|
||||||
const OFF_TIMES = [
|
const OFF_TIMES = [
|
||||||
@@ -108,10 +109,6 @@ func _switch_sprite(new_state_state: SpriteState) -> void:
|
|||||||
sprite_off.hide()
|
sprite_off.hide()
|
||||||
|
|
||||||
|
|
||||||
@onready var sprite : Sprite2D = $Sprite2D
|
|
||||||
@onready var explosion_particles : ExplosionParticles = $ExplosionParticles
|
|
||||||
|
|
||||||
|
|
||||||
func _process_hit_for_projectile(_collided_body: Node2D) -> void:
|
func _process_hit_for_projectile(_collided_body: Node2D) -> void:
|
||||||
_current_sprite_state = SpriteState.Disabled
|
_current_sprite_state = SpriteState.Disabled
|
||||||
explosion_particles.emitting = true
|
explosion_particles.emitting = true
|
||||||
|
|||||||
+2
-1
@@ -25,5 +25,6 @@ func _create_random_enemy() -> void:
|
|||||||
|
|
||||||
var enemy : AbstractEnemyShip = ENEMIES.pick_random().instantiate()
|
var enemy : AbstractEnemyShip = ENEMIES.pick_random().instantiate()
|
||||||
add_child(enemy)
|
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)
|
enemy.destroyed.connect(_create_random_enemy, CONNECT_DEFERRED)
|
||||||
|
|||||||
Reference in New Issue
Block a user