XNA Business Lesson #1 – Understand the Metrics

February 13, 2010

When I first released Cell Life, I had no idea what different types of metrics were available to me to gauge my game’s performance.  As an XNA Creator’s Club Member, I had access to my Download History which showed me on a day-by-day basis how many trial downloads and purchases my game got from several different countries.  However, over time, I learned that there are many more statistics and lists available, some easier to use than others.

One thing that changes daily (and often more frequently than that) is http://marketplace.xbox.com/en-US/games/catalog.aspx?d=7.  This site lists the XBox Indie Games in a Best-Selling order.  Whenever the list is updated, it re-sorts based on the current number of sales for the time period.  The time period is usually assumed to be one day.  If your game is on the top page, it is likely getting well over 75 sales for that day!  Browse the list to not only find your own game but to also see what kinds of games consistently stay on the first few pages of the list.  What are those games doing that your game is or is not doing?  Even if you don’t think some of the games getting a lot of sales are good, it is critical to understand that people ARE buying these games.  Learn what you can from this.

A similar list can be found on the XBox 360’s Dashboard.  If you select Games Marketplace and browse to Indie Games, you can find a Top Downloads list.  This list is similar to, but not identical, to the list above.  This list seems to measure downloads per day as opposed to sales.  One public site that tries to keep up with this data is http://www.retronator.com/XboxPopularityMeter/Community.  Search for your game in the list (use your browser’s search functionality to make this easier) and see how it has done in the last few months.  You can compare your game to other Community Games or even to XBLA games as well.

You can also browse the Indie Games section of the XBox Marketplace site above by sorting on Top Rated.  How is your game rated compared to other games?  If your game is on the first page, it is also likely featured on the XBox 360’s Dashboard in the Top Rated list.  This can be a huge boost to your game’s sales.  Another thing to look at is the number of ratings your game has received.  Often, this is updated well before you get your previous day’s Download/Sales numbers.  If you are getting new ratings consistently, you are likely getting a lot of trial downloads (and possibly sales) as well.  I find that it can easily be a 40:1 ratio or more of Trials:Ratings.  If your game has 1000 ratings, it’s probably doing very well!


Cell Life has been released!

February 13, 2010

After a lot of hard work and waiting, Cell Life was finally released to the world on XBox Live Indie Games on 01/22/2010. You can find it on the MarketPlace at http://marketplace.xbox.com/en-US/games/media/66acd000-77fe-1000-9115-d80258550422/.

I’m pretty excited about releasing my first Indie Game and the early numbers are better than I expected for my version of Conway’ s Game of Life. If you’re interested in checking it out or just want a screensaver for your XBox, I encourage you to check it out and let me know what you think.

In future posts, I’m going to blog a bit about what I’ve learned about making games for the XBox in XNA and some things I’ve learned about publishing Indie Games.


XNA Code Lesson #1 – TitleSafeArea

February 13, 2010

When making my first XNA game for the XBox 360, I spent quite a bit of time making a cool splash screen on my PC, making a basic layout for my game, and only then did I try deploying to my XBox 360. Unfortunately, the viewing region of a TV simply doesn’t match that of a PC window and quite a bit of my menu was cut off.

What happened? Well, on a TV there is generally an overscan area around the edges that can cut off some of the display area. As a result, it’s typically good practice to only use the inner 80% of the screen for important game text. Thankfully, you can simply use graphics.GraphicsDevice.Viewport.TitleSafeArea in XNA to find the safe rectangle to draw in.

So, I happily wrote up some code to only display in that region and continued testing on the PC. Doing this became problematic for a few reasons. First, a window on the PC always has 100% of the area as TitleSafe. This makes it hard to tell if my code using the TitleSafeArea rectangle is really doing anything. Second, even if that code is working, playing my game on my computer simply wasn’t giving me a good idea of how it would look on my TV.

To solve this problem, I made my own rectangle representing the TitleSafeArea and used that instead of the graphics.GraphicsDevice.Viewport.TitleSafeArea. Then, if not on an XBox 360, I would simply add 10% margins to each side to simulate a TV screen appearance.

Some code to do this:

iSafeStartX = (int)(graphics.GraphicsDevice.Viewport.Width * 0.1f);
iSafeStartY = (int)(graphics.GraphicsDevice.Viewport.Height * 0.1f);
iSafeWidth = (int)(graphics.GraphicsDevice.Viewport.Width * 0.8f);
iSafeHeight = (int)(graphics.GraphicsDevice.Viewport.Height * 0.8f);
rectTitleSafeArea = new Rectangle(iSafeStartX, iSafeStartY, iSafeWidth, iSafeHeight);

That gave me the look I wanted but it was still hard to tell if what I was drawing on the screen was fitting inside that rectangle or not. So, I needed to draw it! I added some code to draw the TitleSafeArea on the screen if the game was run on a PC so I could tell how well my graphics fit.

First, I made a very simple texture in Paint that is simply a single pixel of my desired color. (OK, technically I had two such textures and passed the correct one in to my method as needed). Then, I made a method with the following code in it and called it from my various Draw methods:

#if !XBOX360
    spriteBatch.Draw(txtPixel, new Rectangle(rectTitleSafeArea.Left, rectTitleSafeArea.Top, rectTitleSafeArea.Width, 1), Color.White);
    spriteBatch.Draw(txtPixel, new Rectangle(rectTitleSafeArea.Left, rectTitleSafeArea.Top, 1, rectTitleSafeArea.Height), Color.White);
    spriteBatch.Draw(txtPixel, new Rectangle(rectTitleSafeArea.Left, rectTitleSafeArea.Top + rectTitleSafeArea.Height, rectTitleSafeArea.Width, 1), Color.White);
   spriteBatch.Draw(txtPixel, new Rectangle(rectTitleSafeArea.Left + rectTitleSafeArea.Width, rectTitleSafeArea.Top, 1, rectTitleSafeArea.Height), Color.White);
#endif

All of this made my debugging and testing on the PC far far easier and saved me from running up and down the stairs dozens of extra times to see how my XBox deployment looked every time I changed the layout.