56 lines
1.2 KiB
GDScript3
56 lines
1.2 KiB
GDScript3
|
|
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
|