Archive for the 'Flex Examples' Category

26
Sep

Corona continues to add essential features ahead of AIR

As an update to my previous post, Adventures with Corona, Part 1: What Corona offers that’s better than Adobe AIR, I thought I’d take note of some new features in a recent release of Ansca’s Corona SDK. In particular, Corona developers now have access to more useful services. Services that we simply cannot use in AIR today, for various reasons.

Game Network

Last time, I noted that OpenFeint support in Corona could only be used with iOS. Thankfully, OpenFeint works on Android now too. Moreover, Corona developers have been given a choice between OpenFeint and PapayaMobile. Leaderboards and achievements for all. More and more, I’m finding that I’d rather integrate a service that focuses exclusively on this sort of thing because the experience can be far better than a home-grown solution (at least for an indie developer, like me).

Advertising

Ansca has also partnered with InMobi to bring advertising to Corona apps. Whether it’s to monetize a lite version or to go completely free and try to mimic the typical route of free web games, ads are extremely important. I’ve been waiting for quite a while now for the ability to try releasing a free game with ads. Since I’d rather not go fully native, I needed a supported library from an ad network (which apparently isn’t a priority), or ad support in my platform (thanks, Corona!).

Hold on there, AIR

Day by day, I realize that while AIR is getting some cool features that can wow the senses (like Stage3D), Adobe is forgetting, ignoring, or not prioritizing features that keep a roof over a developer’s head. Some things players expect or demand in games, like popular social networks for leaderboards and achievements. Others help us earn just a little more money, like advertising and in-app purchases (both of which can be useful outside of games too). I immediately felt limited without these essentials back when AIR on mobile was first introduced, and it’s been frustrating to see little support from Adobe or third-parties after so long. Maybe that’ll change with native extensions, but those are still a bit further away in the future.

26
Sep

Indie Flash Game Development: 2010

About a year ago, you may remember that I shared my revenue numbers for indie game development in 2009. I had big plans for Bowler Hat Games in 2010, but I guess I spent my time going in the wrong directions. Here’s a look at how my business is doing one year later.

The Breakdown

In total, game development earned me $20,009 in 2010. That’s about 32% lower than last year, and I spent an equal amount of time developing games during both years (I worked on other projects for about four months during both years). Revenue is divided between four sources, game contracts, mobile sales, advertising from existing web games, and non-exclusive licensing. I didn’t create any new Flash web games, so there were no primary sponsorships this year.

2010 Revenue Breakdown

As with last year, most of my income came from contract work, earning me $15,900. I spent the least amount of time on those projects—maybe a month and a half. Continuing ad revenue from the three Flash games I released on the web last year earned me an average of $198 per month. Mobile app sales brought in an average of $131 per month. I sold one non-exclusive license of a Flash web game for $150. In total, that’s an average of $1667 per month, with contract work covering the vast majority of that amount. Living in the California Bay Area, that covers my rent for a one bedroom apartment and groceries, but between other bills and, of course, income tax, I’ll need to make a lot more if games are going to cover my expenses.

iOS and Android Games

At the end of last year, I had converted two of my three Flash games to iPhone, and revenue was already proving to be modest at best. This year, I finished porting my third Flash game to iOS, and I released some updates for each of them. Sales never picked up much, though. Additionally, I removed my games from the App Store for a couple of months while Apple was being stubborn about the Flash Packager for iPhone, so there was a bit of time mid-year where I received no income from selling apps.

Adobe released AIR for Android this year, and I had all three of my mobile games ready for sale at launch. Unfortunately, I had them ready for several months before I could actually sell them. Unlike Adobe’s solution for iPhone, which embeds the runtime into the app, the Android version of AIR is a separate install, so I had to wait for the official release. I’m finding that sales of my games are lower in the Android Market than in the iOS App Store. In December, iOS sales were about five times higher than Android sales. It’s too bad because creating mobile AIR games on Android is actually a lot of fun.

Mobile isn’t a walk in the park

Ultimately, I believe that I spent too much time on mobile this year. I would have been better off designing new games and getting sponsorships instead, or maybe I should have started exploring downloadable desktop games or microtransactions. Last year, I said that sponsorships didn’t seem like they could earn me enough (at least for the type of games that I make), but mobile has proven to be an even harder nut to crack. It’s probably my lack of marketing skills. With sponsorships, I can visit FlashGameLicense and have a community of portals and other sponsors who are there to pay for games like mine. With mobile games, I don’t have a central source to locate my audience. At best, I know that players of the web game might be willing to buy a mobile app, but beyond that, I’m a little lost.

