51 lines
1.1 KiB
GDScript
51 lines
1.1 KiB
GDScript
# CameraShakePlayer.gd
|
|
extends Node
|
|
class_name CameraShakePlayer
|
|
|
|
var _preset: CameraShakePreset
|
|
var _time := 0.0
|
|
var _strength := 0.0
|
|
var _active := false
|
|
|
|
var _noise := FastNoiseLite.new()
|
|
var _noise_seed := randi()
|
|
|
|
func play(preset: CameraShakePreset) -> void:
|
|
_preset = preset
|
|
_time = 0.0
|
|
_strength = 0.0
|
|
_active = true
|
|
_noise.seed = _noise_seed
|
|
|
|
func stop() -> void:
|
|
_active = false
|
|
|
|
func update(delta: float) -> Vector2:
|
|
if not _active or not _preset:
|
|
return Vector2.ZERO
|
|
|
|
_time += delta
|
|
|
|
var total := _preset.fade_in + _preset.hold + _preset.fade_out
|
|
if _time >= total:
|
|
_active = false
|
|
return Vector2.ZERO
|
|
|
|
# ===== 强度曲线 =====
|
|
if _time < _preset.fade_in:
|
|
_strength = _time / _preset.fade_in
|
|
elif _time < _preset.fade_in + _preset.hold:
|
|
_strength = 1.0
|
|
else:
|
|
var t := (_time - _preset.fade_in - _preset.hold) / _preset.fade_out
|
|
_strength = 1.0 - t
|
|
|
|
# ===== Noise 偏移 =====
|
|
var shake_t := _time * _preset.frequency
|
|
var offset := Vector2(
|
|
_noise.get_noise_1d(shake_t),
|
|
_noise.get_noise_1d(shake_t + 1000)
|
|
)
|
|
|
|
return offset * _preset.amplitude * _strength
|