Added broken homing for LauncherProjectiles
This commit is contained in:
@@ -76,3 +76,34 @@ func _on_body_entered(body: Node2D) -> void:
|
||||
|
||||
func _process_hit_for_projectile(_collided_body: Node2D) -> void:
|
||||
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
|
||||
|
||||
|
||||
@export_range(0, 360) var rotation_speed: int
|
||||
|
||||
|
||||
@onready var sprites : Array[Sprite2D] = [
|
||||
$Sprite2D_E, $Sprite2D_SE, $Sprite2D_S, $Sprite2D_SW,
|
||||
$Sprite2D_W, $Sprite2D_NW, $Sprite2D_N, $Sprite2D_NE,
|
||||
]
|
||||
|
||||
var target : AbstractShip = null
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
_acquire_target()
|
||||
super._ready()
|
||||
_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:
|
||||
var sector := 360.0 / sprites.size()
|
||||
var angle := rad_to_deg(velocity.angle())
|
||||
|
||||
@@ -50,6 +50,7 @@ height = 6.0
|
||||
collision_layer = 0
|
||||
collision_mask = 0
|
||||
script = ExtResource("2_6hdsf")
|
||||
rotation_speed = 90
|
||||
damage = SubResource("Resource_kxgpk")
|
||||
speed = 300
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ func _start_jink_timer() -> void:
|
||||
|
||||
|
||||
func _on_jink_timer_timeout() -> void:
|
||||
var foe := _get_nearest_foe()
|
||||
var foe := _get_nearest_foe(_collided_foes)
|
||||
if foe:
|
||||
_target_foe(foe)
|
||||
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 random_angle := randfn(0.0, deviation_rad / 6.0)
|
||||
_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
|
||||
|
||||
Reference in New Issue
Block a user