GameLib API reference

All exports. Units: px screen pixels, cell grid units (one cell is always 16 px), time in seconds. Every dot on screen is the same size; assets are never scaled.

Running

run(game, {canvas, seed?, onError?}) → Player

Starts a game on a 256x256 canvas. seed defaults to 1. onError receives errors thrown by the game.

Player methodEffect
setInput(key, down, source?)Press or release a button. source separates inputs, e.g. 'pad' and 'keyboard'.
release()Release all buttons.
pause(paused = true)Stop or resume updates. Drawing continues; paused time is not caught up.
inspect()Copy of the current state (or game.inspect(state)).
restart()Re-run init with the same seed.
stop()Stop updates and input. Call before removing the canvas.

createSimulation(game, {seed?}) → Simulation

Runs a game without a canvas. Methods: step() advances one tick and returns the state, state(), world(), inspect(), restart(), setInput(key, down, source?), release(), input.

gameControls(game) → {directions, buttons}

On-screen controls declared by game.controls, with defaults filled in.

version

Engine version string.

Game

input

MethodReturns
down(key)true while held.
pressed(key)true on the first tick of a press. Taps between ticks count once.
repeat(key, delay = 0.3, interval = 0.1)true on press, then every interval after delay.
vector(){x, y} from the direction buttons, diagonal normalized to length 1.

Keys: up down left right a b x y.

world

time (seconds), tick, seed. Always: caps all false, me {id: null, peer: null}, peers [], events [], docs {}, isHost true.

Drawing

g (Gfx, passed to draw)

MemberEffect
width, height256
viewThe game view.
clear(color = 'paper')Fill the screen.
rect(x, y, w, h, color = 'ink')Filled rectangle, px.
sprite(name, x, y, {flip?})Draw an asset at 1x with its top-left at x, y. There is no scaling: every dot on screen is the same size.
hero(x, y, {pose?, direction?, time?, flip?})Draw the hero for the current view. pose idle/walk/jump/happy/hurt; direction down-left/down-right/up-left/up-right (side uses only left/right); time animates walking and idle breathing; pass world.time always.
text(text, x, y, color = 'ink')8x8 pixel font.
measureText(text) → numberText width in px.
project(x, y, height?)Legacy pixel projection. Prefer worldToScreen.

createGraphics(context, {view?}) → Gfx

Gfx for your own 2D canvas context.

palette, sprites, assetCatalog

palette: color name to hex. sprites: asset name to rows of pixel characters. assetCatalog: {id, label, group, size, height?, view?, alternate?} for every asset.

Worlds

defineWorld(options) → scene

OptionDefaultMeaning
view'front'Asset style: 'front' or 'side'.
projectionviewHow grid coordinates map to the screen.
columns, rowsWorld size in cells.
origin{x: 8, y: 8}Screen position of cell (0, 0).
floortrue (false for side)Draw floor tiles.
objects[]Static PlacedObjects.

The scene is frozen plain data. Keep moving things in game state and pass them to drawWorld.

PlacedObject: {sprite, x, y, z?, solid?, layer?, flip?, footLift?, pose?, direction?}. x, y are cells at the object's feet. sprite: 'hero' draws the hero. solid blocks movement. layer orders drawing. footLift raises the drawing in px without changing physics.

drawWorld(g, scene, {objects?, time?, camera?})

Draws floor, static objects and the given objects. Order: layer, then y (front); side draws in the given order. camera {x, y} is in px.

drawPlatforms(g, scene, platforms, {camera?})

Draws platforms for side-scrolling worlds, using the same data as movePlatformer.

Coordinates

FunctionReturns
worldToScreen(scene, x, y, z = 0)Cell to px.
screenToWorld(scene, x, y)px on the ground to cell.
snapToGrid(x, y)Nearest integer cell.
insideWorld(scene, x, y)Inside the world bounds.
blockedAt(scene, x, y, radius = 0.25)Overlaps a solid object.
worldMovement(scene, vector, speed)Screen direction to a world velocity in cells/s.
spriteAnchor(name)The feet point of an asset in px.

Maps

defineMap(rows, {legend?, ...worldOptions}) → map

Parses an ASCII map into a scene with tiles and start.

CharKindAsset
#solid wallblock
@start
*collectiblecoin
>exitdoor
!hazardspikes
$cratecrate
oswitchswitch
kkeykey
Ddoordoor-closed
~solidwater
. or spaceempty

