cd /news/generative-ai/a-game-portal-told-me-ai-art-gets-re… · home › topics › generative-ai › article
[ARTICLE · art-141790] src=dev.to ↗ pub= topic=generative-ai verified=true sentiment=↑ positive

A game portal told me AI art gets rejected, so I redrew 15 bosses in canvas code

A developer replaced every AI-generated image in their browser game Void Parry with art drawn procedurally in Canvas 2D code after a game portal's certification tool warned that titles with raw AI graphics are rarely approved and perform more than 2x worse on its metrics. The rewrite, done in one evening, uses stacked strokes with "lighter" blending instead of shadowBlur for neon glow, and gives each of the 15 bosses a state object so eyes, jaws and cores react to the player, with the slowest boss drawing in 0.33 ms.

read3 min views3 publishedSep 29, 2026

My browser game Void Parry is a neon boss rush: 15 bosses, you reflect their bullets back with a shield. The bosses, backgrounds and key art were painted with an image model and cut out. It looked fine in screenshots.

Then I ran the portal's certification tool. One question was blunt: "Is this game built entirely with generative AI?" I answered yes, because it was. The next screen:

AI for code/logic is welcome, but titles with raw AI graphics are rarely approved.

Their written requirements say why: games with AI graphics perform more than 2x worse on their metrics than games without. Players can tell, and they bounce.

So I replaced every generated image in the game with art drawn by code. It took one evening, and the game looks better for it.

A neon boss rush suits the Geometry Wars / Just Shapes & Beats look: dark shapes, bright outlines, glow. That style is easy to draw with the Canvas 2D API and hard to get wrong:

// one path, stroked four times: wide faint glow, tighter glow, the neon line, a white-hot core
function neon(ctx, path, col, w) {
  ctx.fillStyle = "#0a0616"; path(); ctx.fill();
  ctx.globalCompositeOperation = "lighter";
  ctx.strokeStyle = col + "22"; ctx.lineWidth = w * 6;   path(); ctx.stroke();
  ctx.strokeStyle = col + "4d"; ctx.lineWidth = w * 2.6; path(); ctx.stroke();
  ctx.globalCompositeOperation = "source-over";
  ctx.strokeStyle = col;        ctx.lineWidth = w;       path(); ctx.stroke();
  ctx.strokeStyle = "#ffffffd9"; ctx.lineWidth = w * 0.34; path(); ctx.stroke();
}

No shadowBlur: it is the slow part of canvas glow. Stacked strokes with "lighter" blending look the same and cost almost nothing. The slowest of the 15 bosses draws in 0.33 ms.

Because each boss is code, it can react. Every draw call gets a small state object:

VP_VEC.draw(ctx, bossIndex, size, time, {
  lx, ly,     // direction to the player, -1..1: eyes and cores follow you
  charge,     // 0..1 while winding up an attack: glows flare, jaws open
  hit,        // flashes the outline white when you land a hit
  phase,      // 1-3: later phases add rings, cracks and more parts
});

The painted sprites could only breathe, lean and move a glow over their eye. Now the Void Eye's pupil tracks you, the Star Leviathan's jaw opens before it fires, and the final boss's chains snap in phase 3. Game feel went up, not just legality.

Backgrounds don't need to animate, so they are procedural scenes (seeded stars, stacked radial-gradient nebulae, one neon set piece per world: a black hole, a ringed planet, a lava range) rendered once in a headless browser to JPGs. One lesson: dim the set pieces to about 50%. The platforms are neon lines too, and a bright mountain outline behind them reads as something you can stand on.

The key art, store covers and app icon come from one composer page: background + a boss + the hero raising the shield + the title, exported at every size a store asks for.

The code for the game was written with an AI coding assistant; every visual in it is now drawn by that code.

── more in #generative-ai 4 stories · sorted by recency
── more on @void parry 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
→ Live at https://your-agent.zahid.host ✓
Get free account → Pricing
from €0/mo · no card required
LIVE [news/a-game-portal-told-m…] indexed:0 read:3min 2026-09-29 · —