Skip to the guide
Pixx Suite

Pixx Suite · Advanced

Pixx asset files (.pxasset) — Advanced

Inside a .pxasset: the zip layout, the manifest, all ten kinds and the shared meta for hitboxes, loops and dialogue, for people scripting their own tools.

#What you'll learn

  • How a .pxasset file is put together and how to read one with any zip tool.
  • The manifest fields every asset has, and the extra fields for each of the ten kinds.
  • The shared metadata apps use to pass hitboxes, pivots, shadows, loops and dialogue along.
  • How to build a valid .pxasset yourself, so your own scripts can feed the Pixx apps.

#Before you start

  • You know how hand-offs work from Send to App and Working across apps — Intermediate.
  • You're comfortable with zip files, PNG images and JSON.
  • To get a sample, use Send to App → Download .pxasset in any app, then rename a copy to .zip and open it.

#The file at a glance

A .pxasset is an ordinary zip file. It always contains manifest.json, plus the PNG, WAV or JSON files its kind needs. Pictures are PNG; sounds are 16-bit PCM WAV; all coordinates are pixels from the top-left.

Every manifest has these fields:

FieldWhat it holds
pixxFormat version, currently 1
kindOne of the ten kinds below
nameThe asset's name
sourceThe app that made it, such as pixxivi
createdWhen it was made (milliseconds since 1970)
w, hIts size in pixels
metaFree-form extra data (see the meta section below)
paletteOptional, on any kind: a name and up to 256 colors as lowercase #rrggbb

#The ten kinds

KindFiles in the zipManifest fields
frames (animation)frames/0000.png, frames/0001.png…frames: a list of file + delay (milliseconds, at least 10)
imageimage.pngimage: the file name
sheet (sprite sheet)sheet.pngsheet: file, cols, rows, fw, fh (frame size), count, delays (per frame, or empty)
palette(none)palette: name + colors (required for this kind)
soundsound.wavsound: file, rate, duration (seconds), peaks (up to 128 values from 0 to 1, for waveform pictures)
dialoguedialogue.json + dialogue/… (portrait PNGs, voice WAVs)dialogue: file, images and sounds (each a list of path + file; sounds also rate + duration)
pack (game pack)pack.json + members/0000.pxasset…pack: file + members (each file, kind, name). Members are whole .pxasset files; packs nest one level deep at most
fontfont.json + atlas.pngfont: file, atlas, glyphs (how many)
ui-frame (nine-slice)frame.json + frame.pngframe: file + image
tilemap (level)map.json + tileset.pngtilemap: file + tileset

#font.json

FieldMeaning
name, cell (w, h)Font name and its cell size
capHeight, baseline, lineHeightVertical metrics in pixels
glyphsOne entry per character code: x, y, w, h (its box in atlas.png), xoff, yoff (yoff = glyph top from the top of the line), adv (advance)
kerningPairs written as "codeA,codeB" with a pixel adjustment

atlas.png holds white glyphs on a clear background, so apps can tint them.

#frame.json (UI frame)

FieldMeaning
name, w, hName and image size (at least 3 × 3)
slicel, t, r, b: how far in from each edge the corners end. They must leave a centre
center, edgesstretch or tile
paddingl, t, r, b: where content (text) sits inside; defaults to the slice

#map.json (tilemap)

