platformer-game-test/src/Actors/Camera.gd

51 lines
1.2 KiB
GDScript

extends Camera2D
class_name CameraGame
var _shake_config := {
'amplitude': .0,
'transition': Tween.TRANS_SINE,
'easing': Tween.EASE_IN_OUT,
'priority': 0
}
func start_shake(duration:float = .2, frequency:float = 15.0, amplitude:float = 5.0, priority:int = 0):
if priority >= _shake_config.priority:
_shake_config.priority = priority
_shake_config.amplitude = amplitude
$Duration.wait_time = duration
$Frequency.wait_time = 1 / frequency
Input.start_joy_vibration(0, 0.5, 1, duration)
$Duration.start()
$Frequency.start()
_new_shake()
pass
func _new_shake():
var rand := Vector2(
rand_range(-_shake_config.amplitude, _shake_config.amplitude),
rand_range(-_shake_config.amplitude, _shake_config.amplitude)
)
$Tween.interpolate_property(self, "offset", self.offset, rand, $Frequency.wait_time, _shake_config.transition, _shake_config.easing)
$Tween.start()
func _reset():
$Tween.interpolate_property(self, "offset", self.offset, Vector2.ZERO, $Frequency.wait_time, _shake_config.transition, _shake_config.easing)
$Tween.start()
_shake_config.priority = 0
func _on_Frequency_timeout() -> void:
_new_shake()
func _on_Duration_timeout() -> void:
_reset()
$Frequency.stop()