Added broken homing for LauncherProjectiles

This commit is contained in:
2025-11-13 17:54:45 +03:00
parent 58f466d5aa
commit f481d9d4fe
4 changed files with 60 additions and 32 deletions
@@ -76,3 +76,34 @@ func _on_body_entered(body: Node2D) -> void:
func _process_hit_for_projectile(_collided_body: Node2D) -> void: func _process_hit_for_projectile(_collided_body: Node2D) -> void:
queue_free() queue_free()
func _get_nearest_foe(filter: Array[AbstractShip]) -> AbstractShip:
var nearest_foe : AbstractShip = null
var minimal_distance := 1000000
for foe in _get_foes(filter):
var distance := floori(position.distance_to(foe.position))
if distance < minimal_distance:
minimal_distance = distance
nearest_foe = foe
return nearest_foe
func _get_foes(filter: Array[AbstractShip]) -> Array[AbstractShip]:
var foes : Array[AbstractShip] = []
var flags_by_group : Dictionary[String, bool] = {
"enemies": collide_enemies,
"players": collide_players,
}
for group in flags_by_group:
if not flags_by_group[group]: continue
var nodes := get_tree().get_nodes_in_group(group)
for node in nodes:
if not node in filter:
foes.append(node)
return foes
@@ -2,17 +2,44 @@ class_name LauncherProjectile
extends AbstractProjectile extends AbstractProjectile
@export_range(0, 360) var rotation_speed: int
@onready var sprites : Array[Sprite2D] = [ @onready var sprites : Array[Sprite2D] = [
$Sprite2D_E, $Sprite2D_SE, $Sprite2D_S, $Sprite2D_SW, $Sprite2D_E, $Sprite2D_SE, $Sprite2D_S, $Sprite2D_SW,
$Sprite2D_W, $Sprite2D_NW, $Sprite2D_N, $Sprite2D_NE, $Sprite2D_W, $Sprite2D_NW, $Sprite2D_N, $Sprite2D_NE,
] ]
var target : AbstractShip = null
func _ready() -> void: func _ready() -> void:
_acquire_target()
super._ready() super._ready()
_update_sprite(_velocity) _update_sprite(_velocity)
func _physics_process(delta: float) -> void:
_apply_homing_guidance(delta)
super._physics_process(delta)
func _acquire_target() -> void:
target = _get_nearest_foe([])
func _apply_homing_guidance(delta: float) -> void:
if not target: return
var max_rotation_speed := deg_to_rad(rotation_speed) * delta
var angle := (_velocity + position - target.position).angle()
_velocity = _velocity.rotated(angle)
_update_sprite(_velocity)
func _update_sprite(velocity: Vector2) -> void: func _update_sprite(velocity: Vector2) -> void:
var sector := 360.0 / sprites.size() var sector := 360.0 / sprites.size()
var angle := rad_to_deg(velocity.angle()) var angle := rad_to_deg(velocity.angle())
@@ -50,6 +50,7 @@ height = 6.0
collision_layer = 0 collision_layer = 0
collision_mask = 0 collision_mask = 0
script = ExtResource("2_6hdsf") script = ExtResource("2_6hdsf")
rotation_speed = 90
damage = SubResource("Resource_kxgpk") damage = SubResource("Resource_kxgpk")
speed = 300 speed = 300
@@ -39,7 +39,7 @@ func _start_jink_timer() -> void:
func _on_jink_timer_timeout() -> void: func _on_jink_timer_timeout() -> void:
var foe := _get_nearest_foe() var foe := _get_nearest_foe(_collided_foes)
if foe: if foe:
_target_foe(foe) _target_foe(foe)
if position.distance_to(foe.position) > no_deviation_distance: if position.distance_to(foe.position) > no_deviation_distance:
@@ -60,34 +60,3 @@ func _apply_random_deviation() -> void:
var deviation_rad := deg_to_rad(deviation_angle) var deviation_rad := deg_to_rad(deviation_angle)
var random_angle := randfn(0.0, deviation_rad / 6.0) var random_angle := randfn(0.0, deviation_rad / 6.0)
_velocity = _velocity.rotated(random_angle) _velocity = _velocity.rotated(random_angle)
func _get_nearest_foe() -> AbstractShip:
var nearest_foe : AbstractShip = null
var minimal_distance := 1000000
for foe in _get_foes():
var distance := floori(position.distance_to(foe.position))
if distance < minimal_distance:
minimal_distance = distance
nearest_foe = foe
return nearest_foe
func _get_foes() -> Array[AbstractShip]:
var foes : Array[AbstractShip] = []
var flags_by_group : Dictionary[String, bool] = {
"enemies": collide_enemies,
"players": collide_players,
}
for group in flags_by_group:
if not flags_by_group[group]: continue
var nodes := get_tree().get_nodes_in_group(group)
for node in nodes:
if not node in _collided_foes:
foes.append(node)
return foes