From c5400d54e4d590861e3199559db782588184d202 Mon Sep 17 00:00:00 2001 From: Tomasz Boruc Date: Fri, 9 Oct 2026 21:22:44 +0200 Subject: [PATCH] Poprawki w rakiecie --- assets/sounds/effects/engine2.mp3.import | 19 ++++ resources/items/missile_launcher.tres | 2 +- scripts/game/engine_visual.gd.uid | 1 + scripts/game/weapon_projectile.gd | 106 +++++++++++++++++------ 4 files changed, 99 insertions(+), 29 deletions(-) create mode 100644 assets/sounds/effects/engine2.mp3.import create mode 100644 scripts/game/engine_visual.gd.uid diff --git a/assets/sounds/effects/engine2.mp3.import b/assets/sounds/effects/engine2.mp3.import new file mode 100644 index 0000000..ee15acf --- /dev/null +++ b/assets/sounds/effects/engine2.mp3.import @@ -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 diff --git a/resources/items/missile_launcher.tres b/resources/items/missile_launcher.tres index f3c8359..a9d3641 100644 --- a/resources/items/missile_launcher.tres +++ b/resources/items/missile_launcher.tres @@ -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 diff --git a/scripts/game/engine_visual.gd.uid b/scripts/game/engine_visual.gd.uid new file mode 100644 index 0000000..2edfd61 --- /dev/null +++ b/scripts/game/engine_visual.gd.uid @@ -0,0 +1 @@ +uid://bix37j003eyci diff --git a/scripts/game/weapon_projectile.gd b/scripts/game/weapon_projectile.gd index 629f27d..1771248 100644 --- a/scripts/game/weapon_projectile.gd +++ b/scripts/game/weapon_projectile.gd @@ -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): - homing_target = _find_enemy_in_acquisition_range() + _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 - )) - rotation = direction.angle() - var step := projectile_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 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)