# 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