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
|
weapon_kind = 3
|
||||||
fire_interval = 5.0
|
fire_interval = 5.0
|
||||||
weapon_cooldown = 5.0
|
weapon_cooldown = 5.0
|
||||||
projectile_speed = 440.0
|
projectile_speed = 400.0
|
||||||
weapon_range = 1000.0
|
weapon_range = 1000.0
|
||||||
energy_cost = 25.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 max_range := 800.0
|
||||||
var weapon_kind := ItemDefinition.WeaponKind.PLASMA
|
var weapon_kind := ItemDefinition.WeaponKind.PLASMA
|
||||||
var homing_target: Node2D
|
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 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 _distance_travelled := 0.0
|
||||||
var _already_hit: Dictionary = {}
|
var _already_hit: Dictionary = {}
|
||||||
var _impact_handled := false
|
var _impact_handled := false
|
||||||
@ -33,27 +42,65 @@ func configure(
|
|||||||
) -> void:
|
) -> void:
|
||||||
global_position = start_position
|
global_position = start_position
|
||||||
direction = travel_direction.normalized()
|
direction = travel_direction.normalized()
|
||||||
|
_heading = direction.angle()
|
||||||
weapon_kind = kind
|
weapon_kind = kind
|
||||||
projectile_speed = speed
|
projectile_speed = speed
|
||||||
|
_flight_velocity = direction * projectile_speed
|
||||||
|
_launch_wobble_phase = randf_range(0.0, TAU)
|
||||||
damage = projectile_damage
|
damage = projectile_damage
|
||||||
max_range = projectile_range
|
max_range = projectile_range
|
||||||
homing_target = target
|
homing_target = target
|
||||||
|
|
||||||
func _physics_process(delta: float) -> void:
|
func _physics_process(delta: float) -> void:
|
||||||
|
var travel_velocity := direction * projectile_speed
|
||||||
if weapon_kind == ItemDefinition.WeaponKind.MISSILE:
|
if weapon_kind == ItemDefinition.WeaponKind.MISSILE:
|
||||||
|
_flight_time += delta
|
||||||
if not is_instance_valid(homing_target):
|
if not is_instance_valid(homing_target):
|
||||||
|
_has_locked_target = false
|
||||||
|
if _flight_time >= seeker_arm_delay:
|
||||||
homing_target = _find_enemy_in_acquisition_range()
|
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):
|
if is_instance_valid(homing_target):
|
||||||
var to_target := homing_target.global_position - global_position
|
var to_target := homing_target.global_position - global_position
|
||||||
if to_target.length_squared() > 0.001:
|
if to_target.length_squared() > 0.001:
|
||||||
var target_angle := to_target.angle()
|
var target_velocity := Vector2.ZERO
|
||||||
direction = Vector2.RIGHT.rotated(rotate_toward(
|
if homing_target is CharacterBody2D:
|
||||||
direction.angle(), target_angle, homing_turn_speed * delta
|
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()
|
rotation = direction.angle()
|
||||||
var step := projectile_speed * delta
|
|
||||||
|
var displacement := travel_velocity * delta
|
||||||
|
var step := displacement.length()
|
||||||
var previous_position := global_position
|
var previous_position := global_position
|
||||||
var next_position := previous_position + direction * step
|
var next_position := previous_position + displacement
|
||||||
var query := PhysicsRayQueryParameters2D.create(
|
var query := PhysicsRayQueryParameters2D.create(
|
||||||
previous_position,
|
previous_position,
|
||||||
next_position,
|
next_position,
|
||||||
@ -67,7 +114,7 @@ func _physics_process(delta: float) -> void:
|
|||||||
return
|
return
|
||||||
global_position = next_position
|
global_position = next_position
|
||||||
_distance_travelled += step
|
_distance_travelled += step
|
||||||
if _distance_travelled >= max_range:
|
if _distance_travelled >= max_range and not _has_locked_target:
|
||||||
queue_free()
|
queue_free()
|
||||||
|
|
||||||
func _process(delta: float) -> void:
|
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))
|
draw_circle(puff_position, puff_size * 0.48, Color(0.67, 0.75, 0.8, fade * 0.12))
|
||||||
|
|
||||||
func _draw_missile() -> void:
|
func _draw_missile() -> void:
|
||||||
var flicker := sin(_engine_time * 37.0) * 2.5 + sin(_engine_time * 23.0) * 1.5
|
var flicker := sin(_engine_time * 37.0) * 2.0 + sin(_engine_time * 23.0) * 1.0
|
||||||
var flame_tip := -20.0 - flicker
|
var flame_tip := -23.0 - flicker
|
||||||
# Layered exhaust uses tapered strokes so it flickers without polygon artifacts.
|
# Narrow, layered exhaust behind the missile.
|
||||||
draw_line(Vector2(-8, 0), Vector2(flame_tip, 0), Color(1.0, 0.27, 0.045, 0.8), 6.0, true)
|
draw_line(Vector2(-10, 0), Vector2(flame_tip, 0), Color(1.0, 0.25, 0.045, 0.72), 4.2, 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(-10, 0), Vector2(flame_tip * 0.72, 0), Color(1.0, 0.72, 0.18, 0.94), 2.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)
|
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.
|
# Rear fins, long cylindrical casing, and a pointed nose; +X is forward.
|
||||||
draw_line(Vector2(-5, -2.5), Vector2(-11, -7), Color(0.68, 0.17, 0.12, 1.0), 2.2, true)
|
var fin_color := Color(0.48, 0.13, 0.11, 1.0)
|
||||||
draw_line(Vector2(-11, -7), Vector2(-9, -1.8), Color(0.68, 0.17, 0.12, 1.0), 2.2, true)
|
draw_line(Vector2(-7, -1.7), Vector2(-12, -5.0), fin_color, 1.8, 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(-12, -5.0), Vector2(-10, -1.4), fin_color, 1.8, 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(-7, 1.7), Vector2(-12, 5.0), fin_color, 1.8, true)
|
||||||
draw_rect(Rect2(-8, -3.5, 14, 7), Color(0.72, 0.79, 0.84, 1.0), true)
|
draw_line(Vector2(-12, 5.0), Vector2(-10, 1.4), fin_color, 1.8, true)
|
||||||
draw_rect(Rect2(3, -2.2, 3, 4.4), Color(0.91, 0.34, 0.2, 1.0), 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(6, -3.5), Vector2(12, 0), Color(0.91, 0.34, 0.2, 1.0), 2.6, true)
|
draw_line(Vector2(-8, 0), Vector2(7, 0), Color(0.78, 0.83, 0.86, 1.0), 3.0, 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(-8, 1.8), Vector2(6, 1.8), Color(0.38, 0.45, 0.49, 1.0), 1.2, true)
|
||||||
draw_line(Vector2(-5, -2.4), Vector2(2, -2.4), Color(0.98, 0.99, 1.0, 0.85), 1.0, true)
|
draw_line(Vector2(-5, -1.35), Vector2(3, -1.35), Color(0.97, 0.98, 0.99, 0.9), 0.7, true)
|
||||||
draw_rect(Rect2(-9.5, -1.1, 2.0, 2.2), Color(0.25, 0.31, 0.36, 1.0))
|
# Guidance band and seeker dome add small material details.
|
||||||
draw_circle(Vector2(1.0, 0), 1.35, Color(0.62, 0.93, 1.0, 1.0))
|
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:
|
func _on_body_entered(body: Node2D) -> void:
|
||||||
_hit_target(body)
|
_hit_target(body)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user