Browsing articles from "October, 2009"

Addicus for iPhone and iPod Touch – The Official Trailer

Oct 22, 2009   //   by Derek van Vliet   //   Announcements  //  No Comments

While Addicus is awaiting approval in the app store, here is the official trailer for you to chew on. And how about a little info on the game itself:

Addicus is a number based puzzle game with an emphasis on fast-paced action and gorgeous graphics. It’s one of those games that is easy to learn but impossible to master which translates into nothing short of addictive.

The goal of the game is to add up to target numbers by tapping on jiggly numbered mushrooms. Sound simple? Try doing that in a race against the clock. And then try doing it in a challenge against your friends on Facebook.

Here are some of the other features:

  • Multipliers and chain bonuses
  • Dozens of additional uber-secret bonuses
  • Overdrive mode for crazy hi-scores
  • Openfeint-enabled, part of the largest iPhone game community
  • Online worldwide leaderboards
  • Compete against your friends on Facebook and Twitter

We are really excited to unleash our first game into the world. Stay tuned to find out when it is available!

Automatically Insert Your SVN Revision Number Into Your Xcode Project

Oct 21, 2009   //   by Derek van Vliet   //   Development  //  No Comments

Wouldn’t it be handy for your iPhone app to have access to its subversion revision number at run-time? Of course it would!

Being able to access the current revision number in your app is especially useful for testing. We use it to display the current rev on our test builds so our testers can reference the build that they discover bugs in, like so:

IMG_01632

Here’s how to do it

1. In Xcode, add an empty header file to your project’s “Other Sources” group called “revision.h”.

2. Add a “New Run Script Build Phase” to your target.

3. When defining your build phase, use “/bin/sh” for the Shell value and enter the following script:

REV=`svnversion -n`
echo "#define kRevision @\"$REV\"" > ${PROJECT_DIR}/revision.h

4. Ensure that the new build phase happens before your “Compile Sources” build phase.

5. Build your app.

That’s it! From now on you can use a string define called kRevision wherever you would like to reference your revision number at run-time.

IMPORTANT: Do NOT add your revision.h file to your subversion repository. It will be generated automatically each time you build your app.

Apple Banking Voodoo

Oct 17, 2009   //   by Matt Coombe   //   Uncategorized  //  4 Comments

I thought I might share a small hiccup I ran into while submitting our banking information to Apple through iTunesConnect.

Most of the process went very smoothly until I was asked for my bank’s “Transit Number”. Our company is located in Toronto and so in Canada this is a 5 digit number that is unique for each branch of a given bank. I duly typed this in but it was immediately rejected when the form was sent to Apple. I got an “enter valid transit number” warning.

After several phone calls to my branch and bank helpline I was no closer to resolving the problem. They told me what I already knew, that the transit number is a 5 digit code. I sent an email to iTSBanking@apple.com but did not expect a reply any time soon (although I did get some help from them over email a day later). After banging my head against the wall and some Google searching I found the real deal on what Apple is expecting Canadian iPhone developers to input for the Transit Number.

Apple is actually looking for the electronic Routing Transit Number which consists of three values with no spaces or dashes:

0XXXYYYYY

A leading zero followed by the 3 digits of your bank institution number followed by the 5 digit branch transit number (also known as the branch ID).

You can find your bank institution number here.

Hopefully this will save some of you the frustration I ran into!

Screen shots of Addicus release build

Oct 16, 2009   //   by Matt Coombe   //   Development  //  No Comments

Here are  a few screengrabs of the build we  submitted to Apple. Enjoy :)

Addicus-14

fourofakind

overdrive

Addicus-09

Screenshot 2009.10.14 01.04.04

Addicus waiting for approval

Oct 16, 2009   //   by Matt Coombe   //   Announcements  //  No Comments

We’ve got some great news! Addicus has been uploaded to the iTunesConnect servers and is now waiting for approval from Apple. With any luck Addicus will be available on the App store in a couple of weeks!

Saving and loading user data and preferences

Oct 7, 2009   //   by Rob Segal   //   Development  //  8 Comments

There is a collectively recognized method for storing application data and preferences which is NSUserDefaults.  The API for this is a bit unconventional and I thought an appropriate wrapper class would work well in this case.  While not completely understanding the full details of NSUserDefaults I developed a singleton class which we can use in our games to save/load data.  The interface is simple…

