"The 2010 Intel AppUpSM developer challenge Grand Prize winner, Most Elegant Application."1
"Ancient Frog is a graphically stunning, meditative brain bender based off of an entirely original idea, and one of the App Store's true hidden gems."2
"It takes special artistic gifts to make something like this—a game that is so playable, so beautiful, and so stunningly out of left field that even jaded critics like us can’t help but rave about it... Ancient Frog is a real achievement from top to bottom, and it might just be our new favorite iPhone* game."3
As one of the best-looking "games" for the Android* platform to date, with fully animated frogs controlled by your fingertips, this is a must-have app for every stressed-out Droid owner needing some downtime."4
"Ancient Frog is also available in high-definition and gloriously expanded form for Intel® Atom™ processor-based netbook computers, via the Intel AppUpSM center."5 And, the tablet version will be available soon.
So, how does an app get rave reviews on multiple platforms and reach a wide audience, from the tech savvy to the general consumer, on multiple stores? What are the development challenges of going cross-platform? How can you take your next great idea all the way from eureka to distribution? Ancient Frog Workshop founder James Brown is a "developer's developer" who brings expertise and a continual willingness to push the boundaries to his projects with exciting results.
For James Brown, the key to making an interface intuitive on multiple operating systems and multiple screens is simplify. Through an iterative working process shaped by experiencing his apps on multiple platforms, Brown hones the app experience to the essentials. "What you leave out is sometimes more important than what you put in," says Brown. It can be hard for developers to cut features that they've spent considerable time on, but in the end, providing a smooth, seamless experience and ensuring users can engage quickly with an app is critical. Observing and accommodating how people approach an app can provide insight into ways to increase its simplicity.
Conversely, design details that may be less complex on the back-end can have a significant impact on the user. Brown advises spending time on the front-end elements, from visuals to transitions, that help shape a user's first encounter with an app.
Brown looks closely at what users do with his apps and finds that user expectations are evolving rapidly. Just because a device offers functions is no guarantee that users will know how to use them. For example, Brown received the most support requests from Palm* users who didn't know how to use the device's gesture capabilities. "There's no substitute for putting an app in front of users and seeing what happens." The extended Intel AppUp developer community also offers another avenue for inside tips and feedback on enhancing the user experience—whether through forums or blogs, or technical support.
"There's no substitute for putting an app in front of users and seeing what happens."
Ancient Frog is visually stunning—the fruit of Brown's own passion for photography and 2-D layering techniques he developed to bring static photographic images to life. Adding layers for lighting, textures, and shadow, and allowing those layers to continually move and combine creates a vivid glowing effect; brings out highlights; and produces intense, saturated color.
High-resolution source images were sized to different device screen proportions, and code automatically checks screen size and adjust layers accordingly. Adds Brown, "The code handles the very large source textures on platforms where I haven't been able to size them for a single screen size. These large textures are stored in a compressed format. The cunning part is that the code skips the larger MIP levels, so for a 2048 x 2048 texture loading on a device with a 480 x 320 screen, it skips the 2048 and 1024 levels, and just loads from 512 down. No unnecessary video RAM or loading time is expended." All of the textures are provided at the same pixel density. The code sets a global "texture quality" based on the size of the screen, and that value is used at loading time to determine which MIP level to start loading from.
Brown uses two different builds, depending on the physical size of the screen. Tablets, laptops, and desktops get one version; phones and portable devices get another.
Brown has an ambivalent relationship with audio. Often the largest part of an app file, it performs differently on each platform and can cause bugs on many systems. Ancient Frog originally had a music score that was replaced with an ambient soundtrack toward the end of development. This creative swap was a success, supporting the environmental realism and meditative quality of the app experience.
In creating for multiple platforms, Brown finds starting with the lowest common denominator an inspiration, rather than a creative constraint. His goal is to develop an app that is intuitive regardless of a platform's special features. Ancient Frog relies on a single button to initiate play, which translates easily from PC to a multi-touch device.
Getting the code base so that it can respond to resizing, and understanding the impact for every platform from a tiny 2x2" window to a full-screen PC gave Brown ideas on how to further polish his app. Brown didn't want users to have to restart the game each time the resolution changed, so the app needed to resize on the fly. Content seamlessly rearranges itself to fit the screen, even for tablet users flipping screens in mid-game. UI buttons or nav that ended up in the way of the play area had to be rethought.
Adapting to different screen orientations and resolutions required a design that would transition seamlessly for users. The solution for Brown was to save user progress at every point in play—this eliminated the "do you want to quit?" dialog box for PC users and allowed instantaneous response on an iPhone.
The key for Brown was designing a primary square for game activity with a more decorative background that could expand or shrink as needed. Even on the smallest device, a single texture square can adjust to the aspect ratio without losing any game essentials. On-screen menus were reduced, so that as little as possible needed to be rearranged during orientation shifts. Tips from Brown include rotating essential buttons without changing their position, or moving text or icons without rotating the underlying button.
Discoveries on one platform can bring insight on how to improve the experience on another. Ideally, developers should aim to work on as broad a cross section as possible, and design for each platform as if users bring no inherent platform knowledge. When it comes to porting, code samples and techniques are among the resources available from Intel AppUp to smooth the transition from one set of platform requirements to another.
Brown's penchant for simplicity and desire for autonomy extends to his use of tools such as coding languages, compilers, and libraries. His language of choice is Microsoft Visual Studio*, based both on familiarity and flexibility. Most of his development work, from creation to testing and debugging, happens on a PC. Once the core app is solid, it's fine-tuned to meet the unique requirements and limitations of other platforms, including iOS*, Android*, Symbian*, WebOS* and AppUpSM for Windows*, and MeeGo*.
While the received wisdom is to take advantage of libraries, rather than reinventing the wheel, Brown has discovered that cross-platform development requires a degree of control that is not always served by existing libraries. "Sometimes you need a different type of wheel," says Brown, who has analyzed how to remove most external dependencies for his app. "Just because something is written, doesn't mean it's going to be less work than what you write yourself." By gradually building out his own engine, he can avoid some of the complexities of different platform licensing requirements. One component he does use is an STB image file (stb_image.c, available at: http://nothings.org)—a bit of code that handles image formats, but can be dropped into the source code and compiled with the rest.
The Intel AppUpSM SDK currently supports MeeGo and C/C++, .NET, AIR, and Java apps for Windows, with other languages and runtimes in the works. This helps developers such as Brown find a comfortable and reliable foundation for app creation.