Drive parameters and images over time and bake the frames into a sprite sheet. All timing is frame-based ("one swing per 8 frames"); seconds appear only as converted hints.
The easiest way: move a whole image
Select any node with an image output and press "🎞️ Animate this whole image" in the inspector.
- A Sprite Motion node (
sprite_motion) is wired automatically; pick the motion (move / ping-pong / rotate / bounce / wobble / blink / float / random), amount (px / deg) and period (frames) right there - Wiring by hand is just
image → sprite_motion → animation_render
Animating a parameter: the animation button
Press the 🎞️ button on any numeric parameter row and that parameter moves.
- A
motionnode is auto-created and wired behind the scenes (visible in the graph) - The inline editor below the parameter adjusts motion / amount / period / easing
- "Detach as node" graduates it into a regular node for advanced wiring
Previews and sheet baking
- ▶ buttons: whenever something time-dependent is upstream, play a provisional preview in the inspector, on the node thumbnail, or in the viewer (captured on demand only; concurrent node playback is configurable, default 3)
- "Convert to spritesheet": one click wires an
animation_render. Configurations with unstable canvas sizes are warned about beforehand, and errors offer a fix action that sets upstream renders to FixedCanvas
Project animation defaults
The 🎬 anim defaults (frames × FPS) in the canvas bar are the project-wide baseline. Frame counts and FPS left at 0 follow the defaults automatically and are stored in the .ppl, so the same project renders the same sheets anywhere.
Advanced: combining motions and staggering
motionoutputs a plain Float — combine with math nodes (wobble + random, ...)remap/ease_in_outremain general-purpose Float utilitiesstaggerhands out per-element frame shifts; distribute them with list_map for grass swaying in sequence or follow-through on partstime_sourcestill exposes raw frame numbers for expert use
Motion vs keyframes
| Motion (rules) | Keyframes (poses) | |
|---|---|---|
| Strength | periodic, mechanical movement | one-off acting (wind-up, follow-through) |
| Editing | change one number | re-pose the keys |
| Nodes | motion / sprite_motion |
keyframe_clip + dedicated editor |
Neither replaces the other. Keyframe clips are also frame-based and follow the
project default FPS; see the keyframe_clip node manual for details.
Common pitfalls
- Only one frame moves: nothing is driving the parameter — use the 🎞️ button
- A hitch at the loop seam: legacy symptom; motion nodes handle loop endpoints automatically. Hand-written expressions should use frame/total for the phase
- Per-frame move does not loop: the value keeps accumulating; use looping motions or sprite_motion's Wrap
- Sheet layout looks wrong: check
columns; 0 means auto layout
The bundled sample (workflows/model_chest_animation_c7.ppl) drives the chest
lid with motion (ping-pong) → model transform X rotation, and
animation_render packs six frames into a sprite sheet.
