The Animal Farm

November 30th, 2009

Game Polish 4: Fonts

Anyone familiar with XNA games knows Kootenay. It’s the default sprite font, and it’s widespread. And it’s ugly and overused.

I know nothing about font selection. I’m not a multimedia designer, I don’t make web pages or advertisements for a living. I wouldn’t be able to tell Times New Roman from Arial by sight. So obviously I’m ill prepared to talk about how to pick a good font. Find someone else to ask or guess wildly like I do.

I can, however, point to a few places to find fonts. urbanfonts is my first point of contact. It has a lot of free stuff and not horrible search capacity. dafont is also a site I look to. And there’s FontSpace.

Of course, there’s one thing you have to be very careful of when using a font: fonts are subject to copyright like anything else. Many of the fonts you’ll find are marked for personal use only. Some don’t even come with a license, and those are the ones I immediately delete to stay safe. It’s important to read those notices and not just trust that a site claiming free fonts actually has free free fonts.

Free as in beer or free as in speech?

November 19th, 2009

Game Polish 3: Sound Effects

I don’t have a sound technician on staff, and I suspect I’m not the only one. My budget is $0 or a very close approximation; while I can spend money, I’d like to avoid it unless absolutely essential. That leaves me with a handful of options for finding sound effects for my games:

(1) Make them myself
(2) Find free labor from a message board (ie:’s Help Wanted forum)
(3) Rely on friends
(4) Buy a sound effect CD
(5) Find free effects

Option (1) is right out. My sound talent is only marginally better than my art talent, which is to say that I can make the sound equivalent of a stick figure. I can make little blips into a mic or tap something against wood, which sounds cheap enough already, but I don’t have a studio, so there’s going to be noise and sound artifacts and it’s just going to come out sounding ugly.

Option (2) is wildly unreliable. People online tend to vanish or not produce. Sure, there are a few good people, but finding them literally takes years while wading through the flakes. But I grant that this experience is mostly with artists - I don’t work with sound guys much.

Option (3) is sketchy. Professors in school often tell you that working with your friends is not always wise, and there’s truth in that. It has the same problems option (2) has. Remember that no matter how much you like someone, they’re not working for you, and as such they won’t be working on your schedule. Don’t bother with deadlines or release dates; it isn’t happening. And that’s assuming the friend does create something, which isn’t a given even if you’ve been dating for two damn years. I’m drawing from real experience here.

Option (4) is workable. Pre-created assets have their problems. With art it’s that the items are generic or don’t really fit the game or are expensive. The same is true for sound effects, only often (especially with user interfaces) you can get away with generic sounds, and the cost isn’t back breaking.

Option (5) is the one I’m currently employing. It’s hard to find good art or music online that’s free to use, but sound effects aren’t quite as difficult. Sound Jay and PacDV are both good resources for royalty free sounds that can be used in commercial products. Tintagenl’s looks promising too, but I haven’t browsed it much.

I just ran it through a transference feedback loop.

November 19th, 2009

Game Polish 2: Interpolation

Look at a game interface in motion. Really look at it. Objects rarely “pop” into place. Meters don’t instantly display new values. Text won’t always just be there. More often than not, widgets will shift: a window will slide in from off-screen, a meter will grow from its old value to its new over a few frames, and text will fade in. This is all the result of interpolation - some value, whether it be a position or a color or a scalar, shifts gradually to another value via some function.

The exact function used varies. Linear interpolation (lerp) is the easiest. The value changes uniformly over time via the function lerp(start, stop, time) = start + (stop - start) * time, where time is in the range 0 to 1. A simple variation raises the variable time to some power so that the value change is no longer uniform - as the time approaches 1, the interpolated property seems like it’s slowing down or speeding up depending on the power used.

It can be more complicated as any animator knows. You can interpolate using spherical linear interpolation (SLERP), splines, step functions, etc. The exact mechanism is all a bit situation specific. But the point here is this:

Interpolation is crazy useful. It produces a dramatic improvement over just putting things where they should end up. It adds a bit of flair necessary in differentiating bland interfaces from interesting ones, and it certainly isn’t limited to interfaces.

Don’t blink.

November 17th, 2009

Game Polish (1)

A major separator between a hobbyist and a real game developer is the amount of polish that goes into a game. A hobbyist can get away with cutting corners - leave out a menu screen, fudge an interface or two, make one of the game items a bit unclear, leave in a bug or two, and who’s going to notice? Animations might be a little jerky, and there’s a certain something missing. But that’s OK; the hobbyist is doing this for fun, not profit.

I’m not interested in talking about the major or obvious separators between a hobby project and something meant to be released to the masses. Leaving in bugs, leaving out title screens, these are obvious. I’m more interested in the smaller things - the subtle touches that are expected of real productions but go without saying. The certain somethings.

And I’m a programmer at heart, so I’m also interested in implementations.

Today I’m going to talk about “pulsating,” which is an effect my current game uses heavily. Basically, you’ve got some screen item - maybe an interface widget or game entity - that shifts back and forth between states. For instance, when a menu item is selected, its size grows and shrinks to indicate that it’s selected. Or when an enemy is dying his alpha shifts between transparent and opaque while the death animation plays.

Of course, this particular item is pretty cheap to produce. My own code base has a ‘BouncingValue’ template class that stores a minimum, maximum, velocity, and current value. During each Update, the velocity is added to the current value; if the value exceeds the min or max, the value is clamped and the velocity reverses. Since it’s a template it can be applied to anything that supports basic math operations - colors, vectors, sizes, or what-have-you.

Like I said, this is a subtle impact, but it adds oomph. A bit of animation to keep screens from being stale. Like any effect, it requires thoughtful placement and becomes cheesy if overused.

As I continue with my personal games, I’m hoping to make a series out of this, writing about useful techniques to add polish - it’s not an area that gets talked about much, but it’s certainly an important consideration in any game production.

November 8th, 2009

Where am I?

There’s been a notable absence of substantive posts lately. Here are some updates for those curious:

* Word Duelist is coming. I’m waiting on art, and it’s inching closer, but it’s still not there.
* New games are being prototyped regularly. A few have been pretty poor. A couple are showing promise. More there when things are ready to show off.
* Playing around with getting a new 72HGDC site up and running. I’m not a web developer and have other things on my plate, so this is far down on my queue, but it’s there.
* Finished up Borderlands; still playing it lightly until new DLC is released, but I have Uncharted 2 and Brutal Legend to keep me occupied.

I ate fortune cookies for breakfast.

November 3rd, 2009

Heroes Makes a Chrono Trigger Reference!

In the latest episode - “Once Upon a Time in Texas” - Hiro refers to Charlie as the Marle to his Crono. It’s heartwarming.

That is all.

Gone is the magical kingdom of Zeal, and all the dreams and ambitions of its people.