Monday, September 23, 2013

Flight Odyssey Released

We are proud to announce that Flight Odyssey has now been released on the Google Play Store for Android and the App Store and is now also available at the Amazon Appstore for Android.
Android app on Google Play Available at Amazon
Not sure? Try it for free on Google Play. If you run an app review site, work in the journalism/media field, or have at least 1000 friends/followers on a Social Media website and are interested in reviewing our game, please contact us at to request a free promotional code.

Here are some helpful links for new players:

Current versions: v. 1.006-1.028 Built with Corona SDK

Friday, September 20, 2013


Lua and Javascript are surprisingly similar languages, as I was happy to learn (coming from a Javascript background). Both of them are very loose in handling data types, don't require classes, and have a nice feature called closure. That's by no means an exhaustive list of similarities, of course. However, today I thought I'd write about some differences in how each of them handles closure. Take a look at the two code samples below:

function main()
    local printFunctions={}
    local i,j
    for i=1,10 do
        local printi = function()
    for j=1,10 do


function main()
    var printFunctions=[]
    var i,j
        var printi = function()


Both of these would appear to be identical. They create 10 functions which simply print the value of i. Then, each of the functions is called. You would expect the result to be "0 1 2 3 4 5 6 7 8 9," right? That's correct in Lua, but not for Javascript. Javascript prints "10 10 10 10 10 10 10 10 10 10."

The following explanation is not accurate. See this Stack Overflow question for details.

Inaccurate explanation:
So why does this occur? It occurs because Lua and Javascript handle closure in different ways. Lua treats the closure as part of the function reference itself (see this reference), and therefore each time you create a function reference you get a new copy of the variable. The function is created 10 times, with i having values from 0 to 9 during those initializations, and therefore the numbers 0 to 9 are printed.

Javascript, on the other hand, creates a closure based on the variable declarations (see this reference). Since i was declared in the main function, i can only have one value for each time the main function was called. The main function was only called once, so i has only one value, and that value is 10 at the point when the functions are called.

Perhaps this is better explained with another example. What if we changed the anonymous function to print j instead of i? In Lua, nil is printed 10 times because at the point where the function is declared, j is nil. By contrast, in Javascript, the numbers 0 through 9 are printed, because at the point where the function is called, the j from the main function ranges from 0 to 9.

Hopefully that was helpful to anybody else familiar with Javascript and trying to learn Lua. If anybody else has a better way of explaining the difference, please feel free to leave a comment.

Useful Tools and Thank Yous

Now, I know that my Credits blog post already thanks all the groups who helped make Flight Odyssey possible. However, that was kind of cold and legal, so I'd like to take this opportunity to talk a little bit about each of the services that were most helpful. The purpose is twofold: first, to give out some well-deserved credit, and second, to help other developers who are trying to build apps without a huge infrastructure of support.

Let's start off with, one of the most crucial resources in my search for images. provides clipart/vector images licensed under CC0 (effectively public domain). It has a huge variety of images, and the price is right! The majority of my images come from this website, so I am incredibly grateful.

That said, let me point out a few caveats that may be of aid to other developers. First of all, the search engine built-in to is pretty awful. My recommendation is to just use Google Images, but limit the search to using the advanced search options. The other major issue is the ads. When I initially found, I was using Chrome AdBlock, so I didn't realize that this was a problem. However, as soon as I switched to Firefox, I suddenly realized the website's ulterior motive in providing this great public service: lots of ads! (In fact, I was so surprised by the ads that at first I though they were being inserted by a virus on my computer.) Related to this is the fact that many images on are actually downloaded from, so it may pay to try that site as well and see which you prefer.

Next, Bitbucket. I hate to admit it, but this is my first project where I've used a formal version control system. I can assure you wholeheartedly that I will be using it for my next project as well. At least once or twice I was spared from hours of work by a backup in Bitbucket, and several times the reassurance that the backup was there let me be more aggressive in making changes. To put it bluntly, version control is awesome, and Bitbucket implements it really nicely. Not only do the provide you with free private repositories for up to 5 users, they also have a nice GUI (SourceTree), a decent issue tracking system, and everything you would expect out of a paid Version Control system (despite being free). One caveat: they don't have an official mobile app or a mobile-friendly website (helpful things when testing on devices and reporting issues), but BitBeaker is an Android app which interfaces through their REST API and works nearly as well as an official app would.

