Files
MovementTests/addons/shaker/src/Shaker.gd
2026-01-20 15:27:59 +01:00

93 lines
3.6 KiB
GDScript

extends Node
func shake_by_preset(preset:ShakerPresetBase, node:Node, duration:float, speed:float=1.0, intensity:float=1.0, fade_in:float=0.25, fade_out:float=2.0):
if (preset is ShakerPreset2D && not node is Node2D): assert(false, "ShakerPreset2D only works for Node2D type")
if (preset is ShakerPreset3D && not node is Node3D): assert(false, "ShakerPreset3D only works for Node3D type")
if preset is ShakerPreset3D:
var component:ShakerComponent3D = ShakerComponent3D.new()
add_child(component)
component.name = "TEMP_ShakerComponent3D"
component.custom_target = true
component.intensity = intensity
component.Targets.append(node)
component.duration = duration
component.shake_speed = speed
component.fade_in = fade_in
component.fade_out = fade_out
component.shakerPreset = preset
component.shake_finished.connect(_on_shake_finished.bind(component))
component.play_shake()
elif preset is ShakerPreset2D:
var component:ShakerComponent2D = ShakerComponent2D.new()
component.name = "ShakerComponent2D"
add_child(component)
component.custom_target = true
component.Targets.append(node)
component.duration = duration
component.intensity = intensity
component.shake_speed = speed
component.fade_in = fade_in
component.fade_out = fade_out
component.shakerPreset = preset
component.shake_finished.connect(_on_shake_finished.bind(component))
component.play_shake()
func shake_property(property:ShakerProperty, node:Node, duration:float, speed:float=1.0, intensity:float=1.0, fade_in:float=0.25, fade_out:float=2.0) -> ShakerComponent:
var component:ShakerComponent = ShakerComponent.new()
component.name = "ShakerComponent"
add_child(component)
component.custom_target = true
component.Targets.append(node)
component.duration = duration
component.shake_speed = speed
component.intensity = intensity
component.fade_in = fade_in
component.fade_out = fade_out
component.shakerProperty.append(property)
component.shake_finished.connect(_on_shake_finished.bind(component))
component.play_shake()
return component
func shake_emit_3d(position:Vector3,preset:ShakerPreset3D, max_distance:float, duration:float, distance_attenuation:float=0.5, speed:float=1.0, fade_in:float=0.25, fade_out:float=2.0) -> ShakerEmitter3D:
var component:ShakerEmitter3D = ShakerEmitter3D.new()
component.name = "ShakerEmitter3D"
add_child(component)
component.max_distance = max_distance
component.global_position = position
component.duration = duration
component.shake_speed = speed
component.fade_in = fade_in
component.fade_out = fade_out
component.shakerPreset = preset
component.collision.shape = SphereShape3D.new()
component.collision.shape.radius = max_distance
component.shake_finished.connect(_on_shake_finished.bind(component))
component.play_shake()
return component
func shake_emit_2d(position:Vector2,preset:ShakerPreset2D, max_distance:float, duration:float, distance_attenuation:float=0.5, speed:float=1.0, fade_in:float=0.25, fade_out:float=2.0) -> ShakerEmitter2D:
var component:ShakerEmitter2D = ShakerEmitter2D.new()
component.name = "ShakerEmitter2D"
add_child(component)
component.max_distance = max_distance
component.global_position = position
component.duration = duration
component.shake_speed = speed
component.fade_in = fade_in
component.fade_out = fade_out
component.shakerPreset = preset
component.collision.shape = CircleShape2D.new()
component.collision.shape.radius = max_distance
component.shake_finished.connect(_on_shake_finished.bind(component))
component.play_shake()
return component
func _on_shake_finished(shaker_component) -> void:
shaker_component.queue_free()