90 lines
3.1 KiB
GDScript
90 lines
3.1 KiB
GDScript
class_name Rocket
|
|
extends Path2D
|
|
|
|
const FIREWORK_SOUNDS: Array[AudioStreamMP3] = [
|
|
preload("res://assets/sfx/fireworks_1.mp3"),
|
|
preload("res://assets/sfx/fireworks_2.mp3"),
|
|
preload("res://assets/sfx/fireworks_3.mp3"),
|
|
preload("res://assets/sfx/fireworks_4.mp3"),
|
|
preload("res://assets/sfx/fireworks_5.mp3"),
|
|
]
|
|
const BLAST_SOUNDS: Array[AudioStreamMP3] = [
|
|
preload("res://assets/sfx/blast_1.mp3"),
|
|
preload("res://assets/sfx/blast_2.mp3"),
|
|
preload("res://assets/sfx/blast_3.mp3"),
|
|
preload("res://assets/sfx/blast_4.mp3"),
|
|
preload("res://assets/sfx/blast_5.mp3"),
|
|
]
|
|
const COLORS: Array[Color] = [
|
|
Color(0.427, 0.796, 1),
|
|
Color(0.976, 0.322, 0.392),
|
|
Color(1, 0.396, 0.753),
|
|
Color(0.78, 0.282, 0.902),
|
|
Color(0.357, 0.604, 0.631),
|
|
Color(1, 0.659, 0.137),
|
|
Color(0.216, 0.757, 0.341),
|
|
]
|
|
|
|
@export var spread_angle: float = PI/8.0
|
|
@export var segments: int = 5
|
|
|
|
var ind_color: int = 0
|
|
|
|
@onready var path_follow: PathFollow2D = $PathFollow2D
|
|
@onready var traveling_timer: Timer = $TravelingTimer
|
|
@onready var explosion_timer: Timer = $ExplosionTimer
|
|
@onready var rocket: Sprite2D = $PathFollow2D/Rocket
|
|
@onready var explosion_particles: Node2D = $PathFollow2D/ExplosionParticles
|
|
@onready var firework_audio_player: AudioStreamPlayer2D = $FireworkAudioPlayer
|
|
@onready var blast_audio_player: AudioStreamPlayer2D = $BlastAudioPlayer
|
|
|
|
|
|
func _ready() -> void:
|
|
ind_color = randi() % int(rocket.texture.get_size().x / rocket.region_rect.size.x)
|
|
rocket.region_rect.position.x = ind_color * rocket.region_rect.size.x
|
|
|
|
firework_audio_player.stream = FIREWORK_SOUNDS[randi() % FIREWORK_SOUNDS.size()]
|
|
blast_audio_player.stream = BLAST_SOUNDS[randi() % BLAST_SOUNDS.size()]
|
|
|
|
|
|
func start(start_point: Vector2, end_point: Vector2) -> void:
|
|
explosion_particles.modulate = COLORS[ind_color]
|
|
|
|
create_path(start_point, end_point)
|
|
|
|
var travel_time: float = randf_range(0.5, 1.0)
|
|
traveling_timer.start(travel_time)
|
|
|
|
path_follow.progress_ratio = 0.0
|
|
var tween: Tween = create_tween().set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_CIRC)
|
|
var _a: PropertyTweener = tween.tween_property(path_follow, "progress_ratio", 1.0, travel_time)
|
|
|
|
firework_audio_player.play()
|
|
|
|
|
|
func create_path(start_point: Vector2, end_point: Vector2) -> void:
|
|
var current: Vector2 = start_point
|
|
var segment_length: float = start_point.distance_to(end_point) / segments
|
|
|
|
var general_direction: Vector2 = (end_point - start_point).normalized()
|
|
|
|
curve.add_point(start_point, -segment_length * general_direction / 2.0, segment_length * general_direction / 2.0)
|
|
for _segment: int in range(segments):
|
|
var angle: float = randf_range(-spread_angle / 2, spread_angle / 2)
|
|
var new: Vector2 = current + (current.direction_to(end_point) * segment_length).rotated(angle)
|
|
var direction: Vector2 = (new - current).normalized()
|
|
curve.add_point(new, -segment_length * direction / 2.0, segment_length * direction / 2.0)
|
|
current = new
|
|
|
|
|
|
func _on_traveling_timer_timeout() -> void:
|
|
rocket.hide()
|
|
explosion_timer.start()
|
|
blast_audio_player.play()
|
|
for particles: GPUParticles2D in explosion_particles.get_children():
|
|
particles.emitting = true
|
|
|
|
|
|
func _on_explosion_timer_timeout() -> void:
|
|
queue_free()
|