Phil Hassey - game dev blog
Phil Hassey as Snidely Whiplash
"You can't buy awesomeness.
You're born that way."

Archive for April, 2011

Transitioning to Xcode 4.0.x

Tuesday, April 26th, 2011

I’m working on a new game project that I’m hoping to release sometime in the next month or so! I’m taking a break from Dynamite to do something a bit more wacky 🙂 For these posts I’m going to be referring to my project as “mygame” since I’m not ready to announce the name of this super-amazing project yet.

Anyway, I downloaded Xcode 4.0.2 the other day so I could get going with the latest iOS tools. I’m going to be using more iOS features in this game than ever before, so I want to be sure I’m up to date with how things are supposed to be done. Xcode, however, has quite a few changes, so here’s the documentation of some of the common things I do as an Xcode user that changed.

1. Adding CFLAGS to my project “-DMYGAME_IOS_BUILD, etc”

– Click on “mygame” at the top left of the project tree hierarchy.
– Click on the “Build Settings” tab in the main frame.
– Click on the “All” button to reveal all settings.

From there you can find the “Other C Flags” setting. Apparently Xcode 4 has “Schemes” (the name of your project) as well as “Builds” (Debug / Release) as well as “Destinations” (iPhone / iPad / Simulator).

2. Adding more Frameworks to the project

I always have a handful of frameworks I need to add. In Xcode 3, you could right-click and click on “Add Existing Frameworks” to pick from a list. This is no longer the case. But doing the same is pretty easy:

– Expand the “Frameworks” from the project tree.
– Right-click on one of the frameworks.
– Select “Show in Finder”
– Finder will open, and will show the folder where all the frameworks are.
– Drag and drop a framework from Finder to the Frameworks in your project

3. Working with the new OpenGLES iOS template

Every few releases of Xcode, Apple changes up the OpenGLES template. I do wonder if I should just copy over it with my own stuff? Maybe, but I figure Apple knows best or whatever, and I always adapt to the latest template for new projects. This one has me a bit more confused than usual since it seems to use more Interface Builder type stuff and has a mygameViewController object in it as well (and corresponding .m and .h files.)

– At this point I knew since I was going to be using GameCenter and IAP in this game I might as well learn a bit more ObjectiveC. I’ve thus far managed to NOT learn it in the 3 years of iOS coding I’ve been doing. So, to kick things off I figured I’d check out what the iOS development videos might have for me. Unfortunately, the newest videos are from Apple’s 2009 tour. Kind of sad, I mean, 2009 was back before iPads even existed. So those videos are certainly not going to help me deal with the new fancy in Xcode 4 and building Universal apps.

– Instead I found that the typed documentation was much more helpful. I clicked into “Tools for iOS Development” to see what they’d have to say about Xcode 4.

– From perusing a few documents I got the feeling that to use GameCenter, etc, I was going to need a ViewController. Since the new OpenGLES template includes one, I guess that is good. If there are any iOS devs reading this who want to point me towards some helpful tutorials so I can understand what I’m doing better, that would be great. As-is, I am sort of continuing in my usual blind-cut-and-paste-and-hope type stupor with this stuff.

– I hacked out all the GLES2 code, I still write all my code using GLES1 .. the advantage that gives me is that my code will work simply on pretty much any platform. And I finally after 3 years understand GLES1 pretty well. I suppose I might get into ES2 eventually, but not yet 🙂 I also like that GLES1 code can work on the desktop with almost no changes. I hear shaders can add complication to my life on the desktop. Again, if anyone wants to link me to useful commentary on that, I wouldn’t mind!

4. Hacking my game onto the iOS app

I always code my games in C/C++. What I’ve found is the easiest way to get it to work with iOS is to rename all the .m files to .mm so that they are C++ aware ObjectiveC. Then I have a set of wrapper functions for my game that the ObjectiveC code can call.

Okay, so this is really cool, Xcode 4 now detects if you type in an invalid function name, and suggests a replacement function name 🙂 And it worked!

5. Making the game Universal

Xcode 4 seems to make this pretty easy. I just went into the Summary tab and switched mygame over to Universal and it all seemed to work pretty well. I only had to add these lines to the top of my drawFrame method in my ViewController:

CGRect screenFrame = [[UIScreen mainScreen] applicationFrame];
game_resize(screenFrame.size.width,screenFrame.size.height);

Here’s the blog post that helped me with that.

6. Making the game Retina enabled

I just used this code snippet at the end of my EAGLView initWithCoder (I believe I got it from the Fargoal folks):

      float scale = 1;

      if([[UIScreen mainScreen] respondsToSelector:
              NSSelectorFromString(@"scale")])
      {
              if([self respondsToSelector:
                      NSSelectorFromString(@"contentScaleFactor")])
              {
                      scale = [[UIScreen mainScreen] scale];
                      self.contentScaleFactor = scale;
              }
      }

Towards the end of the day I spent some time mucking with orientation stuff. That always confuses me! And that’s all for today!

-Phil

P.S. Changing where the builds are made:

By default the builds are put in ~/Library/Developer/Xcode/DerivedData .. they used to be placed within my project which is what I prefer. This can be changed by going into Xcode > Preferences > Locations > Build Location > Place build products in locations specified by targets