Studio

FolioTier 1

sprite

Show a project sprite in a scene, then set its frame, move it, switch its idle motion, or hide it - every sprite is present (hidden) until shown.

Sprite is the everyday actor verb: everything a character or standing image does on stage - appearing, changing expression, moving, resizing, turning, switching idle behavior, or leaving - runs through one of its five events (show, hide, set, move, motion), plus layer for paint order. The slug always points back to a definition in the Sprite Manager, so every line for a given character stays in sync if that sprite gets renamed or its frames get reworked.

Reach for it any time a scene needs a character on screen. A bare show puts the sprite up using its Sprite Manager defaults for frame, position, size, and flip; from there, set changes the expression, move repositions or animates it, motion swaps its resting fidget, and layer decides who paints in front of whom. Hide takes it back off stage, ready to be shown again later in whatever state you last left it.

Every sprite starts hidden, even before its first show line - so if a character seems to be missing from a scene, check for a show rather than assuming the sprite is broken. Set only ever touches the frame; it never moves, resizes, or reveals the sprite, so pairing it with a show or move is normal and expected.

Show and hide accept a plain fade transition, while move's with clause controls the position curve instead (teleport, slide, bounce, and so on) - the two withs aren't interchangeable, and set takes no with at all. An animated size or rotate track on a move rides that same position clock by default, but give it its own inner timing (size(-> 40% with decel 0.3)) when you want the resize or turn to run on a different curve or duration than the move itself.

Flip, layer, and motion are all sticky: a flip set on one show carries through later sets and moves until you flip it back or reset to default, a layer change persists until the next sprite layer line, and a motion profile keeps looping until the next sprite motion call. None of the three reset just because you hide and re-show the sprite.

Parameters

ParameterKindRequiredDefaultNotes
slugidentifieryes-The sprite's name and identity - used verbatim as the Folio token (`sprite show vee`). It points at a sprite defined in the project's **Sprite Manager**; every `show` / `hide` / `set` / `move` reuses the same name. Names are id-ruled (no spaces, start with a letter or underscore) and unique across the project. Renaming a sprite in the Sprite Manager rewrites every line that referenced it, so references never break.
frameidentifierno-A named frame on the sprite's definition - each frame pairs a name (`happy`, `door-open`) with an image. On `set` it is required (`sprite set vee frame surprised`) and swaps to that frame's image without changing identity, position, or visibility; a sprite shown without a prior `set` uses the definition's default frame. Frames are authored in the Sprite Manager, so a `set` can never name an image the sprite doesn't have.
layernumberno-The paint-order verb - `sprite layer vee 2` - re-layers the sprite from that point on: higher numbers paint in front of lower, and `sprite layer vee auto` returns it to automatic order (equal layers paint last-shown-in-front). It is its own event (like `motion`), takes no other clause, and is the only way to change a sprite's layer mid-scene - paint order, never movement. A sprite's starting layer is its Sprite-Manager default. A Ren'Py `show x zorder N` imports as a `sprite layer` line emitted just before the show, so the sprite is already on the right layer while any entrance plays. The legacy `z(N)` clause on `show` / `set` / `move` still parses and plays but is no longer written by any editor.
flipidentifierno-Optional horizontal mirror on `show` / `set` - `flip(x)` mirrors the art left-to-right (a character facing the other way), `flip(none)` un-mirrors it, `flip(default)` re-follows the sprite's default flip from the Sprite Manager. It sits after `z(...)` and before `entrance(...)`. Omit it to keep whatever flip the sprite already has - so `sprite show vee frame sad` after a flipped show stays flipped, and a fresh show follows the sprite's default flip from the Sprite Manager. A flip never moves the sprite (its anchor point stays put); `hide` and `move` take no flip. `flip(y)` is reserved for a later vertical flip. The Sprite Action inspector's Flip control (No change / Default / Original / Flipped) writes it; on its own it spells `sprite set vee frame keep flip(x)`.
atidentifierno-Optional position on `move` - `at(X, Y)` where X,Y are percent (`50%`) or pixel (`200px`) lengths marking where the anchor point lands. `move` repositions the sprite; a sprite shown without a `move` uses its default position from the Sprite Manager (then bottom-center). The stage edit box writes this when you drag the sprite; it emits percent so the placement survives a viewport resize.
sizeidentifierno-Optional resize on `move` - `size(W)` or `size(W, H)` where W,H are percent (`40%`) or pixel (`200px`) lengths (H may be `auto` to keep the aspect ratio). A bare `size(40%)` snaps the width instantly before the move; an arrow animates it - `size(-> 40%)` eases from the sprite's current size, `size(10% -> 40%)` from an explicit start. An animated resize rides the position's `with` clock unless it carries its own inner timing (`size(-> 40% with decel 0.3)`). Omit to keep the current size (the Sprite-Manager default until a move changes it). The Move inspector's Resize card writes this; its Motion row sets the track's own curve + duration (Instant snaps).
rotateidentifierno-Optional rotation on `move` - `rotate(D)` in degrees, pivoting around the sprite's `anchor` (so `bottom-center` leans a character around their feet, `center` spins a logo in place). A bare `rotate(15)` snaps; an arrow animates it - `rotate(-> 15)` turns from the current angle, `rotate(0 -> 720)` spins twice from 0. An animated turn rides the position's `with` clock unless it carries its own inner timing (`rotate(-> 720 with elastic 1.2)`). Go past 360 for full spins; negatives turn the other way (clamped to ten turns each way). Omit to keep the current angle. The Move inspector's Rotation card writes this; its Motion row sets the track's own curve + duration (Instant snaps).
anchoridentifierno-Optional anchor point on `move` - which point of the sprite box the `at(X, Y)` position pins to. One of `top-left`, `top-center`, `top-right`, `center-left`, `center`, `center-right`, `bottom-left`, `bottom-center`, `bottom-right`. The default `bottom-center` is implicit (the clause is omitted). Only a `move` carries an anchor: a `show` never positions anything, so a sprite shown without a `move` anchors via its Sprite Manager default (then `bottom-center`). A 3x3 picker in the sprite inspector reads + sets it; the stage drag box no longer materializes the default.
motionidentifierno-The idle-motion verb - `sprite motion vee heavy` - switches the resting breathing + head-sway a sprite performs while standing still. The profile token is one of `none` (stops it), `relaxed`, `quick`, `heavy`, or `exhausted`; depth, rate, and sway follow that profile's preset. It is its own event (like `move`), takes no other clause, and lasts until the next `sprite motion` on the same sprite. A sprite's starting idle motion is its Sprite-Manager default; `sprite motion` overrides it mid-scene.
withstringno-Optional transition tail. On `show` / `hide` it is `with fade` - a per-sprite alpha fade (fades in on `show`, out on `hide`); `with fade(0.5)` sets the seconds, bare `with fade` uses the default. On `move` it is `with <curve>(<duration>)` - the POSITION track's motion: `teleport` (the default - instant snap), `linear`, `slide` (smooth ease-in-out), `accel`, `decel`, `overshoot` (sails past and settles), `bounce`, or `elastic`, with the duration in seconds (e.g. `with slide(0.5)`; bare `with slide` uses the default). Omitting the tail on `move` snaps the position instantly, exactly as before. An animated `size(-> ..)` or `rotate(-> ..)` track rides this clock when it has no timing of its own; a track with an inner timing (`size(-> 40% with decel 0.3)`) runs on its own curve + duration - so position, size, and rotation can each animate independently. When the position snaps but a track animates, only the inner timings appear (no shared tail; a size/rotate-only animated move still emits one, donated by the track); a held instant-position move keeps its hold as `with teleport(hold=true)`. `set` takes no transition.

