godot-plateformer/addons/reedcamera/ref_counted/ReedCameraShakePlayer.gd

56 lines
1.2 KiB
GDScript

extends RefCounted
class_name ReedCameraShakePlayer
var _preset: ReedCameraShakePreset
var _time := 0.0
var _strength := 0.0
var _active := false
var _noise := FastNoiseLite.new()
var _noise_seed := randi()
func play(preset: ReedCameraShakePreset) -> void:
_preset = preset
_time = 0.0
_strength = 0.0
_active = true
_noise.seed = _noise_seed
func stop() -> void:
_active = false
func is_active() -> bool:
return _active
func evaluate(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 Vector2(
offset.x * _preset.amplitude.x,
offset.y * _preset.amplitude.y
) * _strength