Space shooter

2017 Processing / Java

A top-down shooter with enemy attack patterns and a grid-based spaceship designer, where you place five different weapon types tile by tile.

Space shooter start screen
You build the ship first, then go fight.

Why I made it

I've seen a lot of space shooters over the years: arcades, Touhou, Eschatos, that whole family. What I actually wanted to make was a ship I could rebuild myself, especially the weaponry.

The enemies were placeholder squares and stayed that way. Around that I put tile placement, a build UI, firing, damage types, a menu to jump between building and fighting, spawners, movement patterns, and sliders for enemy health and spawn rate. I kept stitching it together in Processing until it felt like a real loop.

Weapons

Space shooter combat
Laser beam going, enemies with little health bars above them.
  • Gun: normal projectile, the baseline
  • Explosive: radius damage on impact
  • Frag / flak: a blast plus a spray of tiny shots
  • Forcefield: area damage that hangs around for a few seconds
  • Laser: high damage beam with a long cooldown

Everything costs in-game currency, and enemies drop more when they have more HP. In the version I built I gave myself an absurd amount of money so I could keep testing weapons without grinding.

Stuff I never finished

I wanted destructible tiles so enemies could chew your ship apart over time, with repairs paid for by what you'd earned, and the option to sell parts if you were broke. That's why there's a hull block in the editor that still doesn't do anything.

I also thought about a power system so guns weren't free forever: generators would take space, create a weak spot, and maybe buff firerate or damage if you had enough juice. A campaign or open-world layer was on the wishlist too. Never got there.

Lost files

The source lived on a 2017 laptop that died, so I don't have the project anymore. Most of the game sat in Processing's draw loop, which was fine for a first pass and messy once things grew. If I remake it I'd split updates per object and use the real input callbacks. Not a tragedy, more of an excuse to do it cleaner next time.