DOCS v0.1.13 github

@hatch:game v0.2.11

Game framework for Wren. Game.run(MyGame) and you're rendering — subclass Game, override setup / update / draw, get a window + GPU device + per-frame loop wired in. Composes with @hatch:ecs / @hatch:assets / @hatch:audio / @hatch:physics for the rest of a game. Same source drives a winit window on native and a page-attached canvas on web.

stable system updated Apr 30, 2026 source ↗
README
$ hatch add @hatch:game

MOD game

CL Input

NEW Input.new_()

GET Input.beginFrame_

GET Input.mouseX → Num

GET Input.mouseY → Num

FN Input.applyEvent_(e)

FN Input.static normalizeKey_(s)

FN Input.isDown(key: String) → Bool

FN Input.justPressed(key: String) → Bool

FN Input.justReleased(key: String) → Bool

FN Input.mouseDown(button: String) → Bool

FN Input.mouseJustPressed(button: String) → Bool

FN Input.mouseJustReleased(button: String) → Bool

CL Viewport

NEW Viewport.new_(w, h)

GET Viewport.width → Num

GET Viewport.height → Num

GET Viewport.aspect → Num

GET Viewport.toString

CL GameState

NEW GameState.new_(window, device, surfaceFormat)

GET GameState.input → Input

GET GameState.depthFormat → String

SET GameState.depthFormat=(v)

GET GameState.depthView

SET GameState.depthView=(v)

GET GameState.window

GET GameState.device

GET GameState.surface

SET GameState.surface=(s)

GET GameState.surfaceFormat → String

GET GameState.pass

SET GameState.pass=(p)

GET GameState.events → List

SET GameState.events=(e)

GET GameState.dt → Num

SET GameState.dt=(v)

GET GameState.elapsed → Num

SET GameState.elapsed=(v)

GET GameState.tick → Num

SET GameState.tick=(v)

GET GameState.width → Num

GET GameState.height → Num

GET GameState.viewport → Viewport

GET GameState.lastTime_

SET GameState.lastTime_=(v)

GET GameState.startTime_

SET GameState.startTime_=(v)

GET GameState.requestQuit

GET GameState.quitRequested → Bool

FN GameState.setViewport_(w, h)

FN GameState.set(key: String, value: Object)

FN GameState.get(key: String) → Object

FN GameState.has(key: String) → Bool

CL Game

NEW Game.new()

GET Game.config → Map

FN Game.setup(g: GameState)

FN Game.update(g: GameState)

FN Game.draw(g: GameState)

FN Game.resize(g: GameState, width: Num, height: Num)

FN Game.static DEFAULTS_

FN Game.static drainEvents_(events, g)

FN Game.static run(klass: Class)