Canonical example

Folio
sprite set vee frame happy
sprite move vee at(50%, 100%)
sprite motion vee heavy
sprite layer vee 2
sprite show vee with fade
sprite set vee frame surprised
sprite move vee at(80%, 100%) size(-> 60%) rotate(-> 8) with slide(0.5)
sprite hide vee with fade
sprite show vee
Ren'Py
show vee happy at center with dissolve
show vee surprised zorder 2
hide vee with dissolve
show vee

A sprite is a project object - you define it once in the Sprite Manager (its name, its named frames, its default position), and from then on it is present in every scene, hidden by default. You don't add it to a scene; you show it when you want it on stage and hide it when you don't. The definition is the class; show / hide / set / move are the methods that act on it:

  • sprite show <slug> reveals the sprite on stage - at its default frame and default position (both set in the Sprite Manager), optionally with a with fade transition. A first show materializes the sprite, and the line can carry the full staging in one go: sprite show vee frame happy z(10) at(50%, 100%) sets the pose, stacking, and position together. A sprite that hasn't been shown in the scene is simply invisible.
  • sprite hide <slug> takes it off stage. It stays defined and keeps its frame and position, so a later show brings it right back.
  • sprite set <slug> frame <name> switches to one of the definition's named frames. Same object, new look - position and visibility carry over. You can set a sprite before it's shown to pre-pick its look.
  • sprite move <slug> at(…) repositions the sprite - position only; a move never resizes it (the sprite's size comes from its Sprite Manager default until a size(…) clause on a move changes it). By default the move is an instant snap; add with <curve>(<duration>) to animate the sprite gliding to the new spot (see Animated move below).

Notes

The name is the identity. sprite show vee references the sprite named vee in the Sprite Manager, and that same name threads through every later line. Because the name is the reference, renaming a sprite in the Sprite Manager is a project-wide rewrite - every show/hide/set/move that mentioned the old name is updated in the same edit, so a rename never orphans a line. In Studio you pick the name from a list; when hand-authoring, use a short id-ruled slug like vee (no spaces).

Frames are the sprite's looks. Each frame is a name plus an image, authored on the definition - so set chooses an existing frame rather than naming a loose image. A sprite shown without a set uses the definition's default frame. A frame with no image yet renders as a faint, translucent yellow placeholder box at the sprite's bounds, so you can block out a scene before the art exists and fill it in later from the Sprite Manager - the change propagates to every scene that uses the sprite.

Frames may be video-backed. Ren'Py image X = Movie(...) plus show X imports as a normal persistent sprite whose frame plays the video. A Movie sprite defaults to screen size (matching Ren'Py's Movie displayable), retains explicit positioning/transforms, follows the Movie loop policy, and remains mounted across dialogue until sprite hide, a clearing imported scene, or the Folio scene boundary. Use video for a foreground cutscene instead.

Always present, hidden by default. Every project sprite exists in every scene from the first frame; it just isn't painted until you show it. There's no "add" step and nothing to clean up - hide is the opposite of show, and a sprite you never show never appears. Sprites are scene-scoped: each scene starts with all of them hidden, so a show in one scene doesn't carry into the next. (There is no cross-scene "global" sprite; a narrator or viewpoint character is shown in each scene that needs it.)

with fade (and its sibling with pixelate) is the sprite's own transition - a per-sprite blend, not a whole-frame one. It belongs to the Sprite Action card, so all three verbs take it: on show it plays in, on hide it plays out, and on set it plays across, crossfading the old frame into the new one (sprite set vee frame happy with fade(0.5)). A flip-only set takes it too (sprite set vee frame keep flip(x) with fade). Direction is derived from where the sprite already is; you only pick the kind and the length. A set that changes nothing has nothing to blend, so the tail drops on save.

flip(x) mirrors the art left-to-right on a show or a set - the "face each other" idiom (Ren'Py xzoom -1). It is sticky: a later show or set without a flip clause keeps whatever flip the sprite has, flip(none) un-mirrors it, and a fresh show follows the sprite's default flip from the Sprite Manager. A flip never moves the sprite - its anchor point stays where it was. On its own, without a frame change, it spells sprite set vee frame keep flip(x) (keep is the bare no-change sentinel). hide and move take no flip; a vertical flip(y) is reserved for later. In Studio the Sprite Action inspector's Flip control (No change / Default / Original / Flipped) writes it.

Animated move. sprite move also takes a with <curve>(<duration>) tail that animates the reposition instead of snapping. The curves are:

  • teleport - instant snap (the default when you omit the tail).
  • linear - constant speed.
  • slide - smooth ease-in-out; the natural "glide over there."
  • accel - starts slow, speeds up (ease-in).
  • decel - starts fast, eases to a stop (ease-out).
  • overshoot - sails slightly past the target and settles back (back.out). This was renamed from warp; warp still works as a parse alias, so older with warp(...) scripts keep importing and playing unchanged.
  • bounce - lands and bounces a couple of times to rest, like a dropped ball (bounce.out).
  • elastic - springs past and wobbles into place (elastic.out). Also accepted under the alias spring.

duration is in seconds (default 0.5, range 0.05-3), e.g. sprite move vee at(80%, 100%) with slide(0.5). The move still updates the sprite's stored position - only how it gets there changes - so scrubbing the timeline lands it in the right spot. In Studio, pick the curve and duration from the move event's inspector (placement is still set by dragging on stage). Each scene's first reference re-stages the sprite, so a move animates from wherever the sprite currently sits.

Hold until the move finishes. By default an animated move is fire-and-continue: it starts the glide and the next line plays right away, so a sprite can drift across the stage while a character speaks. Add hold=true inside the motion call - sprite move vee at(80%, 100%) with slide(0.5, hold=true) - to make playback wait on that move until its tween finishes, then continue on its own (like a timed pause). That is what lets a run of back-to-back moves play one after another instead of collapsing to the final position in a single frame. In Studio, the move event's inspector has a Hold here until the move finishes checkbox, shown for animated curves only. hold is ignored on a teleport move - an instant snap has nothing to wait for.

For richer per-sprite animation (pop, tint, rotate) reach for the @sprite-opacity effect family, which targets a sprite by name. To reposition a sprite, use the sprite move verb - it changes the sprite's stored position.

A background change (bg) does not touch sprites - it only swaps the backdrop, so sprites stay put across a bg.

The old sprite add and sprite delete verbs were removed on 2026-06-10. add folded into sprite show - a first show materializes the sprite and carries frame / z / placement in the same line, which is also what a Ren'Py import now emits - and hide covers everything delete did (the object is never destroyed, only hidden). The grammar no longer parses either verb.

See also

  • bg - swap the background (leaves sprites in place)
  • @sprite-opacity - per-sprite opacity tween by name
  • characters - declaring the cast a sprite represents