===[ The Sorry State of Cross Platform Mobile Games | April 25th, 2009 ]===

So I’m toying with the idea of writing a game – I’ve got a pretty good idea that, more importantly, has remained a pretty good idea for the last few weeks. Simple to implement, fun to make, fun to play. I should be happy, but I’m not.

I’m tearing myself apart trying to decide which platform(s) to create it for. For starters, there’s the obvious: the iPhone. Tons of free engines and code samples make creating a game for the iPhone a no-brainer. Unfortunately, that means there are thousands upon thousands of them, and getting any sort of attention in that crowded market would require more work to market and publicize than it would take to actually create the game.

Then there’s the G1 – its hardware is on par with iPhone, yet it has a much smaller user base. This is a blessing and a curse – less users means fewer sales but less competition. Same deal with Blackberry – I don’t have the numbers to back this up but my hunch is that the number of iPhone users dwarves both the number of G1 and Blackberry users. At any rate, Don’t Dial iPhone is outselling Don’t Dial G1 by at least a 10:1 ratio (but, that’s with a very iPhone-centric marketing effort). Maybe with some G1 exclusive marketing I can get that to 5:1.

The Blackberry has in its court a much less crowded market, and a push for quality (RIM has explicitly said they’re not going to tolerate the crap apps that Apple does). Also, I’d be a fool to sell my game for anything above $1 on Apple’s app store, but I could sell for $3, maybe $5 on Blackberry and remain competitive. G1 is probably the same story, but muted slightly due to the number of free apps, as well as the G1’s open source spirit, which attracts a user base that’s a bit less comfortable with paying for apps.

The really discouraging thing is that technically, the three platforms couldn’t be farther from each other. Don’t Dial has taught me that getting any meaningful code sharing across all three platforms is difficult if not impossible. I’ve toyed with the idea of building a cross-platform metalanguage that would “compile” down to ObjC or Java code, but doing that is a lot of work, and then you have to abstract all the functionality of the APIs you need.

Someone, somewhere, is doing this, or will be soon, so there’s that too – should I develop my own abstraction, or wait until one gets released? The phonegap guys are making good progress, but they’re all Javascript, which makes sense for web apps, but for games is a harder sell.

Lots of questions, very little answers.

===[ Two New Articles! | April 11th, 2009 ]===

In all the hubbub of Don’t Dial, I completely forgot to mention my articles in two new game programming books!

Design and Content Creation Business and Production

I’ve got one article in each book – “Lone Wolf Killers” is in Business and Production, and “Creating Good Game Art When You’re Not An Artist” is in Content Creation.

I’ve read through both books, and both are worthwhile. Definitely check them out.

===[ Don’t Dial Debuts, and GDC | March 24th, 2009 ]===

Wow, arrived back in town to find a flurry of activity: Don’t Dial has hit the app store! So for the last couple of days most of my time at home has been dedicated to spreading the good word. I always prefer coding over PR because at least with programming you can tell instantly if something works or doesn’t work. Most of the time.

I’m missing the GDC. Every year before the GDC I think “yeah, too expensive” and then during GDC week I get all wistful and weepy about not being there for it. This has been occurring now for several years and is occurring yet again this year. And every year, I say this: maybe next year I’ll go back and say hey to all the gamedev.net guys and we can reminisce about how much better the conference was when it was in San Jose (or maybe not). Those halcyon days of the early ’00s!

And yeah, you can say I’m biased, but here’s truth: when it comes to GDC coverage, gamedev.net has consistently blown every other site completely out of the water. Even gamasutra. The gamedev team works their asses off, and I guess that’s my silver lining – all I have to do is sit in front of a browser and refresh obsessively. :)

===[ The Must Install Freeware Short List | February 1st, 2009 ]===

I got a new toy! It’s a netbook, an MSI Wind U100 specifically bought for its dual-boot capabilities. I’ve got it booting the 2 OSes I use, (as well as the Windows 7 beta, but that’s a whole nother post), but setting up all the partitions was a pain, and I ended up having to install Windows a few times.

So I got really good at installing software, and it also helped me separate the software wheat from the software chaff. Here’s the shortlist, the free software I find useful enough to immediately install on a fresh OS:

  • AVG – always the first install.
  • Firefox and Thunderbird – my Internet Explorer history will only ever contain one entry – getfirefox.com.
  • DropBox – my wife and I share a dropbox because hamachi’s mac support is woefully lacking.
  • CDBurnerXP – tiny and handy for when I have to plug in a USB burner…
  • Deamon Tools – … but most of the time I just mount an ISO on the network.
  • Hamachi – so I can get secure access to the contents of my PC anywhere.
  • Evernote – this has gradually overtaken Onenote for my personal datastore.
  • TweakUI Powertoy – mostly for its autologon feature. The cleartype tuner on that same page is also handy.
  • Digsby – facebook chat aside, the feature this has over trillian is that your settings are stored online, so you don’t have to reconfigure anything, just install, login, and you’re done.
  • DOSBox – cause Impulse Tracker won’t run directly under Windows, but runs under here using an emulated gravis just great.
  • FoxIt Reader – this is the PDF reader that acrobat should be. I think the guys who made Acrobat and the guys who made Vista search should get together and build something that doesn’t matter.
  • Launchy – great little app for launching programs via keyboard.
  • Songbird – I hope they put in iPhone sync soon. Death to iTunes!
  • VNC – another tiny tool that lets me remote desktop in (over hamachi!)
  • VLC – the best movie player out there, if you’re cool with your movie files having traffic cone icons.
  • And no, I didn’t forget about chrome. The abridged chrome rant: a) no plugin support, b) UI sucks (we’ve had minimal UI for years now, hit F11), and c) why suckerpunch mozilla?

    Google chrome is like the Ralph Nader of browsers. Ha, well, that’s a far cry from where this post started, so I’m taking that as a sign I should stop. :)

