The next game in my continued endeavor to learn C++ was Asteroids. I intentionally picked something about an order magnitude more complicated than my previous project, Pong, but wanted to still stay relatively simple.
Asteroids is, simply put, a top-down 2D ship shooter with a wraparound play-field where you try last as long as possible. It is a pretty well-known game from back in the day and I didn't think it would be all that hard to make.
My coding style didn't change all to much between Pong and Asteroids. My main challenge ended up being a larger game object hierarchy, which I solved in a somewhat straightforward manner. The GameObject class has several instance variables:
- int UID - a unique identification number
- int type - allows for object type classification (ie, TYPE_SHIP, TYPE_BULLET, TYPE_ASTEROID, etc.)
- bool alive - whether or not the GameObject needs to be removed
In addition, I moved towards a component based architecture, where the GameObject class possesses a pointer to one of each of:
- State2D - the object's position and orientation in 2-space
- Visual - for rendering an object
- CollisionObject - for handling collisions
Because each of these were abstracted out I was able to (debatably) decrease the size of my object tree hierarchy. Since Asteroids is such a simple game it probably didn't save me much here, but I wanted to test it out since I will only be making more complicated games in the future. This ended up working well enough for me here, and I think I will stick to it in the future.
Aside from complexity arising from scale, here are some of the other challenges I overcame:
- Display of line-frame objects with position & orientation
- Persistent high score maintained through a save file
- Particle effects on object death
- Screen wraparound
I would like to add that Mike Geig's Object Oriented Game Development series helped out immensely in my understanding of C++ and how to deal with larger projects, and especially with how to work with iterators.
Asteroids source code is available here.
Asteroids as an executable + resources is available here. To run it, rename the ".rename" extension to ".exe". Controls are either arrow keys or ASDW and the spacebar. The high score screen is a bit tricky to navigate around in. Use left / right arrow to change your cursor position and up/down arrow to change the lettering. Navigate all the way to the right and hit enter to commit & exit.