Sprites - AbstractPolygon/vcs-game-maker-absply GitHub Wiki

The Sprites tab defines a single, shared pool of animations — named sequences of drawn frames your game switches between at runtime. Either hardware player (Player 0 or Player 1) can be set to play any animation in the pool; there's no longer a separate tab per player.

Toolbar

​
XY toggle (Shift+') — shows/hides X,Y coordinate labels on the grid overlay. Only available while the pixel grid itself is on.

  • Quick color palette — only shown when either player's per-row sprite colors option is enabled (Options tab); saved with the project; pick a color here to paint with it directly in a frame's row-color strip. Shared with the Background tab's quick colors.

Animations

Click the + button in the bottom-right corner to add a new animation. Each card has:

  • Animation name — shown in the "Animation" dropdown wherever you select it in your blocks.
  • ID — a permanent number, separate from the name or list position.
  • Preview scale (1x/2x/4x) — stretches how wide the frame previews render on this tab only, to sanity-check what a NUSIZ-doubled/quadrupled player (the "set width/quantity" block, see below) would actually look like on real hardware. Doesn't touch the sprite's stored pixel data or change anything about the compiled game - purely a display aid.

​
Delete this animation (or select it and press Delete) — asks for confirmation. Only shown when there's more than one animation.

Click the chevron in the top-left corner to collapse an animation down to just its name row. Drag the strip at the top of a card to reorder animations in the list.

Frames

Each animation holds one or more frames, each 8 pixels wide:

  • Duration — how many game frames this pose is shown before advancing to the next one in the animation.
  • The pixel grid itself, resizable in height (up to 128 rows) via the Graphic Editor Toolbar's "Set height" tool. The screen only shows about 96 rows, so a taller sprite can't be seen in full.

​
Copy this frame's image / Paste copied image onto this frame — copies (or pastes) the pixel data and, if per-row sprite colors are on, the row colors too.

​
Copy this frame's row colors only / Paste copied row colors only — (only shown with per-row sprite colors enabled) copies just the color strip, leaving the pixel image alone.

​
Delete this frame (or select it and press Delete) — only shown when the animation has more than one frame.

Previewing an animation

The Play button on an animation card (left of the delete button, like on Title screen cards) previews that animation in the emulator without building or changing your ROM. The animation's name is shown on the first line of the Text Minikernel.

Click Add animation frame (the + at the end of the frame list) to add a new frame. If a frame in that animation is selected, the new frame is a copy of it (pixels, row colors and duration) placed right after it; with none selected it is a copy of the last frame, added at the end.

To rearrange frames, drag the grab strip across the top of a frame (above its Duration field) onto another frame. A bar on the left or right of the frame you drag over shows where it will land.

Import animation frames (the image-stack icon, top-right of an animation card) picks several image files at once and imports each as a new frame, one image per frame. Files with a number in their name (e.g. walk1.png, walk2.png) are ordered by that number; otherwise they're used in whatever order they were selected in. A "Replace existing frames" switch in the popover controls whether the imported frames land alongside the animation's current frames or replace them outright.

To import a whole sprite strip (one image containing every frame, plus an Aseprite-exported .json describing them) as one or more new animations at once, use Import from Aseprite in the Graphic Editor Toolbar above instead.

Resizing a frame's height

Changing one frame's height via the Graphic Editor Toolbar's "Set height" tool can optionally apply that same resize to every other frame in the same animation at once, keeping every pose in an animation the same height without resizing each one by hand.

Per-row sprite colors

If the Options tab's "Enable per-row Player 0/1 sprite colors" setting is turned on for either player, each frame gets its color strip alongside the pixel grid - one color per row, instead of a single flat sprite color. This is still two independent, per-hardware-player toggles (Player 0's costs missile0 + paddle input; Player 1's costs missile1) - turning on either one is enough to show the color-strip editing UI here, since the underlying frame data (and its rowColors) is shared between whichever player happens to be playing that animation. Use the quick color palette above the list to pick a color, then click a row's swatch to apply it, or click-and-drag across rows to paint several at once. Turning both options off doesn't delete any colors already picked - they're kept in case one is turned back on later. Clear resets both the pixels and the row colors back to their defaults.

Both players start on the first animation in the list (animation 0) when the game boots.

Using a player from your blocks

On the Actions tab, in the Sprites category, each block below is a single combined type with a Player 0/Player 1 dropdown (rather than a separate block per player) - it recolors to match whichever one is picked (red for Player 0, blue for Player 1):

  • Player [0/1] [X / Y / Color / Animation / Horizontal flip] / ...set to [n] / ...change by [n] — read, set, or change the player's position, color, current animation (by number - see "Animation [name]" below), or horizontal flip state. Setting Animation shows a loop checkbox (on by default) - see below.
  • Player [0/1] Height — reads the pixel height of whichever frame is currently showing (read-only). Always up to date automatically, even mid-animation.
  • Player [0/1] set Visibility to [n] — show or hide the player. The Player getter block can read Visibility back (true while shown).
  • Player [0/1] Frame — reads which frame of the current animation is showing right now (read-only).
  • Player [0/1] set animation to [name] / ...set animation to ID [n] — one-step shortcuts for the common case of setting a player's animation, without needing a separate "Animation [name]" block plugged into the generic setter above. The first picks an animation by name from a dropdown; the second takes any number (an expression, variable, or Data table lookup) as the animation's 0-based list position directly. Both have the same loop checkbox described below.
  • Player [0/1] current animation ID — reads which animation is currently playing, as its numeric list position (read-only; the reverse of "Animation [name]" below).
  • Animation [name] — selects one of the shared pool's animations by name and reports its number, for plugging into either player's "set Animation to" block above (or a variable, to switch animations at runtime based on game logic). It has no player to pick, since every sprite reads from the same pool; plugged into a Player 0 or Player 1 block it takes that player's color.
  • restart (checkbox on the two one-step "set animation" blocks, before loop) — on (the default) plays the new animation from its first frame; off carries on from the current position in the animation that was playing.
  • loop (checkbox, on every way of setting an animation above) — on (the default) replays the animation from the start every time it ends. Off, the animation plays once and freezes on its last frame instead of looping.
  • When Player [0/1] animation has finished, do [...] — runs its attached blocks once, the moment a non-looping animation (see "loop" above) reaches its last frame and stops. Never fires for a looping animation, which never actually stops.
  • Player [0/1] animation [Play/Pause] — pauses or resumes the current animation's frame advancement.
  • Player [0/1] set width/quantity to [option] — sets the standard batari Basic NUSIZ options: normal, 2-3 copies at various spacings, double-sized, or quad-sized.
  • Player [0/1] display ROM noise, offset [n] height [n] rows — makes the player display raw ROM bytes as its graphic instead of a drawn frame (the classic Yars' Revenge "neutral zone" effect). Leave offset unplugged for an automatically shimmering pattern. Keeps overriding the graphic every frame, even over a normal animation, until "stop ROM noise" is used. Doesn't affect width/quantity.
  • Player [0/1] stop ROM noise — switches back to showing normal animation frames.
  • Player [0/1] rainbow colors, offset [n] — gives the player a different color on every row, using the same "read raw ROM bytes" trick as ROM noise (works with either a normal frame or ROM noise as the graphic). This repurposes Missile 0/1's hardware circuitry, so that missile can no longer be used as a sprite while this is active - and for Player 0 specifically, paddle input becomes unavailable too.
  • Player [0/1] stop rainbow colors — stops the override and puts the player back to the colors it had before: each animation frame's declared colors when the Options tab's per-row sprite colors setting is on. Without that setting the player goes back to a plain white table. A player showing its default frame (no animation selected) with that setting on keeps the rainbow colors until an animation runs.
  • Fade Player [0/1] color to [color] over [n] frames / When Player [0/1] color has finished fading / Is Player [0/1] color fade active? — fades that player's live color toward a target color over roughly the given number of frames, same hue as the target, brightness automatically climbing or dropping toward it; also fades that player's paired missile for free, since on the standard kernel a missile always shares its player's color register on real hardware (with the DPC+ kernel the missile has a separate color, set with the Missile Color option, and the fade carries it along). With the DPC+ kernel a player can only fade to a fixed color (a color block, not a calculated value).

Player 0 and Player 1 can also Seek toward a target X/Y automatically (shared with Missile 0/1 and the Ball) and use collision detection blocks - see their categories on the Actions tab for details.

See the Actions tab's Sprites category for every Player 0/1 block: position/color/animation/visibility, width/quantity, ROM noise, rainbow colors, color fading, plus the Seek and collision blocks shared with Missile 0/1 and the Ball.