Adam Saltsman (AdamAtomic) is a game developer and the creator of flixel (an opensource AS3 game library). He recently spent some time answering a few questions about how he began in Flash and the work he currently does.
Hi Adam, tell us a little about your background and how you got started building Flash games. Are you a self taught developer?
I took some programming courses at university and then worked for a couple of years as a software developer for a small company here in Austin. I left there to be a freelance artist for a few years, and it was during that job that I started picking up Flash. My friend Ivan took a couple hours out of his day to show me the ropes and I was off! About 6 months after I started is when I began to experiment with higher-performance pixel flash stuff. It took at least another year or so of side work to get the first version of flixel formalized.
A lot of people, myself included, got starting in Flash because of games. What do you contribute to your success as an independent game developer and what advice do you have for others who want to live the dream?
Make small games! Make little polished demos or prototypes and share them with everybody. This is not necessarily the route to financial success but in my experience it is the best and fastest way to learn how to design games. I’ve made maybe a dozen or so 1-week games and I’m just beginning to feel really comfortable with my design process.
Your Flash games have a retro pixelated look to them. Talk about how you handle bitmaps on the stage, do you use a tile engine, blitting, or other techniques to attain fast response, low memory, and high frame rates?
Flixel uses a layered rendering approach. First flixel checks to see if the graphic has been scaled or rotated, if it has, then it uses the Flash vector renderer to draw it, just like a normal Sprite or Movieclip object. However, if it hasn’t been rotated, even if it has been tinted or the alpha has changed, Flixel uses a very fast blitting call (copyPixels) to stamp the graphic onto the graphics buffer. The graphics buffer is scaled and rendered using the vector renderer (to achieve the chunky zoomed pixels effect).
It’s interesting to see that you don’t just develop games in ActionScript. Talk about the other platforms you develop on and if there is any similarity to working in Flash?
My “day job” as it were is building games for the iPhone in C++ and Objective C. Objective C is actually oddly similar to Flash in some ways, just with more brackets!
Paper Moon, which was done in Unity 3d, is an incredible platform game with a slick cutout paper style. Can you tell us about your contribution to the game’s development?
Paper Moon was a collaboration with Canadian studio Infinite Ammo, who were interested in learning Unity for future projects. I was only too happy to oblige them with some artwork!
Developing games is incredibly demanding on a system’s resources especially Flash which lacks any GPU acceleration. Talk to us a little about the steps you take to ensure optimal performance within the code itself.
Flixel only does a few things for performance, one is opting out to using copyPixels instead of the vector renderer whenever possible. That gives about a 90% boost in performance most of the time. Using the zoomed-up chunky pixels is nice because you are still filling a lot of the browser window, but the actual render operations are performed in a pretty small space. Finally, flixel encourages but does not require you to recycle your game objects. All the demo games up on github use pre-allocated arrays for things like bullets or particle effects. Objects now have a reset() function that helps make that even easier to do.
On a normal game project, how many people do you usually work with and what are the typical timeframes?
Just me, and 4-7 days. This may be changing though, I have some bigger stuff on my plate for next year…
If you could pick one thing, what would you consider your favorite part of ActionScript 3? Likewise, what would you change or want implemented?
Generally speaking I love how sloppy it is. If it was a stricter language I think prototyping and iteration would be a much slower, more frustrating process. Some things I have trouble with are assigning values to primitive parameters from within a function (I may just be ignorant of a particular assignment operator for this) and also creating references to functions that belong to other objects on the fly. That may be due to my own ignorance as well, but here something like the way C# handles function pointers (delegates?) might be useful.