===[ More Android Morsels | January 11th, 2009 ]===

Finishing off my port now! Once it’s done I’ll do the whole “Android vs. iPhone” breakdown, but for now here’s just a few more gotchyas you may hit:

  • If you want to start an activity, remember that you have to add it to your app’s XML manifest file. Don’t worry, it only takes you a few iterations on “run, get exception, wonder why, remember” until you mind remembers to do this. It’s be great if some Java guy could integrate this into Eclipse so that when you created a new class you could have it automatically insert it.
  • URIs are not strings. To get from a URI to a string, use toString(). To go the other way, use parse().
  • Want to pop up a message box? In Android the class you need is AlertDialog. Here’s some sweet sample code:
    new AlertDialog.Builder(this).setTitle("Title").
    setMessage("Yo").setPositiveButton("OK",
    new DialogInterface.OnClickListener()
    { /* whatever */ } ).show();
    

    I found that code on the anddev forums. Message boxes were tricky to figure out because there used to be a different way to show them that was removed as the SDK matured. Also check out how the click listener method is specified via anonymous delegate.

===[ Hello, Android! | January 5th, 2009 ]===

I’ve started porting my iPhone app to Android/G1 in anticipation of Google’s market for paid apps launching later this quarter (I want to be in on the ground floor!) Java is very C# (actually, that’s incorrect, since most of the awesome stuff in C# was blatantly ripped off from Java, which had it years if not decades before but ANYWAY) – Here’s how I’ve started on Android and how others might want to start:

  1. go to code.google.com/android and go through all 4 steps of the getting started. Pay your $25 and if you can stomach it, plop down another $400 for the Android Dev Phone, which is an unlocked G1 with a cool skin.
  2. Download and integrate into Eclipse a package called CDT – C++ Development Tools. It comes with a DevStudio keyboard configuration that’ll save you some sanity; Eclipse is huge, and the keyboard shortcuts aren’t intuitive. For example, Ctrl+Tab and Ctrl+Shift+Tab don’t cycle between windows (which is what finally led me to find out about CDT).
  3. download DroidDraw, which is the best GUI drawing tool (like Interface Builder or the Design View of C#) that I’ve found. That isn’t saying a lot though, this tool is still young and cantankerous, but at least it gives you a graphical view of the XML files that Android uses for UIs.
  4. This site (www.androidph.com) has lots of code snippets to look at. Also check out AndDev, which has some cool tutorials and a good community going.
  5. Tell me about other things you find! :)
===[ XmlInclude getting ignored | December 14th, 2008 ]===

So, when pointing the XmlSerializer at a document that contains a list of abstract base objects, I came across a fairly standard exception:

System.InvalidOperationException: There was an error generating the XML document. System.InvalidOperationException: The type was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.

But, even after I put in the XmlIncludes, OR when using the serializer constructor overload that takes a list of types, I was still getting the error.

Turns out my problem, strangely, was this line:

[XmlRootAttribute(
  "Document",
  Namespace = "http://www.cuttlefishindustries.com/mycoolnamespace",
  IsNullable = false)]

I didn’t investigate it that much but it appears that if you specify a Namespace, the serializer ignores the additional types you supply (either via XmlInclude or the constructor overload). Once I took out my document’s XML root attribute, my serializer worked. Huh. So, there ya go, hopefully this’ll save someone some time, sometime.

===[ Something is happening! | November 16th, 2008 ]===

I’m working on grand and glorious changes to this site in anticipation of approval of my first iPhone app! Whee!

This post is really just to test something. So yeah not much to see… Yet.

===[ Metrozone | September 27th, 2008 ]===

Question: what do seven friends who work all day making games do when they get home? Answer: Make more games!!

Metrozone is our 2008 Dream Build Play entry. It’s Ikaruga meets Tempest – basically you race down this tube, shooting and dodging things – you collect powerups from killed enemies and try to run over as many power strips as you can (they increase your score multiplier)… so it’s very Tempest in that sense, but also, at any time you can flip to the outside of the tube where there might be easier enemies, more powerups, or death. Survival can only come from knowing when to flip (like Ikaruga).

Metrozone was developed throughout the course of several nights and weekends, and it was just mad amounts of fun to make. Here’s a gameplay video:

<a href="http://video.msn.com/video.aspx?vid=8b276e85-724e-4bd5-a8ab-bba5db0a2ef8" target="_new" title="Metro Zone - Dream Build Play Entry - Microsoft XNA">Video: Metro Zone &#8211; Dream Build Play Entry &#8211; Microsoft XNA</a>

===[ Save Nectarine! | September 13th, 2008 ]===

Up until a few days ago, nectarine.fr streamed demoscene songs (chiptunes: S3M, IT, MOD, etc.) to the world for free. It was driven by undoubtedly the largest database of demoscene music in existence – this database was the result of countless numbers of people contributing, voting for their favorite songs, etc.

Some stupid script kiddie hacked the site and destroyed the database. No viable backups exist (before you cast stones, when was the last time you backed up?), and now the world is faced with two options – attempt restoration of the deleted files off the hard drive, OR lose this piece of history forever.

I don’t usually trumpet causes, especially internet ones, but demoscene music was a big part of my childhood, and this site brought back tons of good memories. So help save it by throwing in a few bucks. Here’s the link:

[Update: I took out the donate button, it's no longer needed. The money was raised, and the drives are getting repaired!]

Here’s the forum with more info:
http://www.atari-forum.com/viewtopic.php?f=28&t=14858&start=0&st=0&sk=t&sd=a