Without thinking, I’ve developed a sort of schema for when to use Adobe Illustrator and when to use Photoshop. When I create art in Illustrator for Aftermath, I use my graphic tablet with pressure-sensitivity enabled, which results in lines of varying weight. This lends itself to an organic feel, well suited to everything from characters to trees. Notice how the leaves taper near the edges, and the overall illustration has a relatively rough quality about it:
On the other hand, when creating buildings and other architecture, straight lines of a single width are required in order to make the structure feel stable. Thus, I have gravitated towards using Photoshop in this case: starting with simple shape primitives, and then using the pen tool to add shadows and blending options to create strokes, etc. The result is art which feels much more stable and solid, as architecture should:
What do you think?
I wanted to create an equalizing factor in Aftermath (to reduce the element of chance), as well as create a puzzle mechanic in order to make each map different than the last. The solution I came up with was first to design 5 different “monuments” (one for each race):
Each game could have up to 6 monuments, placed at predefined locations. The player could “cast a spell” (similar to an instant in Magic: the Gathering) by dragging and dropping energy onto one of the monuments. Each monument had its own special ability (eg, white healed the player, black damaged the enemy, etc.). Thus, this improved the balance of the game by giving the player to use unspent energy in a tactical manner. When a spell was cast, particle effects appeared on the monument:
The one remaining problem was that this system could give a major advantage to a player who had lots of energy to spare (he could just keep using the same spells over and over again), so there needed to be a way to counter spells. The solution to this was artifacts: defending against enemy units would eventually result in an artifact being dropped. Then, the defending player could use these artifacts to nullify spells.
The “boundingBox” or “contentSize” properties on a cocos2d sprite work great in most cases, but sometimes it is necessary to determine where the actual texture begins and ends. For example, in Aftermath I intentionally have padding around some sprites so that they remain a consistent size even while animating. The blue area represents the “boundingBox” of the sprite, while the outline around the character is where the proper “hitBox” should be:
The key to determining this is simply introspecting the cocos2d texture. Check out this code sample to see how to add a property to a sprite.
One thing which cocos2d (and many other game engines) seem to lack is a way to easily “clip” objects which are children of others. For example, with normal UIKit development, programmers can be assured that any content overflowing the bounds of their UI component will be sliced away, instead of flowing outside its bounds. Here’s an example of what I mean; noticed how the units do not stay inside their container:
To fix this problem, I created a simple subclass of CCLayer which used openGL’s GL_SCISSOR_TEST to clip to the desired bounds. Click here to get the source code; here’s what the end result looked like:
I am building Aftermath to be both a Single-Player (Campaign) and a Multiplayer (Conquer) game. Apple’s Game Center does a good job of managing the data of multiplayer games, but frankly the interface is terrible. Furthermore, I wanted to add more features to my Multiplayer screen… such as allowing players to invite friends via social networks (a great way for a game to grow organically).
Starting with the “new game” screen…
I created a simple dialog when the user pressed the “conquer” button:
The rightmost button (“first available”) immediately tried to find a match on Game Center. Thus, players could join a new mulitplayer game in as little as two taps. The leftmost button brought up a second dialog:
Here, the user could share a link on social networks, or open up yet another dialog to directly invite friends through GameCenter.
I kept the number of configuration options to an absolute minimum here. Originally, I had been planning on having features like “game speed” and so on, but I wanted players to be up and running with as few taps as possible.