DEV Community

Nightdrive Labs
Nightdrive Labs

Posted on

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

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.

The style: neon line art, drawn every frame

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();
}
Enter fullscreen mode Exit fullscreen mode

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.

Bosses that look back at you

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
});
Enter fullscreen mode Exit fullscreen mode

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 and covers: procedural, rendered once

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.

What I'd tell someone starting out

  • Use AI for code and game math. That's welcome everywhere I've looked.
  • If your graphics come out of an image model, expect portals, and players, to hold it against you.
  • A strong, simple style you can draw in code beats detailed art that looks generic. It also stays consistent: all 15 bosses now look like they belong to one game, which the painted set never did.

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

Top comments (1)

Collapse
 
fernando_cybersec profile image
Fernando Tello •

Wow, same story here! CrazyGames told me my art needs work too.

I had to redraw everything for palabraplay.netlify.app in canvas. How did you handle the 15 bosses redraw? Did you use AI then trace over or pure canvas?

Would love feedback on my game - I'm stuck at 27 impressions.