I’m still waiting on a supported advertising solution for AIR mobile. I don’t want some API that the ad network says works for “everything else” while only native code gets a real SDK. Free versions of games that are ad-supported can be a great way to get players to consider the paid version while still bringing in revenue. I’ve considered the possibility of converting my mobile games to HTML and JavaScript because I know there are frameworks that integrate better with native libraries that provide advertising and other services for games. However, with such low revenue on mobile already, I’m worried that I might be wasting even more time by trying that. It will require more development and testing than my recent HTML5 port of Gridshock, which was more of a fun project for the holiday break than a serious one. I was able to take shortcuts. With a paid product, shortcuts are not an option.

2011

I’m probably not touching mobile for a while, except maybe for fun weekend projects. Even so, I very much want to play with tablets at some point, but I think I’ll wait until some are released with Android Honeycomb. All the hardware coming out is kind of overwhelming. As an indie developer, my wallet cringes at the idea of ensuring I own even a minimal collection of test devices.

As for what I will be doing this year, I intend to start out with a sequel to Gridshock. Hopefully, with Gridshock’s success as evidence, I can get a better sponsorship deal than the original. From there, I may consider a desktop version that combines both games. However, I kind of want more than two game modes in a desktop app, so I may explore other ideas for sequels first. I might include an exclusive game mode or two in the desktop app to ensure that it provides enough value over the free versions. That’s still brewing for the moment. Right now, I just want to focus on finishing a game to be sponsored.

With lower numbers in 2010 than in 2009, I’m feeling a little down. At the same time, though, I’ve found myself surprisingly motivated over the last couple of weeks. I spent one night coding until 4:00am. I’m attacking my to-do list with enthusiasm every day. Last year’s numbers, I think, are helping me work harder because they’re more frustrating to me than depressing. I want to make Bowler Hat Games a success, or at least ramen profitable. The way I did things last year clearly didn’t work, so I’m just going to try harder and see if I can figure out what works better. Wish me luck.

26
Sep

Choice

Where I am today, in life and my career, is thanks to a powerful drive to always learn, grow, and push my limits. I’ve rarely encountered much internal conflict related to this process. Often, I have a wealth of things that I might choose to work on. In the past, I typically picked something that seemed fun or interesting at that particular moment. That was pretty much the only criteria. Now that I have the freedom to spend more time on personal projects, especially ones that earn revenue, I’m having difficulty continuing with the same process. These days, I feel like I need to prioritize. As a result, I feel like I’m missing out on wider explorations that I would have chosen in the past. Lately, that’s been troubling me.

As you probably know, I started creating casual games a couple years ago. Within about four or five months, I released three games. Since then, I haven’t finished a single new game. Actually, no, it’s time to be blunt. I haven’t started a single new game either. I played around with some ideas, but they didn’t make it beyond the early prototype stage. Those ideas simply didn’t resonate the same way that my first game, Chroma Circuit, made me want to start creating games in the first place. Gridshock and Qrossfire, my other two games, were deliberately derivative because I wanted to spend time focused on building a foundation of knowledge and code that could be used across many games in the future. Qrossfire, in particular, cemented this new direction of how to decide what to work on.

Since then, instead of starting fresh with new ideas, I’ve mainly continued iterating. I haven’t stopped expanding my knowledge in this pursuit, even with the same three games, and I’ve found enjoyment during every step of this process. I’m experimenting, adding features, and refining the experience in many ways. I’ve improved the controls, refreshed the graphics with better artwork and special effects, and I’ve added new mechanics. I still have many avenues I could explore with these games. Their modest success on mobile is just good enough that I don’t feel like they’re a complete dead end, but they’re also doing just bad enough that I’m driven to continue with them just to prove that I can do better.

For some reason, though, I feel kind of stuck. Part of me wants to move on and try new genres of games. I want to get back out of my comfort zone and force myself to write code for things that are more advanced than what I’ve done so far, or at least work on things that feel newer to me. Obviously, I’ve only focused on the same sort of game. Maybe that’s slowing my advancement. Not to a halt, or I’d be completely bored, I would have moved on to something different by now. Instead, it’s enough to keep me interested, but I’m clearly not propelling the same way I used to in school and during my early career.

