67 lines
1.3 KiB
GDScript3
67 lines
1.3 KiB
GDScript3
|
|
@tool
|
||
|
|
extends Node
|
||
|
|
class_name ReedCameraShakeController
|
||
|
|
|
||
|
|
## =========================
|
||
|
|
## Config
|
||
|
|
## =========================
|
||
|
|
@export var enabled := true
|
||
|
|
|
||
|
|
## =========================
|
||
|
|
## Runtime
|
||
|
|
## =========================
|
||
|
|
|
||
|
|
var _players: Array[ReedCameraShakePlayer] = []
|
||
|
|
var _current_offset := Vector2.ZERO
|
||
|
|
|
||
|
|
func _ready() -> void:
|
||
|
|
if Engine.is_editor_hint():
|
||
|
|
return
|
||
|
|
set_process(true)
|
||
|
|
|
||
|
|
func _exit_tree() -> void:
|
||
|
|
_players.clear()
|
||
|
|
_current_offset = Vector2.ZERO
|
||
|
|
|
||
|
|
func _process(delta: float) -> void:
|
||
|
|
if Engine.is_editor_hint():
|
||
|
|
return
|
||
|
|
|
||
|
|
if not enabled:
|
||
|
|
_current_offset = Vector2.ZERO
|
||
|
|
return
|
||
|
|
|
||
|
|
var offset := Vector2.ZERO
|
||
|
|
|
||
|
|
for p in _players:
|
||
|
|
offset += p.evaluate(delta)
|
||
|
|
|
||
|
|
# 移除已经结束的 player
|
||
|
|
_players = _players.filter(func(p): return p.is_active())
|
||
|
|
|
||
|
|
_current_offset = offset
|
||
|
|
|
||
|
|
## =========================
|
||
|
|
## Public API
|
||
|
|
## =========================
|
||
|
|
func play_shake(preset: ReedCameraShakePreset) -> void:
|
||
|
|
if not preset:
|
||
|
|
return
|
||
|
|
|
||
|
|
var player := ReedCameraShakePlayer.new()
|
||
|
|
player.play(preset)
|
||
|
|
_players.append(player)
|
||
|
|
|
||
|
|
func stop_all() -> void:
|
||
|
|
for p in _players:
|
||
|
|
p.stop()
|
||
|
|
_players.clear()
|
||
|
|
_current_offset = Vector2.ZERO
|
||
|
|
|
||
|
|
## =========================
|
||
|
|
## Pipeline Output
|
||
|
|
## =========================
|
||
|
|
|
||
|
|
func get_camera_offset() -> Vector2:
|
||
|
|
return _current_offset
|