How to Make a
Game Like
Space Invaders
What IS Space Invaders?
• a SHMUP (shoot-em-up)
• Player has one ship, enemy has many
• Player and enemies interact by shooting
at each other
• Top-down 2D (usually)
Concepts
Video Frames/Ticks
• A film is made of 24 still pictures per
second
• Motion is achieved by small changes to
each picture, but 24 fps is still fast
Video Frames/Ticks 2
• Video games are usually 30 or 60-80
fps
• Video games achieve movement by
moving each screen object a little bit
every frame
Shmups are very objectoriented
•
•
•
•
•
Ships are objects
Bullets are objects
The player is an object
Explosions are objects
Levels can be objects (certainly made of
objects)
Question
• How many bullets can be on the screen
at once?
• Space Invaders = 1 for player, 2 for
enemies
• Modern = completely arbitrary
Lists
• A great way to store and organize
objects
• Most beginners get hung up here
• Conceptually harder than arrays
• C and C++ use linked lists (with
pointers)
• BlitzBasic has list:TList
What is a ship?
•
•
•
•
•
•
•
•
Is-dead flag
Health value
X and Y positions
Path logic and data
Reference to the art
Animation state
Bullet/missile launch state
Bullets and Explosions are very similar to
ships!
What is a player ship?
• Not as much, surprisingly
• Path logic is in your fingers, not in code
• So keyboard state checks (for avatar
control) go here
What is a bullet/missile?
• Like a ship, but (usually) simpler movement
• Erased when it goes off screen, not when it
reaches the end of its path
• State: Player shot or Enemy shot
• Each Player-bullet collides against every
enemy
• Each Enemy-bullet collides against player
So, to make space invaders…
• Make a player
• Make a bunch of enemies
• Move them every frame, have them create
bullets
• Move the bullets every frame
• Check for enemy-bullet collision every frame
• Keep going, even if all the enemies or the
player is dead
Programming
Main loop in Pseudocode
Main()
{
SetupEverything();
CreatePlayer();
CreateAllEnemies();
done = false;
while (done == false)
{
TickPlayer();
TickEnemyList();
TickBulletList();
DrawPlayer();
DrawEnemyList();
DrawBulletList();
if (EscapeKeyPressed() == TRUE)
done = TRUE;
WaitForNextFrame();
}
ShutDownEverything();
}
Timer callback version
TimerFunction()
{
TickPlayer();
TickEnemyList();
TickBulletList();
// some systems, like Flash and Torque, do the drawing for you
DrawPlayer();
DrawEnemyList();
DrawBulletList();
if (EscapeKeyPressed() == TRUE)
done = TRUE;
}
TickBulletList()
TickBulletList()
{
ForEach( bullet)
{
x = x + dx;
y = y + dy;
if (BulletOffScreen())
{
isDead = TRUE;
}
ForEach(enemy)
{
if (Collides(enemy, bullet))
{
isDead = TRUE;
DamageEnemy(enemy);
}
}
}
RemoveDeadBulletsFromList();
}
Basic Math
Vectors and Offsets
• Where is your Ship? X and Y
Vectors and Offsets 2
• Where is your bullet? Also X and Y
• Where is your bullet in relation to your ship?
bulletX – shipX and bulletY – shipY
Vectors and Offsets 3
• How far apart are they? Pythagorean
theorem (sqr(a) + sqr(b) = sqr(c))
• This requires a slow square root
function
Vectors and Offsets
2
• What direction from the ship to the
bullet? Arctangent
• Atan2(bulletX – shipX, bulletY – shipY)
Arctangent
• Usually gives a direction in radians, from 0(2*PI)
• PI is 3.1415927 (= 180 degrees)
• Radian to degrees = dir / (PI*2) * 360
Vectors and Offsets
3
• So you can describe the relationship
between two objects on the screen in
two different ways
Offsets
• Offset = x and y coordinates (or
differences)
Vectors
• Vector = direction and distance
Translate Offsets to Vectors
• Get distance with Pythagoras
• Get direction with Atan2 (Arctangent)
Translate Vectors to Offsets
• X = sin(direction) * distance
• Y = cos(direction) * distance
Vectors & Offsets = important
• Shooting bullet directly at the player
• Homing missiles
• Collision detection (is bullet close
enough?)
• Enemy follows path
What is TurnTowardsPoint()
• If you want the homing missile to turn
slowly towards the enemy (instead of
instantly) what do you do?
• The answer is the TurnTowardPoint()
algorithm.
Designing Your
Game
Bosses
• Traditional part of
shmups
• Each one is a love letter
to the player
• Multiple weapons
• Multiple parts
• Multiple Modes
• It’s a boss, not just an
extended enemy
Powerups
• Functionally just
like Bullets
• Give expanded
powers to the
player
• Key to one of the
basic metagames
The Game Modes
• Play mode
• Start mode
• Results mode (you are
dead, how’d you do)
• Pause mode
• Credits mode
• Options mode
Game Modes 2
• Recognize that
game modes are just
states
• Completely different
states than game
states
Scrolling Background
• Space Invaders background was
black
• Galaga and others had winking,
scrolling stars
• Zaxxon and others started making
the background complex and
interactive
• Treasure games are famous for
complex, puzzle-like environments
What are Shmup levels?
• Hand-crafted definitions of when each
enemy shows up
• The things that happen before a boss
shows up
• Divisions of art
• Scoring opportunities
How are levels made?
• Make the editors
yourself, for yourself
• Ship path editor
(mirror-able)
• Level editor
• Place art tiles
• Place ship spawn
points
• Place camera path
• Boss editor
In Conclusion
• Don’t be afraid, shmups are simple
• Shmups are easier for small teams
• Google and Youtube will teach you so
much
• Shmup dev concepts apply to other
genres
Q&A
•
•
•
•
•
•
•
•
•
Shmup History
Program Structure
Math
Game Modes
Game Levels
Bosses
Powerup Systems
Editors
Selling your Shmup
© Copyright 2026 Paperzz