430 likes | 579 Vues
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
E N D
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)
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
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(); }
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.
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