Studio

FolioTier 2

@shake

Jitter the whole frame, the backdrop, or a single sprite to punctuate impact, surprise, or shock.

Use @shake to punch up a moment of impact, a jump scare, an explosion, a slammed door, anything that needs a physical jolt to land. Fired against the whole frame it reads as the world itself getting rattled; targeted at a single sprite it reads as that character flinching or taking a hit, which is the gentler, more localized choice when you don't want to shake the backdrop or UI along with them.

Reach for it right before or alongside the line of dialogue or the sprite change it's reacting to, so the jitter and the story beat land together.

Keep amount modest for anything narrative-adjacent, since values near the top of the range read as comedic or glitchy rather than dramatic. Pair a short duration with wait true when the shake itself is the beat you want the player to sit through; use wait false when you're layering @shake under another effect, like a flash or a sprite swap, and don't want it to hold up the script. Targeting a sprite tag that isn't currently shown is a silent no-op, so make sure the sprite is already on screen first.

Demo

@shake

Hello.

Click play to fire @shake against a placeholder stage. The textbox stays still - only the backdrop layer animates, mirroring how the live player isolates effects to the stage wrapper.

Parameters

ParameterKindRequiredDefaultNotes
durationnumberno0.40.05-2 seconds. Default 0.4.
amountnumberno81-32 pixels. Default 8.
targetstringno""Optional sprite tag; empty targets the whole frame.
waitbooleannotrueBlock for the effect's duration when true; false fires and continues so effects can overlap.

Canonical example

Folio
sprite show emma-shocked
@shake
say "Emma": "What was that?"
Ren'Py
show emma shocked
with shake
e "What was that?"

@shake is its own line - it doesn't take a with clause and doesn't appear inside scene / show / hide. The effect plays after the preceding stage operations have committed; the next line resumes the script as soon as the effect's duration elapses.

Notes

The bare form @shake uses the documented defaults. Override either parameter explicitly when the moment needs more or less:

@shake(0.2, amount=4)

Both parameters are optional; pass one without the other to keep the other at its default. Out-of-range values reject during parse, not runtime - the read-only migration report flags them inline on the affected scene, and the studio editor flags them against the documented range.

@shake differs from @punch in shape, not just orientation: @shake is a sustained jitter that decays across the duration; @punch is a single horizontal recoil that returns to rest. Reach for @shake when the moment needs vibration (an earthquake, a slammed door), @punch when it needs recoil (a slap, a gunshot).

See also

  • @punch - horizontal recoil, single-impulse
  • @flash - full-stage color punctuation
  • transition - Ren'Py-aligned bare transitions; effects are a separate verb space