Transform Effects
Transform effects are composed from GFFEffectCommon plus a GFFTarget and a GFFTweener.
Registered shortcuts include shake_position / shake, punch_scale / punch, and the curved / rotation variants.
Position
var effect = GFFEffectCommon.new()
effect.target = GFFPositionTarget.new()
effect.target.mode = GFFPositionTarget.Mode.BY_AMOUNT
effect.target.target_value = Vector3(0.0, -70.0, 0.0)
effect.tweener = GFFElasticTweener.new()
effect.duration = 0.45
GameFeelFlow.play(effect, $Sprite2D)
Modes: TO_TARGET, BY_AMOUNT, FROM_TARGET.
Scale
var effect = GFFEffectCommon.new()
effect.target = GFFScaleTarget.new()
effect.target.mode = GFFScaleTarget.Mode.TO_TARGET
effect.target.target_value = Vector3(1.5, 1.5, 1.0)
effect.tweener = GFFLinearTweener.new()
effect.duration = 0.3
Punch scale
Built-in punch_scale (and combo helpers like _create_punch_scale) use relative BY_AMOUNT plus elastic return to origin — e.g. Vector2(0.2, 0.2) means “pop +20% then settle”, not “tween absolute scale to 0.2”.
GameFeelFlow.play("punch_scale", $Sprite2D, {"duration": 0.35})
# Default registered punch is BY_AMOUNT ≈ +25% with TO_ORIGIN elastic.
Explicit build:
var effect = GFFEffectCommon.new()
var scale_target := GFFScaleTarget.new()
scale_target.mode = GFFScaleTarget.Mode.BY_AMOUNT
scale_target.target_value = Vector3(0.35, 0.35, 0.0)
effect.target = scale_target
var elastic := GFFElasticTweener.new()
elastic.punch_mode = GFFElasticTweener.PunchMode.TO_ORIGIN
effect.tweener = elastic
effect.duration = 0.4
GameFeelFlow.play(effect, $Sprite2D)
Rotation
var effect = GFFEffectCommon.new()
effect.target = GFFRotationTarget.new()
effect.target.mode = GFFRotationTarget.Mode.BY_AMOUNT
effect.target.target_value = 25.0 # degrees when use_degrees = true
effect.target.use_degrees = true
effect.tweener = GFFElasticTweener.new()
effect.duration = 0.4
Shake
GFFShakeTweener.amplitude is in local position units (pixels for typical Node2D). Values like 0.3 are nearly invisible in 2D UI/sprites — use something like 8–20 for readable juice.
var effect = GFFEffectCommon.new()
effect.target = GFFPositionTarget.new()
effect.tweener = GFFShakeTweener.new()
effect.tweener.amplitude = 12.0
effect.duration = 0.3
GameFeelFlow.play(effect, $Sprite2D)
