I've taken a break from my research for the past week to work on an intense, one-week game project. For a graphics class assignment, I decided to challenge myself to see how much of a full game I could write in a week. Here's the catch: we're using OpenGL in the class...and my only experience is with D3D. So the past week has been an incredible flurry of learning OpenGL, ridiculous amounts of coding, and learning how to build a real game (rather than the small demo-ish things that I usually build to explore single ideas).
The result? I'm proud to say that I ended up with a very respectable little space shooter by the name of "Epsilon." I wrote it from scratch using GL and c++. I tried to rebuild a very small subset of my D3D engine's functionality, so that I could work with the same abstractions to which I have become accustomed. The final game .cpp files had no GL-specific code in them, so I succeeded in that respect! I think it's going to be easier than I thought to make my engine multi-platform (i.e., both D3D and GL).
The most interesting part of the project was learning to do new things that I've never done before, rather than just applying knowledge that I already had. Indeed, I tried a *lot* of things that I had never tried before, including the following:
- Modular Architecture. Each module handles some subset of the game's functionality, making it far easier to keep things clean, separate, and manageable.
- A Particle System. The particle system pretty much made the game's graphics.
- Procedural ships via radially-extruded shapes using multiplied sinusoidal radius functions. The idea ocurred to me when I was searching for a quick solution to procedural ship meshes. I just extruded rings and applied a radius function. I tried a sum of sinusoids, but decided that multiplication gave nicer results. The results are pretty decent! My previous box ships are still better, but I didn't have time to do a full perlin implementation for this game.
- Cutscene. I produced a short cutscene at the beginning of the game that sets up the story. I experimented with camera transitions, cool text effects, etc. I've never done anything cinematic like that before...but I was really pleased with how it turned out! Of course, I don't think it's really relevant - I don't plan on having cutscenes in my future games.
- Sound!!! I used the BASS library to get music and sound effects in the game with a remarkably small amount of work. I'm really excited about this, and it may just be the thing that I choose to do sound in my engine (though I'd still like to learn how to use DirectSound by hand).
- Font Rendering Engine. Font support was very limited in GLUT, so I rolled my own font rendering system that built strings out of quads. Although the system was pretty primitive and hacky, it turned how surprisingly well. I coupled this component with the particle system to allow rendering of fonts in particle form, which was cool!
Some screenshots of the game: