Poprawki w rakiecie

This commit is contained in:
Tomasz Boruc 2026-10-09 21:22:44 +02:00
parent 9f0346dbce
commit c5400d54e4
4 changed files with 99 additions and 29 deletions

View File

@ -0,0 +1,19 @@
[remap]
importer="mp3"
type="AudioStreamMP3"
uid="uid://celrqfosdcjs1"
path="res://.godot/imported/engine2.mp3-55c79366794bf0dcb408b7aa062b657e.mp3str"
[deps]
source_file="res://assets/sounds/effects/engine2.mp3"
dest_files=["res://.godot/imported/engine2.mp3-55c79366794bf0dcb408b7aa062b657e.mp3str"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

View File

@ -14,6 +14,6 @@ stat_suffix = " DMG"
weapon_kind = 3
fire_interval = 5.0
weapon_cooldown = 5.0
projectile_speed = 440.0
projectile_speed = 400.0
weapon_range = 1000.0
energy_cost = 25.0

View File

@ -0,0 +1 @@
uid://bix37j003eyci

View File

@ -8,8 +8,17 @@ var damage := 1.0
var max_range := 800.0
var weapon_kind := ItemDefinition.WeaponKind.PLASMA
var homing_target: Node2D
var homing_turn_speed := 3.2
var homing_turn_acceleration := 2.3
var homing_max_turn_speed := 1.7
var missile_steering_acceleration := 520.0
var target_acquisition_range := 360.0
var seeker_arm_delay := 0.35
var _flight_velocity := Vector2.ZERO
var _heading := 0.0
var _turn_velocity := 0.0
var _flight_time := 0.0
var _launch_wobble_phase := 0.0
var _has_locked_target := false
var _distance_travelled := 0.0
var _already_hit: Dictionary = {}
var _impact_handled := false
@ -33,27 +42,65 @@ func configure(
) -> void:
global_position = start_position
direction = travel_direction.normalized()
_heading = direction.angle()
weapon_kind = kind
projectile_speed = speed
_flight_velocity = direction * projectile_speed
_launch_wobble_phase = randf_range(0.0, TAU)
damage = projectile_damage
max_range = projectile_range
homing_target = target
func _physics_process(delta: float) -> void:
var travel_velocity := direction * projectile_speed
if weapon_kind == ItemDefinition.WeaponKind.MISSILE:
_flight_time += delta
if not is_instance_valid(homing_target):
_has_locked_target = false
if _flight_time >= seeker_arm_delay:
homing_target = _find_enemy_in_acquisition_range()
_has_locked_target = is_instance_valid(homing_target)
var desired_turn_velocity := 0.0
if is_instance_valid(homing_target):
var to_target := homing_target.global_position - global_position
if to_target.length_squared() > 0.001:
var target_angle := to_target.angle()
direction = Vector2.RIGHT.rotated(rotate_toward(
direction.angle(), target_angle, homing_turn_speed * delta
))
var target_velocity := Vector2.ZERO
if homing_target is CharacterBody2D:
target_velocity = homing_target.velocity
var estimated_intercept_time := to_target.length() / maxf(projectile_speed, 1.0)
var lead_time := minf(estimated_intercept_time, 2.0)
var predicted_target_position := homing_target.global_position + target_velocity * lead_time
var angle_error := wrapf(
(predicted_target_position - global_position).angle() - _heading,
-PI,
PI
)
desired_turn_velocity = clampf(
angle_error * 2.0,
-homing_max_turn_speed,
homing_max_turn_speed
)
_turn_velocity = move_toward(
_turn_velocity,
desired_turn_velocity,
homing_turn_acceleration * delta
)
_heading += _turn_velocity * delta
var wobble_strength := 0.16 * exp(-3.2 * _flight_time)
var wobble_angle := sin(_flight_time * 17.0 + _launch_wobble_phase) * wobble_strength
direction = Vector2.RIGHT.rotated(_heading + wobble_angle)
var desired_velocity := direction * projectile_speed
_flight_velocity = _flight_velocity.move_toward(
desired_velocity,
missile_steering_acceleration * delta
)
travel_velocity = _flight_velocity
rotation = direction.angle()
var step := projectile_speed * delta
var displacement := travel_velocity * delta
var step := displacement.length()
var previous_position := global_position
var next_position := previous_position + direction * step
var next_position := previous_position + displacement
var query := PhysicsRayQueryParameters2D.create(
previous_position,
next_position,
@ -67,7 +114,7 @@ func _physics_process(delta: float) -> void:
return
global_position = next_position
_distance_travelled += step
if _distance_travelled >= max_range:
if _distance_travelled >= max_range and not _has_locked_target:
queue_free()
func _process(delta: float) -> void:
@ -135,25 +182,28 @@ func _draw_missile_smoke() -> void:
draw_circle(puff_position, puff_size * 0.48, Color(0.67, 0.75, 0.8, fade * 0.12))
func _draw_missile() -> void:
var flicker := sin(_engine_time * 37.0) * 2.5 + sin(_engine_time * 23.0) * 1.5
var flame_tip := -20.0 - flicker
# Layered exhaust uses tapered strokes so it flickers without polygon artifacts.
draw_line(Vector2(-8, 0), Vector2(flame_tip, 0), Color(1.0, 0.27, 0.045, 0.8), 6.0, true)
draw_line(Vector2(-8, 0), Vector2(flame_tip * 0.72, 0), Color(1.0, 0.78, 0.22, 0.95), 3.4, true)
draw_line(Vector2(-8, 0), Vector2(flame_tip * 0.42, 0), Color(0.92, 0.98, 1.0, 1.0), 1.6, true)
var flicker := sin(_engine_time * 37.0) * 2.0 + sin(_engine_time * 23.0) * 1.0
var flame_tip := -23.0 - flicker
# Narrow, layered exhaust behind the missile.
draw_line(Vector2(-10, 0), Vector2(flame_tip, 0), Color(1.0, 0.25, 0.045, 0.72), 4.2, true)
draw_line(Vector2(-10, 0), Vector2(flame_tip * 0.72, 0), Color(1.0, 0.72, 0.18, 0.94), 2.4, true)
draw_line(Vector2(-10, 0), Vector2(flame_tip * 0.42, 0), Color(0.9, 0.98, 1.0, 1.0), 1.1, true)
# Stabilizing fins and metallic body, facing along the local +X axis.
draw_line(Vector2(-5, -2.5), Vector2(-11, -7), Color(0.68, 0.17, 0.12, 1.0), 2.2, true)
draw_line(Vector2(-11, -7), Vector2(-9, -1.8), Color(0.68, 0.17, 0.12, 1.0), 2.2, true)
draw_line(Vector2(-5, 2.5), Vector2(-11, 7), Color(0.68, 0.17, 0.12, 1.0), 2.2, true)
draw_line(Vector2(-11, 7), Vector2(-9, 1.8), Color(0.68, 0.17, 0.12, 1.0), 2.2, true)
draw_rect(Rect2(-8, -3.5, 14, 7), Color(0.72, 0.79, 0.84, 1.0), true)
draw_rect(Rect2(3, -2.2, 3, 4.4), Color(0.91, 0.34, 0.2, 1.0), true)
draw_line(Vector2(6, -3.5), Vector2(12, 0), Color(0.91, 0.34, 0.2, 1.0), 2.6, true)
draw_line(Vector2(12, 0), Vector2(6, 3.5), Color(0.91, 0.34, 0.2, 1.0), 2.6, true)
draw_line(Vector2(-5, -2.4), Vector2(2, -2.4), Color(0.98, 0.99, 1.0, 0.85), 1.0, true)
draw_rect(Rect2(-9.5, -1.1, 2.0, 2.2), Color(0.25, 0.31, 0.36, 1.0))
draw_circle(Vector2(1.0, 0), 1.35, Color(0.62, 0.93, 1.0, 1.0))
# Rear fins, long cylindrical casing, and a pointed nose; +X is forward.
var fin_color := Color(0.48, 0.13, 0.11, 1.0)
draw_line(Vector2(-7, -1.7), Vector2(-12, -5.0), fin_color, 1.8, true)
draw_line(Vector2(-12, -5.0), Vector2(-10, -1.4), fin_color, 1.8, true)
draw_line(Vector2(-7, 1.7), Vector2(-12, 5.0), fin_color, 1.8, true)
draw_line(Vector2(-12, 5.0), Vector2(-10, 1.4), fin_color, 1.8, true)
draw_line(Vector2(-8, -1.8), Vector2(6, -1.8), Color(0.25, 0.31, 0.35, 1.0), 3.8, true)
draw_line(Vector2(-8, 0), Vector2(7, 0), Color(0.78, 0.83, 0.86, 1.0), 3.0, true)
draw_line(Vector2(-8, 1.8), Vector2(6, 1.8), Color(0.38, 0.45, 0.49, 1.0), 1.2, true)
draw_line(Vector2(-5, -1.35), Vector2(3, -1.35), Color(0.97, 0.98, 0.99, 0.9), 0.7, true)
# Guidance band and seeker dome add small material details.
draw_line(Vector2(3.0, -1.8), Vector2(3.0, 1.8), Color(0.84, 0.27, 0.16, 1.0), 1.3, true)
draw_line(Vector2(6, -1.6), Vector2(10, 0), Color(0.66, 0.72, 0.75, 1.0), 2.4, true)
draw_line(Vector2(10, 0), Vector2(6, 1.6), Color(0.66, 0.72, 0.75, 1.0), 2.4, true)
draw_circle(Vector2(4.7, 0), 0.85, Color(0.44, 0.82, 0.95, 1.0))
func _on_body_entered(body: Node2D) -> void:
_hit_target(body)