Poprawki w rakiecie
This commit is contained in:
parent
9f0346dbce
commit
c5400d54e4
19
assets/sounds/effects/engine2.mp3.import
Normal file
19
assets/sounds/effects/engine2.mp3.import
Normal 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
|
||||
@ -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
|
||||
|
||||
1
scripts/game/engine_visual.gd.uid
Normal file
1
scripts/game/engine_visual.gd.uid
Normal file
@ -0,0 +1 @@
|
||||
uid://bix37j003eyci
|
||||
@ -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)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user