<< Back to résumé

Miller Tinkerhess—Apps

Demo Reel


Phase Space


My most complete effort to date. This is an Asteroids-style arcade game written in Objective-C. Your ship is controlled via accelerometer, so you hold the device level to the ground and tilt it to move. Your ship fires automatically. Gameplay progresses in waves, with enemies appearing in increasing number and variety. High scores are saved along with the date and time the score was achieved.

Phase Space uses OpenGL to display graphics. Most graphics are vector-based; only the backgrounds are from bitmap files. The shape of each asteroid is generated randomly—a predetermined number of edge points are spaced at regular angular intervals and random distances from the center of the object.

I composed three soundtracks for the game in Logic Studio which are available for download here, here and here. In composing the soundtracks I tried to complement the retro-inspired gameplay with retro-inspired music. Contemporary music dorks with perfect pitch might notice that the third soundtrack is a serial piece featuring a tone row in prime form, inversion, and retrograde.


Platformer


This is my current project-in-progress, a platformer engine, which may or may not ever get submitted to the App Store. As with all of my iPhone projects, I took this on to learn more about game programming. In this case the goal was learn about more serious object-oriented design in C++ and about flexible engine design.

The engine uses a simple class, Image, to handle the taks of registering images with OpenGL and drawing them to the screen. A second class, Animation, takes a vector of Images and a framerate in its constructor. It has methods for progressing the animation by a variable time period and for drawing to the screen. The class Drawable is the base class for all objects that can be drawn to the screen, and has an member variable of type Animation. Subclassing Drawable is a whole hierarchy of classes that can be drawn to the screen, some virtual, some not. For example, Moving Block inherits from Block, which inherits from Terrain, which inherits from Interacts, which inherits from Drawable.

One nifty thing I've accomplished in this program is that the levels are written in plain text files which are interpreted by the game engine. The levels are writen in a simple scripting language. There's one command to a line, and each command corresponds to a chunk of C++ code to be executed. The first word (or sometimes two) of the command is the name of the command and the rest of the words are arguments to the command. For example, "block 1 0 8 1" puts a Block at X=1 Y=0 with width 8 and height 1. More complex commands use vectors in the interpreters to act as stacks. For example, this code creates a moving block using the "path" stack:

path clear
path 0 0 5.0
path 0 4 1.0
path 0 4 5.0
path 0 0 1.0
movingblock 36 0 3 4

That chunk of code creates a block that begins at X=36 Y=0 with width 3 and height 4. The block takes five seconds to move to its next point, which is 4 units above its origin. It stays there for one second, then takes five seconds to move back to its origin, where it stays for one second before repeating the loop.

The levels are linked together with doors. For example, the command "door 2 2 level2 1 0" puts a door at X=2 Y=2 that leads to a door with ID=1 in level2 (contained in level2.lvl). The ID of this door is the last argument: zero.


3D Mannequin


This is a project I took on in order to learn about 3D graphics. It is written in Objective-C++; the interface with the iPhone's touch controls and some other files that come with Xcode's OpenGL template are written in Objective-C but most of the program is in C++. The souce code (Xcode project) is available for download here.

The program includes a class, My3dObject, that loads a .obj file. It provides methods for drawing the object, for moving and rotating it in 3D space, for setting its color and for specifying an image file for its texture. Each My3dObject includes a vector of child objects. When a My3dObject is rotated about the Y axis, all of its children are rotated about the Y axis also. When a My3dObject is drawn, each of its children is drawn with their location relative to the location of the parent object. In this way each limb is read from an .obj file and and when any limb is rotated all child limbs move and rotate to follow it.

Limb rotations are stored in memory and may be undone and redone. When the application is closed the state of the mannequin is saved in a map with one key/value pair per dimension per limb rotation (three dimensions per limb). A helper class writes the map to a flat file and reads it again upon opening the application.


Go Touch


This is my attempt to bring one of my favorite games to the iPhone. In retrospect I would have done a few things differently. In particular, the controls (in terms of how to end the game, review it, and begin a new game) could have been more straightforward. It was written in Objective-C.

I ran into a problem toward the end of development in the single player game: the game would pause for a couple of seconds after each time the user moved while it thought about which move the computer should make. It wouldn't display the stone the user had played or give any indication that the move had registered until it had decided which move to play in response. At that point I was eager to finish this project and had other ideas I wanted to get started on, so rather than re-engineer my display system so that it could update the display before the AI had finished thinking I simply watered down the AI so it wouldn't pause for so long.

While this isn't the program I'm most proud of, it has been the most commercially successful. I learned from its success that sometimes brand recognition (or in this case, game recognition) can be more important than quality when it comes to sales.


iTrio


This was my first release to the iTunes Store. It's a clone of the card game Set, written in Objective-C.


French Revolutionary Clock


This is a project I took on to learn about OpenGL. I had been fascinated with decimal time for a while and found some websites where I could see the current decimal time, but I wanted to be able to check the current decimal time wherever I was.

References, aditional source code, and promo codes for free application downloads available upon request. Contact miller.tinkerhess@gmail.com