legend: {T: {sprite: 'tree', solid: true}} adds or overrides characters. Kinds are labels only; picking up keys or opening doors is game logic. Unknown characters and uneven rows throw.

mapTiles(map, charOrKind) → Tile[]

Tiles by character or kind: {symbol, kind, id, x, y, sprite, ...}.

Movement

moveOnGrid(scene, state, vector, dt, {speed = 4, space = 'screen'})

Cell-to-cell movement. Pass {x, y, target}; returns {x, y, target, moving}. Releasing input finishes the current cell. Turns happen at cell centers. Blocked by edges and solid objects. Keep target in state.

moveInWorld(scene, state, vector, dt, {speed = 4, radius = 0.28, space = 'screen'})

Free movement that slides along walls. Returns {x, y, moving, blocked, direction}. Large moves are split so walls are not skipped.

movePlatformer(state, {x, jump, hold}, platforms, dt, options)

Platform physics, tuned by default. Pass x: input.vector().x, jump: input.pressed('a'), hold: input.down('a'). Releasing hold while rising cuts the jump short; omit hold for always-full jumps.

state: {x, y} at the feet center, plus the returned vx, vy, grounded, coyote, buffer, direction. Returns these and moving, hitWall, hitCeiling, jumped, landed. Keep all of them in state.

Platforms: {x, y, w, h = 1, oneWay?} in cells; y is the top surface. oneWay platforms can be passed from below.

Defaults need no tuning: max jump about 3 cells high and 5 cells across.

OptionDefaultMeaning
width0.5body width, cells
height1.25body height, cells
speed7max run speed, cells/s
acceleration70ground acceleration
airAcceleration45air control
friction90stopping and turning on ground
jump14.5jump velocity
gravity34gravity while rising
fallGravity52gravity while falling
jumpCut2.5gravity multiplier after releasing hold
maxFall18max fall speed
coyote0.1seconds a jump is allowed after leaving a ledge
buffer0.12seconds a jump press is remembered before landing
stopOnLandfalsezero horizontal speed on landing

hopPatrol(time, {from, to, period = 1.1, hop = 0.9, offset = 0, view = 'side'})

Slime that hops back and forth between from and to (cells). It moves only while airborne. Returns {x, sprite, flip, airborne, direction}; draw {sprite, flip, x, y} with drawWorld. The hop height is in the sprite, so keep y on the ground. Use different offsets so slimes do not hop in sync.

Camera and effects

followCamera(previous, target, dt, {width = 256, height = 256, worldWidth?, worldHeight?, smoothing = 12})

Moves the camera toward target (px) and clamps it to the world. Keep the result in state.

burst(x, y, {count = 8, seed = 1, speed = 28, life = 0.4, size = 2, color = 'ink'})

Creates up to 64 particles at px x, y.

stepParticles(particles, dt, gravity = 24)

Moves particles and removes expired ones.

drawParticles(g, particles, camera?)

Draws particles, shrinking with age.

effect(name, since, time, {fps = 15})

Sprite for a one-shot effect started at since (s), or null once it has finished. name: hit (attack lands), slash (sword swing), poof (enemy defeated), dust (jump or landing), explode. Keep {n, x, y, t} items in state, drop them when this returns null, and draw {sprite, x, y} with drawWorld.

animate(name, motion, time, {fps = 8})

Sprite name for a creature's 4-frame motion at time: animate('bat', 'move', t) → bat-move1..4. motion: idle / move / attack / hurt. Works for every creature, slime, side-slime and big-slime.

blink(time, since, {duration = 1, rate = 15})

Invincibility flicker after damage at since. Returns false on hidden frames; draw the character only when it is true. Use the same duration to ignore further damage.

shake(time, since, {power = 3, duration = 0.25})

Screen shake started at since. Returns a px {x, y} that fades to 0; add it to the camera when drawing, not in state.

drawHud(g, {score?, total?, hearts?, title?, hint?, status?})

Draws score, hearts and a hint in the top 40 px. A non-empty status shows a centered result panel.

Math

FunctionReturns
random(seed, index = 0)Deterministic number in [0, 1).
clamp(value, min, max)value limited to the range.
approach(value, target, amount)value moved toward target by at most amount.
distance(a, b)Distance between points.
overlaps(a, b)Whether {x, y, w, h} rectangles overlap. Touching edges do not count.
facing(dx, dy, previous?)Hero direction for a movement.

Legacy

createWorld, project(view, x, y, height?) and views remain for old shared games. Use defineWorld and worldToScreen.