Studio

FolioTier 2

video

Play a fullscreen cutscene, or place a video clip on the stage.

Video covers two different jobs under one verb. Play throws a clip across the whole screen as a cutscene, taking over the frame the way a scene transition would, and is the right call for openings, memory sequences, or any moment where the video is the scene. Show instead treats a clip as a piece of stage furniture, sized and positioned like a sprite, so it can run in the corner of the shot while dialogue and other stage business continue around it, a phone screen, a television, a looping background element.

Loop changes what happens at the end of playback rather than during it: a looping play keeps the cutscene running until the scene itself moves on, while a looping show clip repeats indefinitely until you hide it. Leave loop off a show clip and it plays once, then holds on its last frame, which is a clean way to land on a freeze frame without adding extra logic.

A shown clip's position, size, and rotation are fixed at the moment you show it. There is no way to tween a clip across the stage; to move one, hide it and show it again at the new spot, which reads as a cut, not a slide.

Hide has to match what show set up: if the clip was given an as name, hide needs that name, not the underlying video reference, since the name is what identifies the clip on stage from that point on. This scene-local name also survives a rename of the underlying video asset, so refactoring your asset list won't orphan a hide call that's still using the old on-stage name.

Showing the same reference twice without an as name doesn't create a second clip, it just repositions the first one in place, so if you know up front you'll need two copies on screen at once, as needs to be there from the first show, not added later.

Parameters

ParameterKindRequiredDefaultNotes
actionidentifieryes-`play` starts a fullscreen cutscene; `show` places a clip on the stage; `hide` removes a placed clip.
referenceidentifieryes-On `play` and `show`, a video reference registered in the project's video assets; quoted form accepted for references with non-identifier characters. On `hide`, the clip's `as` name when its show gave it one, else the video reference.
asidentifierno-`show` only - names this clip on stage, which is the only way to place one video twice: two shows without a name are the same clip, so the second just repositions the first. `hide` then takes the name. The name is scene-local and never follows an asset rename.
atexpressionno-`show` only - static position, e.g. `at(50%, 40%)`. A clip's placement never animates; re-show the clip to reposition it in place.
sizeexpressionno-`show` only - static size, e.g. `size(30%)` or `size(200px, 100px)`. Omitted entirely, the clip fills the stage (contain fit, centered).
rotatenumberno-`show` only - static rotation in degrees around the anchor.
anchoridentifierno-`show` only - placement anchor preset; omitted = bottom-center like sprites.
loopbooleannofalseTrailing `loop` flag. On `play`: the cutscene runs until a scene transition. On `show`: the clip repeats until hidden or the scene ends; without it the clip plays once and holds its final frame.

Canonical example

Folio
video play denjiwork
video show card_reveal at(50%, 40%) size(30%) loop
video show card_reveal as second_screen at(80%, 40%) size(15%) loop
video hide second_screen
video hide card_reveal
Ren'Py
$ renpy.movie_cutscene("video/denjiwork.webm", loops=0)
show card_reveal at truecenter
show card_reveal as second_screen at right
hide second_screen
hide card_reveal

One keyword, two lanes. video play runs a fullscreen cutscene in the player's video overlay: a one-shot advances to the next step when it finishes; with loop it runs until a scene transition ends it. video show places a clip ON the stage - positioned, sized, and living beside sprites while dialogue keeps playing - and video hide removes it.

Notes

A stage clip's placement is static: at/size/rotate/anchor set where it mounts, and none of them animate. Re-showing a mounted clip updates its placement and loop flag in place without restarting playback - that is how a clip repositions. Motion clauses (from(), -> tracks, with <curve>, entrance(), z(), flip()) are parse errors on a video show line; there is no video move.

A stage clip is identified by its as name when it has one, and by its video asset when it does not. That single rule decides every case: two shows of one video with no name are one clip (the second repositions it), while as left and as right are two clips that place and hide independently. A named clip answers only to its name, so video hide with the plain reference cannot take it. Hiding something that is not on stage does nothing, which is fine - a show inside a when branch that did not run leaves its hide with nothing to do.

Without loop, a stage clip plays once and holds its final frame; with it, the clip repeats until hidden or the Folio scene ends (scene boundaries clear mounted clips, like sprites). Whenever playback re-derivation newly mounts a clip - a timeline click, scrub, save restore, or scene entry - it plays from the start. Stage clips are muted.

The Ren'Py $ renpy.movie_cutscene("…") Python call lowers to video play during import (loops=0 one-shot, loops=-1 looping). A Ren'Py image X = Movie(...) definition imports as a video-backed image: scene X becomes a persistent bg, while show X / hide X become video show / video hide stage clips - never sprites, so webms don't appear in the Sprite manager. Movie size= maps to the show's placement size; a mask= alpha companion is an honestly flagged loss.

See also

  • bg - for video-backed scene backgrounds (the Movie(...) displayable pattern); use bg when the video is a layered background, video show when it sits over the stage, video play when it's a fullscreen cutscene
  • sprite - the placement vocabulary a stage clip borrows (statically) from the sprite move grammar
  • sound - play/stop grammar for SFX