🎮 About Retro Shooter


💡 Inspiration

Retro Shooter was inspired by the classic brick handheld games and early arcade shooters that defined an era of simple, addictive gameplay. Growing up with those devices left a lasting impression — so the goal became recreating that nostalgic experience, but with smoother controls, better balance, and a modern gameplay feel that still respects the original spirit.


🚀 What It Does

Retro Shooter is a minimalist 2D fixed shooter where the player controls a ship at the bottom of the screen, moving left and right to shoot enemies descending from above.

After destroying a set number of enemies, a boss appears with increasing difficulty per level. The game is built around four core pillars:

Pillar Description
🎨 Clean visuals Block-style pixel aesthetic
🕹️ Responsive controls Smooth, frame-independent input
📈 Difficulty progression Balanced scaling that challenges without frustrating
🔁 Gameplay loop Simple, engaging, and replayable

🛠️ How It Was Built

The game was built using a lightweight approach focused on performance and simplicity. Below are the key systems:

⏱ Time-Based Movement (Delta Time)

All movement is decoupled from frame rate using delta time, ensuring consistent speed across every device:

$$ \text{movement} = \text{speed} \times \Delta t $$

👾 Enemy Spawn System

Enemies spawn dynamically with increasing frequency as the level increases, creating escalating pressure without manual tuning per level.

💀 Boss System

A boss appears after a fixed enemy kill threshold. Boss HP scales with the current level \(L\) using:

$$ \text{HP} = 8 + (2 \times L) + \frac{L}{2} $$

This means a level \(L = 4\) boss has \(\text{HP} = 8 + 8 + 2 = 18\), while a level \(L = 10\) boss has \(\text{HP} = 8 + 20 + 5 = 33\) — a significant but fair challenge increase.

🔄 State Management

Clear separation between all gameplay states:

  • PLAYING → normal enemy waves
  • BOSS_BATTLE → boss active, special behavior
  • PAUSED → frozen game state
  • GAME_OVER → end screen and reset

🔈 Minimal Sound System

Only two sound events are used — shooting and boss defeat — keeping the audio clean and retro without sensory overload.


🧠 What I Learned

  • Game feel over complexity — a polished simple game beats a messy complex one every time
  • Delta time is essential for cross-device consistency; frame-dependent movement is a hidden bug
  • State transitions require careful design, especially around boss spawning and kill counter resets
  • Difficulty scaling via formulas (like the HP equation above) is more reliable and tunable than hardcoded values
  • Less sound = better experience — removing audio clutter significantly improved the feel of the game

⚠️ Challenges Faced

Enemy Speed Bug

Enemies became erratically fast due to frame-dependent movement. Fixed by applying delta time \(\Delta t\) consistently across all movement calculations.

Boss Spawning Issue

The boss appeared only once because the kill counter and state flags weren't properly reset between rounds. Resolved with explicit state resets and continuous condition checks every frame.

Sound Overload

Too many sound triggers created a noisy, unpleasant experience. Solved by reducing events to only the two most meaningful sounds.

UI Overlap

The boss health bar initially overlapped the gameplay area, obscuring enemies. Repositioned it outside the game canvas entirely.

Difficulty Balance

Finding the right HP and attack values for bosses required multiple iterations. The formula \(\text{HP} = 8 + (2 \times L) + \frac{L}{2}\) emerged from testing to provide fair but escalating challenge.


🎯 Final Thoughts

Retro Shooter focuses on delivering a clean, nostalgic arcade experience while solving the real problems that plague simple games — inconsistent speed, poor balance, and cluttered feedback.

The result is a game that is easy to pick up, satisfying to play, and optimized for both performance and user experience — a small project, built with care.

Share this project:

Updates