TexturePacker logoAnother major issue I've faced in my project is performance. Some performance issues, of course, are related to memory consumption, while others are more complex. One tool, though, that I believe has greatly improved Flight Odyssey's performance is TexturePacker. I first discovered TexturePacker when I read this article/video. Just like Corona SDK, that video made some pretty bold claims about the performance benefits of TexturePacker, but they appear to be true. I'll admit I was skeptical at first, particularly when the initial impact of the software was to increase texture memory usage by a factor of 6 (since all images had to be loaded, not just the ones in use). Nonetheless, when I ran my app on a device, performance appeared to have dramatically improved. I still don't really know how that worked, but I suppose the theories presented in the video must be accurate. Not only does TexturePacker improve performance, it also provides a better way of organizing sprites, unlocks several features of Corona SDK that are only available with sprite sheets (like easy animations), and can decrease the size of the app. The biggest drawback is that it costs $40 to get the full version. Fortunately, you can use the essential mode for free (though it lacks some of the optimizations) and bloggers/framework developers can get a free license for the full version.

Some other helpful tools include GIMP (a great way to fine-tune the free clip art from for a specific purpose), Paint.NET (like GIMP but lighter weight), ImageAlpha (for image compression), and Notepad++ (once I discovered that you can create a workspace in the sidebar, I never had to use another text editor).

Built with Corona SDK And of course, this list could never be complete without Corona SDK. I've mentioned before how impressive it is, to the extent that it inspired me to create this app, but it can't hurt to repeat it.

That's all, and thanks for reading! If you would like to suggest any other helpful tools for independent game development, feel free to leave comments!

Thursday, September 19, 2013

Demo Video