FieldMeaning
name, tileW, tileH, cols, rowsName, tile size and map size in tiles
tilesetcolumns and count: the grid of tileset.png
layersEach has name, type and data
objectsEach has id, type, name, x, y, w, h (pixels) and props
metaOptional extras such as source (the app) and background (#rrggbb)

Layer data is one number per cell, row by row (cols × rows numbers):

Layer typeCell values
tiles0 = empty, 1 = the first tile of the tileset, 2 = the second…
collision0 or 1
height0 to 15

Layers may also carry visible (true unless set to false) and opacity (0 to 1). Apps that don't use them ignore them.

#Shared meta

These ride in the manifest's meta. An app that doesn't use one keeps it untouched, so it survives a trip through other apps.

KeyOnUsed byWhat it holds
gameplayframes, sheetPixxeta, Pixxado, Pixxula, Pixxiziversion 1 and frames: one entry per frame with boxes (each id, type = hit, hurt, collide or trigger, x, y, w, h, optional data), pivot (x, y), sockets (name, x, y, optional angle), events (name, optional data) and an optional shadow (layer). Optional shadowLayers lists id + label
loopsoundPixxune, Pixxibu, Pixxara, Pixxizistart, end and optional intro, in seconds
bpmsoundmusic appsTempo, a number
stemssoundmusic appsA list of name (+ optional file)
creditsanyPixxava, PixxaraWho made the base art; travels into exports
flowanyFlowrun, node and parents when the asset was sent as a Flow result

Gameplay coordinates are pixels inside the frame, from its top-left corner.

#The dialogue script

dialogue.json (made by Pixxara, exported by Pixxizi) holds:

FieldMeaning
version, startFormat version (1) and the id of the first line
variablesStarting values, name → value
speakersEach id, name, optional portrait (a path inside the dialogue folder), rig, blip (sound, optional pitch and rate)
nodesEach id, optional speaker, text, expression, choices (text, next, optional if), next, set, cues (type = sound, music or expression, ref, optional at)
localesOptional translations: language → node id → text

#How-tos

#How to look inside a .pxasset

  1. In any app, use Send to App → Download .pxasset.
  2. Copy the file and rename the copy to end in .zip.
  3. Open it with any zip tool. Start with manifest.json; it names every other file.

#How to build a .pxasset with your own script

  1. Write your PNGs (or WAVs) at the paths in the table above. For an animation that's frames/0000.png, frames/0001.png and so on.
  2. Write manifest.json with pixx set to 1, the kind, a name, your tool's name as source, w, h, an empty meta and the kind's own field (for example frames with each file and delay).
  3. Zip manifest.json and the files together, with the paths exactly as written in the manifest, and give the zip a .pxasset name.
  4. Open it in a Pixx app with Library → Open a .pxasset file… or by dropping it onto the app.

#How to add hitboxes from your own tool

  1. Start from a frames or sheet asset.
  2. In its manifest meta, add gameplay with version 1 and one entry in frames per animation frame, in order.
  3. Give each entry its boxes, pivot and any sockets or events, in pixels from the frame's top-left.
  4. Open it in Pixxeta to check the boxes visually, then send it on to Pixxula or Pixxizi; the data travels with the frames.

#How to build a level from your own map editor

  1. Export your tile images into one tileset.png, in a grid of columns tiles across.
  2. Write map.json: tile size, map size, the tileset grid, and a tiles layer whose cells are 0 for empty or the tile number plus one.
  3. Add a collision layer (0 or 1 per cell) if your game needs it, and objects in pixels.
  4. Zip it as a tilemap asset and open it in Pixxori to edit, or in Pixxizi to export straight to an engine.

#How to check why an asset is refused

  1. Open the manifest and compare it with the tables above.
  2. Common causes: an unknown kind, a file listed in the manifest but missing from the zip, a tilemap layer with the wrong number of cells or an out-of-range value, a UI frame whose slices leave no centre, or a pack nested more than one level deep.
  3. The app's message usually names the field, such as "tilemap layer … needs N cells".

#Workflows

#Generated art into the suite

  1. A script renders frames from your own generator and writes a frames .pxasset.
  2. Open it in Pixxivi with Library → Open a .pxasset file… to touch it up, then send it on as usual.

#Round-trip with an external engine tool

  1. Send a sheet with hitboxes to Pixxizi and export the Generic target: each sprite comes with a JSON file of frames, animations, pivots, hitboxes, sockets and events.
  2. Your own tool reads that JSON, or the gameplay meta directly from the .pxasset.

#Tips and shortcuts

  • Keep name short and readable; apps show it in the Library and use it for exported file names.
  • delay values under 10 ms are raised to 10.
  • Palettes keep at most 256 colours.
  • Unknown keys inside meta are kept as they are, so you can add your own data under your own key.
  • Library item ids look like lib-sheet-pixxula-…: kind, then the app that made it.

#Troubleshooting

  • "not a Pixx asset". The zip has no manifest.json at its top level, or its kind isn't one of the ten.
  • "the asset is missing …". A file named in the manifest isn't in the zip, or its path differs (paths are case-sensitive).
  • The animation plays at the wrong speed. Check each frame's delay (milliseconds) or the sheet's delays.
  • Hitboxes appear on the wrong frames. gameplay.frames must have one entry per frame, in frame order.
  • A tilemap shows the wrong tiles. Tile cells count from 1; 0 is empty. Check tileset.columns against your image width.