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 object-oriented
• 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 PseudocodeMain(){
SetupEverything();
CreatePlayer();CreateAllEnemies();
done = false;while (done == false){TickPlayer();TickEnemyList();TickBulletList();
DrawPlayer();DrawEnemyList();DrawBulletList();
if (EscapeKeyPressed() == TRUE)done = TRUE;
WaitForNextFrame();}
ShutDownEverything();}
Timer callback versionTimerFunction(){
TickPlayer();TickEnemyList();TickBulletList();
// some systems, like Flash and Torque, do the drawing for youDrawPlayer();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