Galaga : A Programming Lesson About Classes and Inheritance Structure Learned from an Arcade Classic
Lessons Learned From a Classic Game
The game Galaga has what looks to be a very simple class structure and inheritance path, which can be used to explain the class and inheritance structure at a basic level. However upon further examination of the game, the structure has much more complexity than one might assume. This is due to different parent and child inheritance traits as well as different classes of objects with various traits.
A good place to start would be the base class of the player’s fighter ship. The initial ship object needs to have the ability to move freely horizontally and the ability to shoot missiles, and should also have collision instructions for enemy missiles and ships that cause a life to be lost and a new ship (if available) to be generated, as it will be used as a parent to other future instances of ships . (Namco, 2008)
The missiles need to have an object of their own and the base missile needs to have a draw instance action, and a move in direction action, in this case there can be more than one missile at a time in play, and will be the parent to any other missile objects. Any subsequent missile instances after the initial missile launch needs to have instructions the same as the base class missile plus the directional function and destroy instance upon collision with another object, such as an enemy, as well as an out of room ending sequence.
The subsequent ships the player has or lives remaining need to have these traits as well, but these ships cannot be used until the first ship has either been destroyed or captured by a boss Galaga ship. (Wikipedia, 2009) In this case the test instance count would be zero remaining, and another fighter with the base traits would be created. If a ship is indeed in the tractor beam of a boss ship it can be rescued. If the boss galaga is able to capture the ship, the player’s ship is added to the enemy formation , which would require two new instances of the ship, one while in the beam and the player having no action control over it, and another when the ship is grouped with the enemy, also with no player control allowed, and needing to inherit the traits of the enemy for events such as a collision with the player’s missiles, in addition to the base ship traits, with the exception of loss of player control. The captured ship needs to be rescued by the player which costs a life and allows two instances of the fighter ship to be controlled at once, which causes the need for two of the base class ships to remain on the screen simultaneously allowing for player control of both, going back to the initial traits of the base class ship. Assuming the player destroys the boss that captured the ship, the ship goes away and comes back with another boss. If the ship is shot by the player it is destroyed. If the ship is captured with no remaining ships the game ends.
At this point the enemy structure needs to be discussed. There are 3 different “normal” enemies all with the same traits, they can fly in various direction and patterns, collide with a player’s ship, shoot missiles, and return to formation. (Galaga online game, 2010) There are special boss enemies with all of the base traits of the parent “normal” enemies, but in addition they are able to capture the player’s ship with a tractor beam. These bosses also need a trait to be randomly generated every so many levels, and to have the ability to be more accurate than the “normal” enemies are.
In certain challenge levels, only the sprite and flight are inherited by the enemy objects, as they cannot fire or collide with the player’s ship and are meant to give the player an opportunity to score some very high point amounts. There are multiple instances of any one type of enemy on screen at any given time, starting with the ones in the middle of the screen in basic formation. These instances are created in this position. A second instance with the inherited traits of the initial enemies plus the traits that allow the patterns of flying then proceed to enter the screen. There need to be two classes for this action, one that comes in on the left side and on that enters form the right, a mirror image of the left entering enemies. There are several different sprites that have these traits, both the ones that start out in the middle of the screen and the ones that fly in. For instance, if there are 3 enemy sprites of various colors and shapes, there might be 9 objects: One for each color, one for each shape and one for each entry and flying pattern. Then there are the suicidal enemies which are generated at random and hold all of the traits of the enemies plus the suicide (flying collision with player) trait. Each of these has several instances of the object on screen at a time, all of them having the basic traits of shooting and destroying the instance upon a collision. Some have the advanced traits of flight and one more class has the ability to suicide bomb the player.
Overall, when getting in to inheritance of traits and different classes, it is essential to understand the function of each type of character and how far down the line the basic traits are carried, to figure out the parent child relationship between objects. Understanding this relationship is essential from a programming point of view because you can reverse engineer games to add methods that are tried and tested in your own game. It is also using structures to make creating your own games a lot simpler and to avoid having to create each character individually.