SettingsManager.h

#import <Foundation/Foundation.h>
 
@interface SettingsManager : NSObject {
	NSMutableDictionary* settings;
}
 
-(NSString *)getString:(NSString*)value;
-(int)getInt:(NSString*)value;
-(void)setValue:(NSString*)value newString:(NSString *)aValue;
-(void)setValue:(NSString*)value newInt:(int)aValue;
-(void)save;
-(void)load;
-(void)logSettings;
 
+(SettingsManager*)sharedSettingsManager;
@end

SettingsManager.m

#import "SettingsManager.h"
 
@implementation SettingsManager
 
static SettingsManager* _sharedSettingsManager = nil;
 
-(NSString *)getString:(NSString*)value
{	
	return [settings objectForKey:value];
}
 
-(int)getInt:(NSString*)value {
	return [[settings objectForKey:value] intValue];
}
 
-(void)setValue:(NSString*)value newString:(NSString *)aValue {	
	[settings setObject:aValue forKey:value];
}
 
-(void)setValue:(NSString*)value newInt:(int)aValue {
	[settings setObject:[NSString stringWithFormat:@"%i",aValue] forKey:value];
}
 
-(void)save
{
        // NOTE: You should be replace "MyAppName" with your own custom application string.
        //
	[[NSUserDefaults standardUserDefaults] setObject:settings forKey:@"MyAppName"];
	[[NSUserDefaults standardUserDefaults] synchronize];	
}
 
-(void)load
{
        // NOTE: You should be replace "MyAppName" with your own custom application string.
        //
	[settings addEntriesFromDictionary:[[NSUserDefaults standardUserDefaults] objectForKey:@"MyAppName"]];
}
 
// Logging function great for checkin out what keys/values you have at any given time
//
-(void)logSettings
{
	for(NSString* item in [settings allKeys])
	{
		NSLog(@"[SettingsManager KEY:%@ - VALUE:%@]", item, [settings valueForKey:item]);
	}
}
 
+(SettingsManager*)sharedSettingsManager
{
	@synchronized([SettingsManager class])
	{
		if (!_sharedSettingsManager)
			[[self alloc] init];
 
		return _sharedSettingsManager;
	}
 
	return nil;
}
 
+(id)alloc
{
	@synchronized([SettingsManager class])
	{
		NSAssert(_sharedSettingsManager == nil, @"Attempted to allocate a second instance of a singleton.");
		_sharedSettingsManager = [[super alloc] init];
		return _sharedSettingsManager;
	}
 
	return nil;
}
 
-(id)autorelease {
    return self;
}
 
-(id)init {	
	settings = [[NSMutableDictionary alloc] initWithCapacity:5];	
	return [super init];
}
 
@end

Values can then be saved/retrieved in code like so…

[[SettingsManager sharedSettingsManager] saveValue:@"hiscore" newValue:@"10000"];
NSString* myValue = [[SettingsManager sharedSettingsManager] getValue:@"hiscore"];
int myInt = [[SettingsManager sharedSettingsManager] getInt:@"challenges_won"];

To save our values on an incoming call or other system interruption we can put save/load calls in the appropriate callbacks of the app delegate…

- (void)applicationDidFinishLaunching:(UIApplication *)application
 
{
  // ...  (some code) ...
 
  // Load settings on initial startup
  //
  [[SettingsManager sharedSettingsManager] load];
 
  // ...  (more code) ...
}
 
- (void)applicationWillResignActive:(UIApplication *)application
{
  [[SettingsManager sharedSettingsManager] save];
  [[Director sharedDirector] pause];
}
 
- (void)applicationDidBecomeActive:(UIApplication *)application
{
  [[SettingsManager sharedSettingsManager] load];
  [[Director sharedDirector] resume];
}
 
- (void)applicationWillTerminate:(UIApplication *)application
{
  [[SettingsManager sharedSettingsManager] save];
  [[Director sharedDirector] end];
}

This basic class is great for storing arbitrary user state values that you want to preserve for the next time someone plays your game.  Hi scores, level progression, number of lives are a few of the possibilities this class could be used for.

Sneak Peek

Oct 3, 2009   //   by Matt Coombe   //   Development  //  7 Comments

Here’s an early render of some characters from an unannounced game we currently have in development.

Orc_02_013

Our Games

Latest Tweets