Thoughts on the iCade (and on using it with Flash games)

I got an ION iCade a few days ago. This post is about my thoughts on the iCade, and also on how to use it with Flash games.


The iCade

So the basic idea with the iCade is that it’s meant to give you physical controls for iPad games. First of all, the physical build quality of the device is fantastic. I’ve heard some people say that it looks small after seeing photos of it, but it’s definitely not small in real life; it’s actually quite big compared to the iPad, and it’s very sturdy. The joystick and the buttons feel solid and substantial, and they’re very responsive. The idea of the iCade may seem like a gimmick or a joke, but the actual execution of it is anything but.

The iCade runs on two AA batteries. It acts like a Bluetooth keyboard, so setting it up is really easy. The only issue is that because the iPad thinks it has a real keyboard attached, it doesn’t show the normal virtual touch keyboard when the iCade is synced, which can be a big pain. This is compounded by the fact that the iCade doesn’t have a power off button (it just turns off after a few minutes of being unused), so you either have to wait for a while or un-sync it just to type text. This is annoying but most of the time it doesn’t really matter, because you’re using it to play games, not type stuff.

Some people have asked if it has speakers: it doesn’t, but the shape of the cabinet amplifies the iPad’s sound a lot, which it really does make it seem louder.

The games

Most iPad games are built for touch controls, not keyboard controls, so there aren’t very many games that support the iCade. Luckily, ION convinced Atari to build iCade support into every game in their Atari’s Greatest Hits iPad app, so for $14.99 you can have 99 retro games to play. I really enjoyed playing through a bunch of classic arcade games on the iCade, it is definitely much more fun than playing them on a touch screen.

If you’re worried you’re gonna get bored of retro games, there are also a few indie devs that have built iCade support into their apps. Compression HD from Little White Bear is a great puzzle game that supports the iCade, and Retro Dreamer just announced that the next Velocispider update will have iCade support. I’m really excited for that one. For a list of other games with iCade support, you can check out the wikipedia page.  The list is pretty short, but I have no doubt it’ll get longer over time.

Implementing iCade support into iOS games

So how do you add iCade support on iOS? Luckily someone made a library that makes it super easy: https://github.com/scarnie/iCade-iOS/ – basically you just add a special view to your main view controller which listens to keyboard events, and that view then sends messages to a delegate when buttons are pushed. There’s really not much more to it. The one big catch is that for some reason Apple won’t let you mention the word “iCade” anywhere. You can’t put “iCade” in your app’s name or description, and you can’t even mention the word iCade *in your app*. That’s crazy.

Ok, but how does the iCade actually work?

Alright, so when I said the iCade acts like a Bluetooth keyboard, that was true, but it’s not quite that simple. Rather than just emulating keys, the iCade actually emulates two keys for each control. Each button fires one key when it’s pressed down, and a different key when it’s released. For example, the red button in the top left fires a Y when pressed, and a T when released. The joystick does the same for each of the 4 directions. The image below is a diagram from the iCade Developer PDF that shows exact which keys are fired by which control.

The magic of Bluetooth

When I realized that the iCade was acting like a normal Bluetooth keyboard, I decided to do some tests; sure enough, it can connect to any device that works with Bluetooth keyboards: an iPhone, iPod Touch, PC, Mac, or even a Playbook (more on that later). Being able to connect it to a device other than an iPad is cool, but it’s not much use if there are no games that support it, so I set out to do what I could to change that.


iCadeManager.as

Flash games are awesome. They’re constantly pushing the envelope, especially when it comes to game design, and they run on pretty much everything except iOS devices. There’s also a huge Flash development community. Before I started doing iOS work, I worked for 5 years as a Flash developer, so the Flash world still holds a warm place in my heart.

I decided to create a library to make it really easy for Flash developers to add iCade support to their games. Even calling it a library is a bit of a stretch, it’s really just a single class, and it only takes a couple lines of code to implement:

        
iCadeManager.start(stage);
iCadeManager.mapControl(Keyboard["SPACE"],"A");
        

The iCadeManager API is super simple, but getting it to work correctly was pretty tricky. The main issue I had to overcome was that the iCade uses 24 different keys to send its messages, but most Flash games already use the keyboard, so there could be tons of conflicts. In Flash, you can’t tell which keyboard a key press comes from, so it’s impossible to tell whether a key press is a real key being pressed or one of the many keys the iCade uses.

My solution was to implement a special “iCade” toggle to turn on and off iCade mode in Flash games. You activate it by holding the top four buttons of the iCade at the same time. When the game is in iCade mode, it swallows up every incoming key event and converts it into the key event you’ve assigned for that iCade input. Check it out in the video below:

The Playbook

My final challenge was getting the iCade working with the Playbook. Unlike the iPad, the Playbook supports Flash in the browser, but unfortunately a huge number of Flash games are still left unplayable because they’re built for use with a keyboard. Luckily, the Flash Player in the Playbook’s browser still gets keyboard events from any synced Bluetooth keyboard, so iCadeManager worked perfectly, which you can see in the video below.

Get the code

All the code for iCadeManager is on Github, and like I said before, it’s literally a single file, so you have no excuse not to use it! https://github.com/MattRix/iCadeManager

If you want to see a demo of it in action, I retrofitted the Flixel EZPlatformer tutorial with iCadeManager: try it out here (remember to hold the top 4 buttons to turn on iCade mode).

Parting thoughts

So to wrap up, the iCade is awesome, and being able to use it with Flash games is pretty sweet. Now all we need is a bunch of Flash devs to add iCade support to their games :)

If you have any questions or issues, please post a comment on this post or send a message @MattRix. I’m tempted to start curating a list of Flash and iPad games that support iCade, so if you think that’d be cool, let me know. Oh, and if you make any games using iCadeManager, I’d love to hear about them. Cheers.

This entry was posted in Flash, iOS Development. Bookmark the permalink.

8 Responses to Thoughts on the iCade (and on using it with Flash games)

  1. Vague Rant says:

    Hi Matt, very interesting stuff. Just wanted to let you know I used this piece as a reference on the iCade Wikipedia article. Your library is mentioned in the third paragraph under the Development header.

  2. Nicholas says:

    Ha haha… great article Matt, you are getting pretty good at this.

  3. Pingback: Big Runner | Struct.ca

  4. arlanda says:

    Hey that’s great. Do you think it’s possible to get iCade to work with different console emulators for the Playbook?

  5. Pingback: Snes9x for Blackberry Playbook: Official Thread - Page 28 - BlackBerry Forums at CrackBerry.com

  6. Juan Fernando says:

    A very good solution for iCade support for Flash games, but this is only for web or desktop flash games ?

    Any Idea on how to implement iCade support with AIR for iOS Games ?, AIR in iOS doesn’t listen to keyboard events either using Stage or NativeApplication keyboard listeners.

    My solution was very very tricky, I’ve overlay an alpha zero textField over the entire screen and listen to its onChange event, then some parsing processes capture the keys pressed and then sends real keyboard events that can be listened using Stage.

    If you know how to listen Keyboard events in AIR for iOS, please tell us, thus your API will be a very great tool to implement iCade support for Flash Games in iOS.

    Thanks

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>