Improves lightning projectile behavior

Refactors the lightning projectile to handle collisions more effectively. It now stops upon hitting an enemy or object, triggers an explosion, and spawns child projectiles from the collision point.  The lightning bolt's collision shape is dynamically updated to match the remaining distance to the target or the collision point. Also adds more test enemies to the map for testing purposes.
This commit is contained in:
Dan Baker 2025-05-06 09:30:44 +01:00
parent d0c2a7b3c8
commit 1a959fbc0c
7 changed files with 232 additions and 41 deletions

View file

@ -1,14 +1,14 @@
extends Node2D
class_name LightningBolt
var goal_point: Vector2 = Vector2(100, 100)
var min_segment_size: float = 2
var max_segment_size: float = 10
var points: Array = []
var emitting = true
var final_goal: Vector2
@export var angle_var: float = 15
@onready var line: Line2D = $Line2D
func _ready():
@ -18,34 +18,37 @@ func _ready():
$Timer.start(randf_range(0.1, 0.5))
func _on_timer_timeout():
Log.pr("Timer timeout")
if (points.size() > 0):
points.pop_front()
line.points = points
#Small variation for more organic look:
$Timer.start(0.002 + randf_range(-0.001, 0.001))
elif (emitting):
update_points()
line.points = points
$Timer.start(0.1 + randf_range(-0.02, 0.1))
func update_points():
final_goal = goal_point - global_position
var curr_line_len = 0
points = [Vector2()]
var start_point = Vector2()
min_segment_size = max(Vector2().distance_to(final_goal) / 40, 1)
max_segment_size = min(Vector2().distance_to(final_goal) / 20, 10)
while (curr_line_len < Vector2().distance_to(final_goal)):
# Adjust segment size based on the distance to goal
var distance_to_goal = Vector2().distance_to(final_goal)
min_segment_size = max(distance_to_goal / 40, 1)
max_segment_size = min(distance_to_goal / 20, 10)
while (curr_line_len < distance_to_goal):
var move_vector = start_point.direction_to(final_goal) * randf_range(min_segment_size, max_segment_size)
var new_point = start_point + move_vector
var new_point_rotated = start_point + move_vector.rotated(deg_to_rad(randf_range(-angle_var, angle_var)))
points.append(new_point_rotated)
start_point = new_point
curr_line_len = start_point.length()
points.append(final_goal)
func set_line_width(amount):
line.width = amount
line.width = amount

View file

@ -4,22 +4,23 @@
[ext_resource type="PackedScene" uid="uid://cafaf3en63bp6" path="res://assets/projectiles/components/bolt.tscn" id="2_gc60m"]
[node name="ProjectileLightning" type="Area2D"]
collision_layer = 16
collision_mask = 12
script = ExtResource("1_2ex40")
[node name="Bolt" parent="." instance=ExtResource("2_gc60m")]
modulate = Color(0.161899, 0.42984, 0.777414, 1)
rotation = 0.872665
[node name="Bolt2" parent="." instance=ExtResource("2_gc60m")]
modulate = Color(0.443066, 0.672326, 1, 1)
rotation = 0.872665
[node name="Bolt3" parent="." instance=ExtResource("2_gc60m")]
modulate = Color(0.205858, 0.510414, 0.999999, 1)
rotation = 0.349066
[node name="Bolt4" parent="." instance=ExtResource("2_gc60m")]
modulate = Color(1, 1, 1, 0.596078)
[node name="Bolt5" parent="." instance=ExtResource("2_gc60m")]
modulate = Color(1, 1, 1, 0.603922)
[node name="Bolt6" parent="." instance=ExtResource("2_gc60m")]