Phaser AE

Shooter enemy art

Pro packv3.0.0-02D and 3DLookNew

The enemies of a first-person shooter, drawn as gritty period pixel art: eighteen of them across four sets, each walking toward you, turning, aiming, firing, flinching and falling.

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

Released October 26, 2026

Shooter enemy 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.

What it does

A shooter is only as good as the things shooting back. This pack has them ready: every enemy the corridor and sector shooter sets use, drawn in the look of the digitised sprites of the early 1990s, with chunky shaded pixels, dirty colours and hard outlines. The classic set has a possessed trooper, a heavy gunner in a gas mask, a fiend with embers in its cracks, a bone-plated brute, a floating bloat and the Warden, a demonic jailer with a furnace in its chest. The modern set has a bladed husk, a security drone, a sentry with a plasma rifle and the Hulk. The corridor raid has guards, attack hounds, a security chief and armoured troopers, and the crypt has skeletons, hooded archers, wraiths and an ogre with a club.

Each enemy was drawn from the front first, and every other pose was made from that picture, so it stays the same creature from every side: walking toward you, its side and its back, aiming, firing or striking, flinching, dying and lying dead. Loading an enemy paints the fourteen frames the shooters already number, so a game shows the right one with the frame its enemies already pick. The side turns to face either way, flying enemies hover and fall to the floor when they die, and machines spark where creatures bleed.

Enemies are found by name. A set's own enemy ids find their own art, and any other id finds the closest by its words: a zombie soldier wears the possessed trooper, a guard dog the hound, a ghost the wraith.

Features

  • Eighteen enemies, four sets — soldiers, demons, beasts, machines, undead and two towering bosses.
  • Ten poses each — front, a walking step, side, a side step, back, aiming, firing, a flinch, dying and dead.
  • The same creature from every side — each pose made from one front picture.
  • Frames the shooters already use — four facings of two steps, aim, fire, pain, two falling frames and the body.
  • Fliers and machines — floaters hover and fall when they die; drones spark and smoke.
  • For billboards or raycasters — painted into the atlas, or drawn onto a raycaster's own canvas.
  • Found by name — exact matches for the preset sets, a sensible guess for anything else.

Good for

  • A corridor or sector shooter — the enemies of corridor-shooter and sector-shooter in the world straight away.
  • A prototype or a jam game — enemies that look the part while the real art is made, then replaced key by key.
  • A shooter with its own bestiary — name-matching dresses most enemies without any mapping.

Make it yours

Choose the set to look in first, or name the picture for each enemy yourself, so a game can send a crypt ogre against a modern sentry. The atlas keys take any prefix, and the resolution they are painted at is an option. Every picture is painted under a key a game can paint over with its own art later. The pictures themselves stay as they were drawn: for enemies in another palette, make them again from the prompts.

A quick look

Load the classic set's enemies, then show each one the frame its horde picks.

const art = await game.enemyArt.load(['grunt', 'fiend', 'warden'], { set: 'classic' });
const a = art['grunt']!, k = 1.75 / a.front[1];
const board = view.billboards(a.key).get('grunt-1')[0];
board.sx = a.width * k; board.sy = a.height * k;
board.frame = game.assets.frames(a.key) + horde.facing('grunt-1', eye.x, eye.z, 4) * 2 + step;

Works with

Good to know

  • The pictures were made once with an image model and ship with the pack as 256-colour PNG data. They are not generated at run time, and the same prompts give different pictures if made again.
  • Decoding the pictures needs a browser; on a server or in tests the frames exist but are blank.
  • Frames are 160 pixels tall: sharp at a few metres, softer when an enemy fills the screen.
  • Four facings, not eight: the side stands for every angle between front and back.

More Look packs

Show all →