Yesterday, I set out to create a demo video for Flight Odyssey. I knew it wouldn't be easy, but I expected the tricky part to be the video editing. You see, previously I had tried screen recording directly from a device using adb, but since I was getting frame rates around 0.2 fps (5 seconds per frame), I decided to just record the simulator. It turns out that wasn't much easier.
The first thing I tried was CamStudio, a free, open source screen recording software that I had used previously for a demo. I knew that it was a bit clunky (as free software tends to be), but I did not realize one crucial difference between my past use and this one. The last time I had used this software, I was demo-ing a piece of UI heavy business software. Frame rate was nearly irrelevant as I simply clicked on buttons and typed in text. By contrast, Flight Odyssey runs at about 30 fps, and at any speed slower than 20 -25 it looks unacceptably laggy. CamStudio recorded at about 10 fps, not to mention that there was no obvious way to hide the cursor and record audio.
So, I did a quick Google search and came up with two alternative screencasting programs, ZD Soft Screen Recorder 5.4 and Screencast-O-Matic. ZD Soft started off badly by recording with an odd codec (Xvid MPEG-4 Codec). After I had wasted about an hour trying to view the files it produced (which wouldn't open in QuickTime or Windows Media Player in their default configurations), I finally was able to view them using Aiseesoft Total Video Converter Platinum. They ran extremely smoothly at just about 30 fps (perhaps the odd codec helped?), but of course it was too good to be true - there was a watermark. I didn't want to spend $40 to get the full version of ZD Soft, and I didn't feel it was morally right to remove the watermark (though it wouldn't be too hard, if you left enough whitespace around the part of the screen that you're capturing), so I tried Screencast-O-Matic. Same story.
Finally, I thought I'd go back to CamStudio and give it one more shot. A little bit of searching revealed that even though the "Record Speaker" option wasn't working, this could be easily worked around by using "Record Microphone and setting the speaker as the only input mechanism in the Control Panel. The annoying cursor could be removed with the Cursor Options command. So, all thenmimor annoyances were resolved and only the main problem remained. Suddenly, I realized that there was a menu command called Video Options that I had been overlooking (I'm not sure why). It contained an option to reduce video quality and increase maximum frame rate (set by default to 10 fps for unknown reasons) which I quickly took advantage of.
All was not yet resolved, though. The resulting video, though taken at a whopping 40 fps, was a complete mess. The graphics were blurry and any movement left long artifacts trailing behind. Furthermore, any attempt to increase graphics without decreasing frame rate led the game itself to lag. Ultimately, I found a happy compromise at 20 fps and switched to recording on a desktop computer for better performance. Finally, I had my video, right?
Of course not. iMovie wouldn't recognize the file format that CamStudio produced. So, one last step was necessary - back to Aiseesoft Total Video Converter to convert .avi to. m4a. At last, all was well.
Hopefully that was helpful to anybody else hoping to make a video demo of an app - the video I made is available here on YouTube. Thanks for reading!

Sunday, September 8, 2013

Beginning of the Odyssey

Flight Odyssey began with an app called Finger Hoola, which was the free app of the day on Amazon's Android store one summer day in 2013. It was "Made with Love & Corona SDK," it claimed, and that made me curious.

So I did some research on Corona SDK, and I liked what I saw. It bragged making development 10 times faster than Objective C 2.0 or Java for Android development, the two most popular "native" tools for smartphone app development. That's a bold claim, but from what I could tell, it was true, at least for relatively small programs. My previous attempts at apps had used Objective C 2.0 and ended in disaster.

Not only was Corona SDK less over-engineered, it also boasted that it could be deployed to four different app stores (Android, iOS, Kindle Fire, Nook) without rewriting code. That was another impressive claim, considering the vast differences in architecture between Android and iOS (Kindle Fire and Nook are really just forks of Android, but they have their own app stores). The only other tool that I had used that could be compiled for multiple mobile platforms was Adobe Flash Builder (4.5.1+). I'm currently working on a game using Flash Builder as well, but it's indefinitely on hold for several reasons. First of all, the game was begun before Adobe released support for mobile platforms, and Adobe did not make it very easy to migrate the project to the new system. Furthermore, while Flash Builder is definitely easier to work with than Java or Objective C (in my opinion), Corona SDK is even easier for most tasks. The one advantage that Flash Builder does hold is that it supports compilation for Blackberry, while Corona SDK does not.

I'll do more comparisons of Flash Builder and Corona SDK in a future post, but to make a long story short, I was extremely excited to try making an app in Corona SDK, so I started looking around for ideas. I tried to solicit some from my brother, but he was no help. So, I just started experimenting with Corona SDK and waiting for an idea to hit me.

After a few weeks passed, one day I noticed my brother playing a game called Hill Climb Racing, where a player drives a car over 2D hills doing tricks and collecting coins. He seemed to be having fun playing it (he had unlocked almost all of the cars), and when I tried my hand at it I found it relatively amusing. At that point, I thought it was just another free game, but a few hours later, I had an idea: What if I made a similar game, but instead of driving a car you could fly an airplane?

My brother seemed to like the idea, so I commenced development of a prototype and added him to the team. Naturally, we added some twists to make the gameplay totally unique. Players not only control the throttle, but can also tilt the device to control the angle of the plane. Furthermore, instead of starting at the beginning of a scene each time you play, gameplay takes place in one huge world that you are free to slowly explore. Players can complete missions and collect coins - but be sure to land safely or you won't get to keep the money!

My brother and I have been working on the game for several months, and now that it is nearing completion I hope that you will find it enjoyable!

Monday, September 2, 2013


Flight Odyssey would not have been possible without the following contributors, organized by license and content type.
You can contact us at if you have any questions, concerns, or ideas for improvement.
Our website is, where you can always find the most recent and accurate version of these attributions.
If you believe that we used your intellectual property in our game but mistakenly failed to attribute it here (or attributed it incorrectly), please contact us immediately at We will make all necessary corrections and will put your attribution at the very top.
Also, please note that modifications have been made to some graphics and sounds in accordance with the respective license agreements. To the extent permitted by the respective license agreement, copyright to the modifications made to the graphics/sounds is retained by Alan and Joel Jaffe.

Direct Contributors

Head ProgrammerAlan Jaffe
Assistant ProgrammerJoel Jaffe
Head ManagerJoel Jaffe
Assistant ManagerAlan Jaffe
DirectorAlan Jaffe
Assistant DirectorJoel Jaffe
Head Resource AcquirerJoel Jaffe
Head World ArchitectJoel Jaffe
Assistant World ArchitectAlan Jaffe
Head of Quality AssuranceJoel Jaffe
Assistant of QAAlan Jaffe
Copyright of the design, code, gameplay, appearance and all other portions of the game not specifically attributed below is retained by Alan and Joel Jaffe (©2013, all rights reserved).

Major Frameworks, Services, and Tools

Corona SDK by Corona Labs. In our opinion, this is a really great tool! (We also used the grass image from the physics project template.)
TexturePacker by Code'n'Web. Another great tool!

Creative Commons Attribution


Perito Moreno Glacier (David Wilbanks) / CC BY 2.0
Control tower of Munich Airport (High Contrast) / CC BY 3.0 DE
Basic blue button pause icon (Double-J designs) / CC BY 3.0
Arrow back left icon (App-bits) / CC BY 3.0
Airplane off take icon (Visual Pharm) / CC BY 3.0
Email icon (Jigsoar) / CC BY 3.0
Planet website icon (Mihaiciuc Bogdan) / CC BY 3.0
Speaker icon (Designmodo) / CC BY 3.0

Images (lite-version only)

Premium icon (Aha-Soft) / CC BY 3.0


Propeller sound (Pullover aus Milch) / CC BY 3.0
Retro Coin Collect sound (DrMinky) / CC BY 3.0
Water splash sound ( / CC BY 3.0


Free for Commercial Use


SIL Open Font License v1.10

Fonts used in logo

Oxygen Mono (Vernon Adams)
Cabin Sketch (Impallari Type)

The MIT License


UI Images and Styles


device.lua device detection script (Corona Labs)

CC0 1.0 Universal

(Public Domain Dedication)


(A few might not actually appear in the game)
Blue arrow:
Navy ship:
Fighter jet:
Crawling Soldier:
Sky background:
Big truck:
Space shuttle:
Rocket ship 2:
Rocket ship:
Hot air balloon:
Cargo Plane:
Aircraft Carrier:
Fighter Jet:
Wright Brother Airplane:
Thunderstorm cloud:
Cactus 2:
Sand storm:
Lamps post 2:
Lamp posts:
Train tracks:
Igloo: /
Tree 2:
Propeller plane:
Switch airplanes:
Gas can:


Public Domain

Free to use


Buttons: (From v. 1.028 and later)


Corona SDK Wrapper Class (Michael Milwa - "Restrictions: This class is free to use")

City Names

Fair Use


Some gameover quotes from The Hitchhiker's Guide to the Galaxy (Douglas Adams and Garth Jennings)

Icon/Image Search Engines ("The online royalty free public domain clip art" - in our opinion, a great source for CC0 Public Domain images!)

Sunday, September 1, 2013


Welcome to Flight Odyssey pilot training! Here's all the basics you need to get up and running. If you already know some of it, feel free to click the following links and skip ahead.

The Throttle (Back to Top)

Maneuvering in the Air (Back to Top)

Your First Landing (Back to Top)

Options at the Runway (Back to Top)

What if I run out of fuel?

More about Missions

More about Planes

Click the button on the left to instantly taxi to the left side of the runway, so you can take off towards the right. Or, click the button on the right to instantly taxi to the right side of the runway, so you can take off towards the left.

The door button will exit you from the game and take you to the menu, where you can view the instructions - which you're looking at right now!

Missions (Back to Top)

Back to runway options

On the missions page, you can choose a mission to accept, cancel your current mission, or keep your current mission. You can only do one mission at a time, so choose wisely!

Different missions give different amounts of coins and experience. Each time that you complete a mission, you'll get half as much money and experience.

Planes (Back to Top)

Back to runway options

On the plane page, you can switch which plane you are flying, upgrade a plane that you own, or buy a new plane. Scroll up and down to see all of the available planes. Every plane can be unlocked in two ways: If you gain the amount of experience needed, you will unlock the plane for free. Otherwise, you can buy it using coins.

Upgrades (Back to Top)

Back to planes

You can upgrade your plane to improve its maneuverability, fuel tank, stability, or safety by clicking on the upgrade button. Each property can be upgraded up to 10th level.

Coins (Back to Top)

Fuel (Back to Top)

Back to runway options

Don't ever run out of fuel, or you'll immediately crash (even if you're on the ground)! If you're having an issue with fuel, be sure that you're refueling every time you land. If that doesn't solve the problem, you may need to upgrade your plane's fuel tank or buy a new plane with a larger fuel tank. Some runways are just too distant from each other to be reached with a basic plane!

Another helpful hint: If you enter a menu while at a runway, your plane will automatically refuel.

Weather (Back to Top)

Various weather conditions will be introduced to you as you proceed through the game. If you want a sneak peak, here's some hints:

Puffy clouds make your plane harder to see.

Winds will push your plane right or left.

Rain and snow will push your plane downwards.

Updrafts and downdrafts will push your plane up or down (respectively).

A tornado will spin your plane around and likely crash it.

A thunderstorm is perfectly safe - until lightning strikes.

The Pause Menu (Back to Top)

And finally, remember that you can pause the game at any time if you need a few seconds to think or want to review the instructions. When you return from the main menu, you'll appear at the last runway you successfully landed at.

Contact Information (Back to Top)

That's all! If you have any questions, please contact us at or visit our website: