Oct 25

One Man Left Studios is over a year old, but it’s been about 4-5 months since I’ve gone ‘full time’ indie. It’s been an awesome experience thus far and each new day brings a lot of joy and excitement. It’s really hard to describe the feeling of going from a job you simply ‘show up for’ and one that you can’t wait to start working on. But looking back to how I felt about certain aspects of the working life to what I feel now, a lot has changed:

Time Accelerates

The saying “time flies when you’re having fun” couldn’t be more true. Weeks have gone by without me noticing. I felt October only started yesterday. During my old day jobs, getting through a month seemed like it took forever. I think it’s a lot different now because my focus has shifted from looking at the clock, to looking at what I’m doing. Weekends are no longer an “end goal” for me. Wednesdays come and I’m not pining for the weekend to arrive. This probably contributes a lot to why things are feeling faster. I’m not waiting for the weekend to start living, I’m living everyday now.

Days feel shorter as well. I suddenly feel there isn’t enough hours in the day to get everything done. The very reason I went full-time was so I could get “everything done”, so the irony isn’t lost on me. But in reality, I went from working non-stop with little time to enjoy myself or spend time with friends, to working MORE on what I love, but still having plenty of time to spend with friends and family.

I have a slightly better understanding to the phrase “life is short” :) .

More meaningful interactions

This may be just who I am or the people I hang out with, but come sundays there was always at least a little bit of moaning and groaning about the week starting. It doesn’t happen anymore. It did at first, but when others realized I actually enjoyed mondays the topic usually shifted rather quickly :) .

Work becomes consuming

This is more of a ‘dark side’ to being indie. The guys over at Retrodreamer touched on this subject rather well. When you’re in a creative business, ideas can strike at any time. My impulse before was to try to pursue it ASAP. This could get in the way of other life duties if you let your work hours just go flying into the night. The habit was mostly born out of extreme lack of time. When facing another week at the day job, I simply may not have time to explore that idea unless I do it now. Nowadays? I just jot it down on my phone with Evernote. Whenever I have some ‘mess around’ time where I want to code something but not necessarily for our current project, I just pop open evernote and take an idea and run with it.

Time Off Really Recharges You

I’ve come to appreciate the weekends and time off. It’s gone from a frantic “catch up with everything I put off during the week” to a much more relaxed state and just reflecting on the week’s events and planning for next week’s. I start each week actually refreshed, whereas before I typically had the “need a vacation from the vacation” feeling where it’s hard to get back into “work mode” because I still feel burned out. Vacation time and “paid time off” accrual I felt was something I was constantly trying to earn more of. Nowadays I haven’t even considered taking a vacation…

The Clock and Me

My day no longer revolves around a clock. When I want to work on an idea, I just…do. Want to work a littler later to get it done? Sure. Want to stop early because I’ve hit a stopping point? Sure. No one is forcing me to ‘fill up’ 8 hours in the work day just for the sake of working. Tasks are now more completion oriented than time oriented. I work on what makes sense.

It Only Gets Better

I’m sure there are going to be some rough spots in our future as a small company. But the fact that our success hinges squarely on both Adam and my shoulders makes it far more compelling to succeed; as opposed to a small incremental pay bump and an extra day off. Thinking about going indie yourself? I would say when all is said and done, the positives vastly overwhelm the negatives. But like any idea, you need to have a plan. As long as you have a good plan and remain positive, even if your venture fails you’ll come out of it with a lot more life experience and a better perspective on what it means when someone says “I do X for a living” ;) .

Oct 18

Ok, that title is kind of misleading. But for those who caught the reference, *high five*. I actually pulled gyroscope support from our latest Tilt to Live update. I had it implemented into the game at one point but through beta testing eventually killed the feature. I just wanted to go over the details as to why it went the way of the dodo bird.

Gyroscope != Accelerometer

Alright this a biggie. With the gyroscope on iPhone you can detect the orientation of the device in any position. This is great and actually not a limiting feature. You can calibrate the device in any position. Hell, you can calibrate the device while hanging upside from a jungle gym on a pre-school playground and it will work without a hitch. But there is a subtle difference as to how your tilt offset is calculated. The gyroscope offsets are calculated off of absolute orientations, where as using the accelerometer offsets are calculated off of relative orientations to a gravity vector.

Before I go any further, let me explain why I went down this dead path for tilt controls. When you calibrate a device off of the accelerometer there is a ‘gymbal lock’-esque problem when the device is 100% vertical. Any horizontal tilt cannot be detected because you’ve lost this degree of freedom since one of your tilt axis is aligned with gravity (what the accelerometer works off of). When the gyroscope was announced I naively thought, “Hey we can probably make the perfect tilt controls now that work in any position!” I got the ‘any position’ part down, but it was far from perfect.

Complexity in the UI

Another ding against gyroscope was due to the nature of how it worked, I couldn’t find a way to automatically turn it on and off without a large chance of the user becoming confused. As a result, I needed to create some UI interface to enable gyroscope controls. And wow, it was a hard one. Trying to explain the nuance of how the gyroscope works, without getting technical so that the user can make an informed decision as to whether they want it or not was…a bit weird. How weird? When you have to write up text that says this:

You’re probably doing it wrong.

We found it pretty funny and in line with the rest of the humor of Tilt to Live. But it just wasn’t easy to explain. Complexity in the UI was actually one of the main reasons we decided to pull it. We didn’t want Tilt to Live’s calibration to become this screen of knobs and switches, even when you’re doing a custom setting.

We weren’t kidding. Cars = bad

Step 1. Calibrate using gyroscope

Step 2. Play the game. (You so happen to be in a moving vehicle)

Step 3. This vehicle takes a right hand turn

Step 4. Owned.

The handset, in “real world” space is actually rotating when the car turns, but in local space relative to the car it isn’t. Bad news for people who are now wondering why their little arrow turned suicidal after they got off that exit ramp from the highway.

This issue ultimately clinched it. Having to calibrate not only the orientation but the actually direction a player is facing was too much. There was too large of a margin for error.

Gyroscope is awesome, we just weren’t meant to be….

With all that said, playing around with the gyroscope was awesome. It allowed me to play Tilt to Live in one-handed portrait mode because of the freedom it provided with calibration. But that freedom is very short-lived as soon as I get up, turn in my chair, or any other minor movement.

In the end, if you’re making a tilt-based game mechanic gyroscope may be of a more limited use when you actually stop and think about it. Unlike me, who did very little thinking and went ahead and tried it :) . I did have a period in there where I was completely convinced that there was an elegant solution to combining the accelerometer data and the gyroscope data to create a fully working “hybrid” of sorts. It never came to me, but I’m sure someone out there much smarter than me that could write a proof proving or disproving this problem and make my head explode.

Oct 11

Lot’s going on in OML-Land. TTL HD is out the door. TTL HD 1.1 is already in Apple’s queue (fixing a horrible crash for our international users). TTL 1.5 (iPhone) is in testing right now. On top of some R&D type stuff I’m messing around with so we can transition to our next project more smoothly.

So retina graphics are all the rage at the moment. If you were lucky to develop your game assets all in a vector-based format, supporting retina graphics was a bit easier. Luckily for us, Tilt to Live was all done in Adobe Illustrator. With a few tweaks to how sprites are rendered on the iPhone I had retina working in an afternoon.

Now, retina is all dandy until you get back onto the iPad.  If you are using the [UIScreen mainscreen].scale method to detect retina, be weary for iPad users. Things get a bit tricky on the iPad because:

  1. If you’re using the @2x trick, this doesn’t work on the iPad. This caused a few problems because some of our asset metadata relies on this as well so it caused a few minor headaches.
  2. Users can toggle the x2 mode mid-game.

At first I thought I could code to allow the iPad to load the retina graphics for a spiffy looking Tilt to Live. But the realization of #2 stopped me from pursuing it. Plus, with Tilt to Live HD on the app store now with even better graphics there really wasn’t a need to do it.

So if you plan on allowing iPad users to load retina graphics, it doesn’t exactly come as easy as it is on the iPhone 4. You may pretty much have to treat it in a similar fashion as a screen resolution change on a PC. This sometimes involves unloading textures, putting a loadscreen up, etc.

Next week I may go over some of things I came across implementing tilt controls with a gyroscope, which wasn’t exactly straightforward…

Oct 4

Despite the good advice on just using a library or someone else’s solution to getting game center working, sometimes I’m just stubborn. Well it wasn’t actually completely stubbornness as it was more of a “don’t have an alternative” situation. Tilt to Live uses AGON for it’s leaderboards and awards system. It has served us well and never faltered. Despite that, Game Center has arrived to rain on it’s parade so-to-speak. To give TTL hopefully more life in the long run I decided to implement Game Center alongside AGON over the past week. It was trying, painful, and sometimes down right frustrating. Trying to get 2 closed and incompatible systems working is wrought with trial and error and lots of hackery :) .

Below are just some things you may find useful if you’re considering game center in an update

1. Game Center is not a full solution

Namely, there is no offline support to speak of. Another biggie that I grossly underestimated is a lot of the ‘fault tolerance’ is on the game developer to implement. Scores don’t make it to the servers? Save them for the next time. Awards not work online? Save them. User has no internet connection? Save them. User is age restricted from using Game center? Save it again.

Are you on a 3G with 3.x iOS? Don’t use game center. Are you on a 3GS with 4.0? Don’t enable game center. Are you on a 3G with 4.1? Despite GC not having an API to detect THIS case, you need to disable it because GC doesn’t work with it.

This is where services like OpenFeint and AGON shine. They offer seamless offline support with minimal hassle. I actually ended up leveraging AGON’s offline support to help deal with the score submission failures for Game Center. This saved a lot of time, and in OpenFeint from what I hear it’s even easier. In conclusion, If you don’t have any award or leaderboard solution implemented already it may be a good idea to use one with offline support first before concerning yourself with game center.

2. Be mindful of when you send scores and awards

If you have a fast paced game, you may want to store any scores or new award unlocks until the main gameplay is done, THEN send it off to Game Center. It creates a noticeable pause mid-game. Other social gaming platforms deal with this in different ways, but I remember early on seeing some OF games do a “mass” unlock at the end game sessions and such. Nowadays I believe it’s well known to just commit the changes in 1 transaction during some low key point in the game.

3. Keep your descriptions short

This is a sad one for us, because Tilt to Live thrives on witty descriptions and jokes for it’s awards. We’ve opted to keep them the same in-game (using AGON) but we’re modifying the GC ones so that other users can see the descriptions in full in the GC app.

4. Be sure to login from your app

While the Apple documentation stated there was some way to log into the sandbox through the GC app with a test account, my mileage varied. So the sure-fire way for me to do it was to log out from the GC app, then log in from within our game. Not seeing your awards or scores? Make sure you’re logged in from your game.

5. Wait a bit after modifying your leaderboards/awards

Apparently there is some time before your GC app updates with the latest awards and stuff. I’m not exactly sure how this works or if there is some cache that has to be updated to pull the latest info down. Either way, if you’re not seeing any changes you are not going crazy.

6. Multi-tasking support can be hell

It was hell for me for several days because of one tiny issue: The simulator does not post GKPlayerAuthenticationDidChangeNotificationName messages. Not realizing this I was going mad wondering if I had my implementation wrong or whether there was a bug in GameKit itself. After discovering this was limited only to the simulator I soon found sanity in my testing of multi-tasking support. Having users change names, log in and out, all while your app is running can be daunting so approach this case with care. It seems Fruit Ninja dodged a bullet here by not fully supporting multi-tasking :P .