XNA Postmortem

My App Hub membership expires tomorrow. I decided to write a “postmortem” on my experience with the service, and game dev in general. This past year I released 3 games. The first game, Platform Hack, took about 9 months to develop, with lots of false starts, back tracking and pain. The other two games (Super Zombie Smash, Santa Sleigh Sling) were thrown together very quickly with code I had written for PH. So far my “gross” revenue from the 3 games is maybe 300 bucks. Factor in the cut MS takes, plus taxes I’ll owe, and I basically broke even on the $99 App Hub developer license and the few extra XBox controllers I bought. I didn’t get rich, but I learned a ton, and had a great time doing it.

The API

XNA is a very nice API for building games. It builds on top of .NET, so you have all the nice features of C# (types, generic lists, garbage collection). There’s no need to worry about the nitty gritty of implementing game loop threads, or talking with a graphics card (Direct X) API. That stuff works out of the box. It’s very easy to get simple demos working. The tough stuff are things that would cause issues in any language (collision detection! animation state machines, getting physics to “feel” right). The XBox specific calls are actually very modular and minimal. A game can be converted from PC to XBox (and vice-versa) in a few hours. The most time consuming part is changing things like control screens and menus. Overall, I couldn’t really ask for more from the technology itself.

The Community

There are multiple aspects of the XNA / XBox Live Indie community. You have the official forums. Then you have the external social network (twitter, blogs, other forums)

The official XNA forums suck. Many standard forum features are absent. Search functionality is abysmal. The folks are helpful enough, though there are a few crusty old farts that will sneer and simply link to old threads or FAQs which are tough to find anyway since the forum search sucks so much. Most of the rich technical discussion has migrated to other areas (stackoverflow, gamedev.net), so you’re left with noob questions (how do I draw a sprite, how do I iterate a list, etc) or rants about the state of the community.

The samples provided to the community by the official XNA team are excellent. I learned a ton myself from the Platformer sample, as well as the Game State Management sample. The Particle Effect tutorial was essential as well. These are gold: fully functional “games” with compiling source code, and halfway decent “assets” as well.

Twitter is probably the best community of XBLIG devs. The devs are very supportive of each other, retweeting links, reviews, advice, and can be counted on to jump in and review a game if needed.

Developing for XBox

The “Evil Checklist” is all that stands between an XNA developer, his game, and the XBox Live Indie Channel. Some of the restrictions can be annoying, specifically related to dealing with controller indexes or saving to external Memory devices. Also, stuff like changing the XBox language to French to trigger bugs with fonts (WTF). Some of this stuff should probably be handled by XNA under the hood, which would make a lot of first-time developers happy.

Also, the XNA Game Studio “app” can be notoriously fickle and fail to deploy games (or be very slow). This is usually due to the wireless connection. Furthermore, you can’t do anything on XNA Game studio unless you have a constant connection to XBox Live. This was especially annoying when I had my XBox far away from my router, and had to resort to internet sharing from my laptop. This method was even more fickle and prone to deployment hangups.

Peer review is very quid-pro-quo. If you simply upload your game and sit back, it may not pass in the 30 day limit. So it’s essential you go in and review other people’s games, with a link to your own game in your signature to subtly remind them to return the favor. There is a lot of crap out there, and of course, you can’t fail a game for being crap. The recommended course of action is to ignore the game. The problem is that a game only needs 8 successful reviews to be released, so the very good games, with high quality, responsive devs, are available to review maybe a few days. So you end up reviewing the crap and hoping they return the favor.

The other big frustration about the Review structure is you have a 7-day cool-off period every time you pull your game from review. So if you fix a small bug, you have to wait 7 days to get it re-reviewed. Even if you want to change something like the game description or screenshot – 7 days. This happened to me 3 times before my first game was released.

Lastly, the dashboard and shopping area is pretty weak on XBox Live. XBox Indie games (even the great ones) aren’t promoted at all by Microsoft. Games are no longer categorized by genre or type (Note: this has since been fixed). Furthermore, the “top list” is dominated by games that are never going to move, since their numbers (sales, ratings) are so high. This makes it especially tough for up and coming games to get the publicity they need to shine. Most games only have a 30 day window to make their sales, because after that, they drop off the face of the earth. Coupled with the Peer Review window (which usually takes 1-2 weeks to approve a game), you don’t really have time to make updates while your game is on the front page. This prevents games that may develop a cult following from growing, or seeing games improve radically over a long time (as opposed to platforms like PC, the web, Apple App Store, etc). If the XBox Live Indie channel had more categories, tagging of games, written reviews, and perhaps weekly spotlights / specials (like the App Store), it would be a very different market.

Game Dev in General

Game dev is one part frustration, one part joy. It’s incredibly rewarding to see code your write, or a sprite you draw come to life and move on the screen. It’s also amazing to think about some abstract data structure or algorithm, putting it in place in your game framework to solve a problem, and perhaps even watching emergent behavior pop up in the meantime.

But for every triumph, there are long hours of head scratching, eye gouging and controller throwing. Video games can be very tough to debug, since what you see on the screen is essentially an illusion. To the player, it’s all about movement, fluidity and control. But behind the scenes, everything is cut into 1/60th second sliver-thin updates. It’s hard to determine a flaw in physics or graphics rendering when you can only step through a handful of frames at a time. The art of game programming comes from visualizing how an object will look or act at 60 FPS, and translating that into incremental update/draw code, and vice-versa. Mastering that art can only come from hours and hours of experience.

The other big challenge is finding collaborators who have the same drive, vision and ambition. There were days when I sent out requests for a piece of art but ended up making it on my own since it was taking too long. This usually resulted in inferior art, but I learned something new.

More than anything, game dev is about constantly learning. Making games is very different from playing games, but there is one similarity: seeing yourself get better, and getting direct feedback on the screen.

Misc

  • Learn from the pros

The Indie scene is super vibrant right now, and AAA devs also have a lot of great stuff to share. Pretty much all the advice they give is useful. Some really great stuff here.

  • Don’t re-invent the wheel

Lots of the techniques used in game design are the way they are because they work. Collision, drawing, physics, sprite animation: these are not new. Download the sample projects (even for game genres you aren’t interested in). Run them, learn them. Also, the assets from classic games are great.

  • Build the wheel from scratch

It goes without saying that you will become intimately familiar with every piece of code in your game. That collision or drawing code you got from a blog? Yes. You’ll probably step through it a dozen times, trying to figure out how the hell it works, if it’s broken, etc. Once you do get it working, you may use the same algorithm, but it helps to make the code itself your own.

  • Prototype!

Pretty much every piece of your game can and should be prototyped. Menu system? Make a separate project. Player input control and physics? Standalone prototype. Animation system? You got it. Building tools is also super useful. I built small WPF apps to “run” my spritesheet animations (and line up the frames), and also to build tile maps.

  • Your games will suck

Once you step away from your games for a few days (or weeks) you’ll realize all the flaws in them. The stuff you thought was innovative gameplay is actually just messy and unbalanced. The stuff you thought looked cool was probably just amateurish. This is fine. This is expected. Your next game will be better.

  • Finish

The great thing about XBLIG is it forced me to finish my games. I paid money for a dev license, and I wanted to earn that money back. Going through the Peer Review process was stressful, but it was super rewarding to see my games listed on xbox.com. Dream Build Play was what gave me a kick in the butt to release a Beta of Platform Hack. And all the game jams going on these days are awesome as well.

  • Don’t feed the haters

Once you release something on the internet, people will comment, and some of those comments will be mean. Some criticisms can be constructive, but others can just piss you off. It’s not worth it to respond to the hate, or even take it to heart. Responding, if only for clarification or balance, will make you come off as defensive, and wont calm the haters anyway.

What’s Next?

There’s a lot of doom and gloom about XNA, especially since Microsoft is coming out with a new OS and development architecture. Also, there is the fact that even with the current technology stack, XNA is really only good (out of the box) for PC and XBox (and WP7…) Lots of big markets are missed (Mac, iOS, web). So I’m definitely thinking of migrating to a technology with broader reach, like Unity, or even HTML5.

But I will say, if you want to learn how to make video games, XNA is a great place to start, especially if you have a .NET background. The tools are great, the community is very inviting, and you may even make a few bucks doing it 😉