Phaser AE

Horror figure art

Pro packv3.0.0-02D and 3DLookNew

The figures and props of a first-person horror night, drawn as period pixel art: a stalker in four poses, the ghosts a scare director places at the edge of your light, and the things you pick up and hear ring in the dark.

This is a Pro pack. Upgrade to Phaser Pro to use it in your games.See Phaser Pro →

Released October 25, 2026

Horror figure art: a screenshot of its demo
A note about these graphics

Expansion packs don't come with graphics. This screenshot is one way of drawing what the pack does, made for its demo: none of the sprites, tiles or backgrounds in it are in the pack.

That's by design. A pack is a game's logic, mechanics and effects, and it works with whatever art you give it. Some packs draw effects, backdrops or 3D scenes of their own, but none carries a game's sprites.

So the look is yours. Make the art on phaser.io, bring your own, or let your agent draw it in code: the same pack can look like anything.

The pack

horrorArt

function horrorArt(): Pack<{ horrorArt: HorrorArtApi }>

The horror-art pack: game.horrorArt, ready-made pixel-art figures (a stalker in four poses, an apparition, a runner, a mirror figure, a shade, a hooded monk, a face) and props (a fuse, a battery, a phone, a radio, an oil flask, a book, bones, a bell) for first-person horror. No options.

Helpers

findHorrorArt

function findHorrorArt(name: string): string | null

The entry a name should wear; see HorrorArtApi.find.

HORROR_ART

const HORROR_ART: Readonly<Record<string, HorrorArtEntry>>

Every picture as 256-colour PNGs in base64, standing on the bottom edge of its frames, by id.

horrorArtPose

function horrorArtPose(info: HorrorArtInfo, pose: string): number

A pose's frame; see HorrorArtApi.pose.

Types

HorrorArtApi

interface HorrorArtApi

game.horrorArt.

  • readonly names: readonly string[] — Every entry's id.
  • find(name: string): string | null — The entry a name should wear: the id as it is, else a guess from its words ('figure' and 'ghost' the apparition, 'mirror-figure' the mirror figure, 'monster' the stalker, 'object' the book, 'skull' the bones, 'oil' the flask, 'cell' the battery). Null when nothing fits.
  • load(names: ReadonlyArray<string | { id: string; art?: string }>, options?: HorrorArtLoadOptions): Promise<Record<string, HorrorArtInfo>> — Paint pictures into the atlas: each name (or { id, art } to choose the entry) gets its poses as frames of prefix + id. Names nothing fits are left out. Async, because a browser decodes the pictures; headless, the frames exist with the right count and size but blank. Throws on a scale out of range or an unknown art.
  • pose(info: HorrorArtInfo, pose: string): number — A pose's frame within info.key, or the first frame when it has no such pose.

HorrorArtEntry

interface HorrorArtEntry

One entry's pictures, as the pack ships them.

  • readonly kind: HorrorArtKind — A figure (its poses at one scale, standing on the bottom edge) or a prop (fitted into a square, standing on its bottom edge).
  • readonly size: readonly [number, number] — Each frame's size in pixels, [width, height]; every pose of an entry has the same.
  • readonly height: number — The world height, in units, the whole frame is meant to be drawn at: a suggestion (a figure's own height may differ).
  • readonly frames: Readonly<Record<string, string>> — The poses, by name in order, each a 256-colour PNG in base64.

HorrorArtInfo

interface HorrorArtInfo

A picture as it was painted: its key, its size and which frame is which pose.

  • readonly id: string — The name it was painted for.
  • readonly art: string — The entry it wears.
  • readonly kind: HorrorArtKind — 'figure' or 'prop'.
  • readonly key: string — Its atlas key.
  • readonly width: number — One frame's painted size, units (the shipped size in pixels times scale).
  • readonly height: number — One frame's painted size, units.
  • readonly aspect: number — Width over height: a billboard h units tall is h * aspect wide.
  • readonly worldHeight: number — The world height the whole frame is meant to be drawn at, units (the entry's suggestion).
  • readonly poses: Readonly<Record<string, number>> — Each pose's frame within key, by name; with mirrored, each also as <pose>-flip, facing the other way.
  • readonly frames: number — Frames painted under key.

HorrorArtKind

type HorrorArtKind = 'figure' | 'prop'

What a picture is: a figure standing on the bottom edge of its frames, or a prop fitted into a square.

HorrorArtLoadOptions

interface HorrorArtLoadOptions

Options for load.

  • prefix?: string — Atlas keys are this plus the name. Default 'ha-'.
  • scale?: number — Painted size per picture pixel, a whole number from 1 to 4. The atlas already paints at twice the density with smoothing off, so 1 keeps pixel art crisp; more only for a figure drawn very large. Big frames at a big scale may not fit an atlas page. Default 1.
  • mirrored?: boolean — Also paint each pose mirrored, as <pose>-flip: a side-on figure walking the other way. Default false.