I can see the deceleration just in the fact that I don’t blog as much anymore. I don’t say, “hey, look at this random cool thing I worked on last weekend” very often these days. I’m okay with that, to a certain degree, because my blog posts have been getting longer too. When they’re finished, I feel like I accomplished something, and that they include more insightful information now than I could include in my old writings. Of course, I’m far more active on Twitter now than when I was blogging weekly or monthly, so it’s not like I’ve disconnected myself from the Flash community that I first joined thanks to my blog posts.

Even after writing down my thoughts, I’m not feeling any more decisive. I’m frustrated with myself for not finishing a few projects that would bring my existing games to new platforms. They’re at least halfway done, if not more, so I’m feeling like I wasted time if I don’t get back on track with them. Then there are way to improve the games and learn more by adding features that I’ve not tried implementing yet. Micro-transactions. Achievements. Stuff like that. On the other hand, I have those prototypes that would easily make playable games, if not necessarily breaking new ground for me, and I have a few ideas that are still simmering in the back of my mind that I want to start exploring. I want to reach a point with one of them where I’ve verified that the idea is fun, and it excites me to move from prototype to the complete game.

Both directions that I keep comparing pull at my interest, but I don’t want to split up my time between both of them either. I feel like I need to choose because the day has too few hours to work on everything at once. I’ve already divided my time between games and other software. There are other activities, not involving programming, that I want to dabble in too. Every project I continue to work on is interesting to me in different ways. That’s the hardest part about making choices in this area. I want to fit everything in, and I want to get it all done in the time it would take if I chose just one. You might say that all that potential is a good thing, but it feels like a major barrier to me.

26
Sep

Adventures with Corona, Part 1: What Corona offers that’s better than Adobe AIR

During the last month or so, whenever I could spare an hour, I’ve been working on a port of my game, Gridshock HD, from Adobe AIR to Ansca Corona so that I could release it for iPad. If you’re not aware, Corona is a mobile development platform that can target iOS and Android. It was created by some folks who were once involved with Flash Lite, so it’s quite relevant to Flash developers. It’s not perfect, but there are a few useful features that Corona offers and AIR is missing. I want to use my experiences to make some requests that I hope Adobe will address in upcoming versions of AIR.

Language

I, and I think many Flash developers who have been around for a while, kind of miss dynamic languages. I often hear that Flash isn’t as “fun” as it used to be. I can relate. It would be great if we could use something less strict than ActionScript 3 in our Flash projects. Yes, I know I can turn off strict mode, but if I’m going to use ECMAScript, I want AS3′s dialect to be updated with features that have been added since ES4 was dropped by the committee. There’s some cool stuff coming in Harmony.

Lua logo

Corona includes Lua, which is my new favorite language of the moment. It’s super flexible and a lot of fun to work with. If there were a way to compile it down to bytecode that could run in Flash, I’d consider switching to Lua over ActionScript 3 for much of the Flash content I create. AS3 is good for Flex apps, but for games, web experiences, and stuff like that, a dynamic language like Lua (or modern ECMAScript) would be more fun for me, and enjoying my work is a top priority.

For reference, this is a minor need compared to the ones that follow. I can live with AS3 for all my Flash development. It’s a decent language, but I simply desire a little more choice. If you look at JVM or other runtimes, they all have extra languages beyond the main one(s). I want to branch out more, and it would be awesome if I could keep a foundation in Flash.

Graphics

OpenGL logo

Corona offers OpenGL-accelerated graphics. I had no rendering performance bottlenecks, and it was a dream. However, we all know that AIR will be getting Molehill hardware-accelerated APIs in an upcoming release. Corona has the advantage now, but it may not be for long.

Libraries

Corona includes out-of-the-box support for OpenFeint and Game Center. These services are considered a requirement by many mobile gamers these days, and they’re sorely missed in mobile AIR game development.

OpenFeint logo

Developers simply need a way to run native code with AIR. There are compelling third-party services that only provide native libraries, and we can’t use them if we want to develop with AIR. Even worse, many are unlikely to be added to the runtime, so without native libraries, we’ll never be able to use them. In addition to game leaderboards and achievements, I know many would like to access things like in-app advertising and custom hardware or accessories. Moreover, being able to use native libraries will help us avoid rewriting existing libraries that are already working well in a native form. It expands the reach of AIR and saves time and headache. Native code would be a major win, for sure.

Runtime

Everything you need for Corona is included in the output. There’s no separate runtime. I suppose it’s similar to how AIR app work on iOS. Developers like me want to include the AIR runtime with Android apps too. I strongly dislike requiring my users to install a runtime before they can play my games. It’s an extra potential point of failure, and it feels somehow unprofessional as a potential source of annoyance for the user. While you’re at it, allow me to include the runtime on Windows, Mac, and Linux as well.

Adobe AIR logo

The age when separate app runtimes were a valid choice for targeting consumers is gone. I know games are a big focus for Adobe right now. Flash Player is a huge target for casual games. I’d love to use AIR to release commercial desktop games that are more polished, bigger, and better than my free web games. However, asking potentially-inexperienced users to install or update AIR is a big reason for why I’m not exploring AIR on desktop for games. Adobe has probably done the best it can to make the install experience painless, but I just can’t get over being wary.

As for updating AIR, let’s be honest. The latest version of AIR doesn’t get installed as quickly as Flash Player. I’ve never heard Adobe talk about stats for AIR runtime installs. Given how often Adobe presentations include the graph with Flash Player installs, I refuse to believe that they wouldn’t be sharing AIR install graphs too… unless they’re just not impressive. Let me package in the runtime, and I’ll never need to worry about the AIR runtime version. I’ve heard that a ton of Java apps package in the Java runtime now for similar reasons, and I’m sure that’s way bigger than AIR, so let’s get with the times.

Mobile is still a new frontier, and closer to the casual experience on the web, so I’m tolerating a separate runtime on Android, but my feelings are much the same as with the desktop runtime.

A Tight Race

In a follow-up post, I take a look at a few things that I don’t like about Corona. Yes, the coin flips both ways. Corona has some advantages that made it an obvious choice for my iPad game… today. However, AIR is not that far behind Corona in this particular race. In some ways, AIR is much further ahead. To put it simply, I was willing to make some trade-offs in development comfort to get the features I wanted. I didn’t like that, but I sucked it up and only grumbled to myself.

I know both technologies will be improving over time, but I think that Corona is going to need to fight harder to stay on top in the situations where it holds my interest right now. So far, I’m only interested in Corona for iOS support. That’s a precarious place to be when there are a variety of pros and cons on both sides.

26
Sep

Adventures with Corona, Part 2: Where Corona Needs Improvement

In my first look at Ansca’s Corona SDK, I mentioned several features that Corona offers where Adobe AIR is currently lacking. These were compelling enough for me to rewrite my tablet game, Gridshock HD, with Corona for the iPad version. That said, it wasn’t all sunshine, lollipops, and rainbows. Some of Corona’s core APIs and functionality can feel a bit half baked in places. Let me share some of the places that seem, to me, in most need of some love.

Platform API Support

In Corona, there are a number of features that are currently only supported on iOS. Among the most compelling features, I noticed that In-App Purchase and OpenFeint are both marked iOS-only, and there are some others too. In particular, OpenFeint’s leaderboards and achievements are a big reason for why I chose Corona for Gridshock HD on iPad. I know that players demand OpenFeint and/or Game Center, and I simply cannot use either in AIR right now. As great as it is to see OpenFeint available in Corona, I’m not a big fan of runtime-included features that aren’t cross-platform.

On the other hand, the ability to extend Corona with native code would be awesome, just like it would be awesome to have the same thing in AIR. If native extensions existed, the power would be in my hands to choose whether I want to (or am even able to) implement a feature on a specific platform. The development effort for robust extension APIs is, of course, a big task, and I understand that a young platform like Corona might want to include a few high-demand third-party features out of the box before they get around to more daunting things.

Regardless, I’m sure that there are constantly feature requests for Corona to include an API for <insert personal favorite library here>. If native extensions were available, individual developers would be free to add two very valuable types of functionality:

  1. Highly specialized features that few other developers need.

  2. Features that might be coming the future, but there’s an immediate need that cannot wait.

With those out of the way, Ansca can focus on core APIs that work well across all supported platforms and that are useful to the largest majority of their customers—making everyone happier. In addition to native extension support in the runtime, a place to share (or maybe even sell) extensions would be ideal so that folks like me, who never want to touch Objective-C, can look through what others have already built.

Simulator

In the simulator, what you see on your PC may not be what you see on the device. Sometimes, that’s impossible to fix, since some features just can’t work on desktops (Although, I’d like to see more console output that basically says, “you called function X correctly, but it cannot be used in the simulator. Please test on device”). Sometimes, though, the simulator can do things that device builds cannot. In my opinion, that’s much worse. For instance, I saw multi-line text working in the Windows simulator, but discovered that an iOS build only displayed a single line. With simulators, it’s best not to get my hopes up.

The Mac version of the simulator has skins for iPhone and iPad. It makes sense, on one hand, because the Windows version can’t output iOS builds due to Apple’s stupid rules. However, I can’t be the only Corona developer who codes on Windows and builds on Mac. Even if it requires extra notification that I can’t build for iOS, those skins would be super helpful. Alternatively, I would like to be able to add completely custom device skins. In the latter case, all I really care about is specifying a custom screen resolution for the device. If I can get 320×480 or 640×960, then I simply don’t care if the skin looks like an iPhone or not.

Finally, the console output for runtime errors in the simulator always seems to get cut off. On Windows, at least. I can’t remember off-hand if the Corona Terminal on Mac has the same problem. Anyway, I can live without a debugger, but then the stack trace must be as detailed as possible when that’s the case. Half missing information could be the difference in finding an error in seconds versus finding an error four hours later. I’m sure you can guess which I’d prefer.

Language

Lua’s standard library is probably as stark and barebones as you can get. Basically, it provides some math functions, some string functions, and a few functions that turn a table (usually called an object in other languages) into an array by adding and removing from numeric keys. Some of the most basic things I’ve come to expect from a standard library just aren’t there. For instance, how often do you call indexOf() on arrays? I do it all the time, and I was forced to write my own version in Lua. It may not be optimal, and I’d rather use something that a dedicated person or team has vetted better than I could with my time constraints.

On one hand, the small standard library makes sense. The language itself is tiny, and that’s a big advantage. On the other hand, I wonder if the wheel has been reinvented tens of thousands of times by various Lua developers. From what I can tell, there isn’t one true community-supported standard library out there, like I would have expected. Maybe I missed it. Honestly, though, I get the impression that most people throw the Lua interpreter into their C++ games and write super short scripts that don’t need much supporting utility code. Anything complex just goes in the C++ layer.

Corona is different. In Corona, all your code except the super low-level stuff is written with Lua. Corona developers have a more pressing need for a robust standard library that is closer to what’s available from the top-level classes and functions in JavaScript or ActionScript. If Ansca has big dreams for much larger game projects built with Corona, they need to spend some time filling in the gap here so that developers aren’t bogged down in low-level implementation.

Moreover, if Ansca wants to support any kind of open source community, a standard library declared from on high will nip a couple of potential problems in the bud. Since I’ve yet to see any Lua code that uses some sort of namespacing, name collision is pretty much inevitable. Likewise, duplicate functionality will be rampant as everyone includes their own flavor of the missing core library. For anyone that wants to mix and match third-party libraries, that’s going to be a mess of headaches. As Corona-targeted libraries get more complex, the chances of this happening grow exponentially.

Choose the Best Tool for the Job

I enjoyed porting Gridshock HD to Corona. I learned a new language that I hope to develop with again in the future, and I was able to take advantage of features that aren’t available to me in my usual environments. It has given me some inspiration and expectations that I intend to take back with me to Flash. I might be a little more harsh on Adobe’s runtimes when I give feedback now, but any criticism I make will be because I want to see Flash Player and AIR continue to be the best at what I use them for.

Am I now a Corona developer? I’m certainly not leaving Flash behind. However, I’ll be keeping an eye on Corona to see where it ends up. I don’t have current plans for more Corona games, but I may change my mind if certain features are compelling enough, or if I decide that I haven’t played with Lua enough lately. We’ll see. It’s another useful tool to have at my disposal. I’m very glad that I spent some time learning to use it.



Get Adobe Flash playerPlugin by wpburn.com wordpress themes