Integrating GREE into your cocos2d(-x) game !

UPDATE 2: I recommend following the official guide from GREE’s blog !, since it’ll always be up to date (I guess)
UPDATE 1: I’ve now updated the tutorial to support cocos2d-x !, thanks to the readers who’ve helped out !

To skip to the cocos2d-x part, click here.

Okay, A couple of the readers on the last GREE post requested that I do this writeup to show you how to implement the GREE platform into your cocos2d game !
So, here it is folks !

Note: if you just want the code immediately, here’s the download link !, for everyone else, read on!

UPDATE:I have accidentally removed the files while i was updating to my new computer, i’ll try to find them and restore the link As soon as I can, sorry guys 🙁
Download the XCode project here

Prerequisites:

  • Setup your app on the GREE dashboard (use this post)
  • The GREE SDK
  • A cocos2d app (if not, we’ll make one in the following steps

Ok, now I assume you’ve setup the app on GREE and obtained the ApplicationKey, ConsumerKey and ConsumerSecret strings !

Let’s begin by creating a simple cocos2d game !, fire up Xcode, then create a new project (Shift+Cmd+N) and select the cocos2d template.

Hit next.

Fill up your product name and company identifier, for this tutorial, i’ll just create one scene with a menu that’ll control GREE.

Now you should have the skeleton app ready to run, run it in simulator to make sure you see the Hello World scene, if it looks like this, you’re on the right track !

We’re done with the first step, second step is to add the GREE library to your App

Head to GREE’s developer dashboard, and download the latest SDK (3.1.1 at the time of writing)

AFter downloading, we need to do the following

  • Add Gree resources and SDK to your XCode project
  • Add build flags
  • Add required Frameworks

First, we’ll add the SDK to our project, to do so we need to do one of the following ways :
First method is the easier one, we simply copy two library archive files (something similar to DLL files in windows), those are precompiled files that contain the entire SDK header files and code.

Simply go to your newly downloaded SDK folder, find the files calles libGreePlatform.a and libGreeWallet.a, then drag them into your Xcode window so they’ll be added to the project.

Next you need to import the vendor/ folder, just in the same manner, this contains some extra libraries that Gree requires !

NOTE: There might be some extra example XCode projects inside the vendor folder, make sure to delete them as they contain similar filenames that confuse Xcode.

 

The second method to add Gree is to copy the resource files as a tree, meaning, copying the files and folders individually into your project (I this gives you access to open up the SDK and read the internals when needed, it’s totally up to you which method to use)

To add the SDK as a source tree, simply find the  SDK/ folder, and drag the source/ folder into your XCode project. we will need everything inside this folder.

Once it’s in your project, you may rename the folder to something more appropriate, like libGREE.
if you like an organised hierarchy, move the libGREE folder into the frameworks folder.

Now we are done with adding the SDK, we need to add the resource bundles now (bundles containing images and UI elements required to display GREE’s dashboard,popups and banners properly).

Resource bundles are found in the release/resources folder, head in there, and drag the file “GreePlatformCoreResources.bundle” into your project just like you did before, ask XCode to copy the file if needed. you may move it into the “Resources” too if you want to keep it organised !

Note: You probably have noticed that there are two other files, one for landscape resources and one for portrait resources, If your app is landscape or portrait only you can copy any of those files too (i prefer just using the core as it’ll save space)

 

Now we have resources ready, and code ready, what’s next ? adding the builder flags !

 

Go to your “Build Settings” tab on your project, accessed after clicking on your project’s name here:

Scroll down to the “Other Linker Flags” row, and add the flags “-ObjC” and “-all_load” if they’re not already there.

 

Note: please make sure they’re there on both Debug and Release configs, just hit the arrow to expand the row and see if it’s the same like this:

Now we’ve added the platform fully !, the next step is to add other frameworks that GREE requires to work properly, that’s simple and won’t take a moment !

Go to the “Build Phases” , next to the tab “Build Settings” you were just on, and scroll down to “Link Binaries with Libraries”.

 

Click on the arrow next to it to expand, should look like this:

Click on the + Sign on the bottom left of the box to add our needed new frameworks (If any of the frameworks was already there don’t add it again)

Add the following frameworks:

Tip: To easily find the framework use the search box !

  • MessageUI.framework
  • GameKit.frameowrk
  • StoreKit.frameowrk
  • QuartzCore.framework
  • AddressBook.framework (not AddressBookUI.framework)
  • Security.framework
  • UIKit.framework
  • Foundation.framework
  • CoreGraphics.framework
  • SystemConfiguration.framework
  • libsqlite3.dylib (not libsqlite3.0.dylib)

 

Now we’re done with adding the framework !!, we need to head next to our code to initialize it !

Let’s head into our AppDelegate.h file, and start working, firstly we’ll need to include the following:

#import "GreePlatform.h"

The head to it’s @interface line and make it follow the GreePlatformDelegate protocol by modifying it to :

@interface AppDelegate : NSObject

instead of

@interface AppDelegate : NSObject

Now let’s go to the AppDelegate’s .m file and do some work there !

First thing include those files

#import "GreePlatform.h"
#import "GreePlatformSettings.h"

Note: GreePlatformSettings.h is not mentioned in the docs, but it contains the setting’s enums and constants, i’m not sure why this bug occurs, but we have to import that file manually, no biggie..

Now head to the end of your applicationDidFinishLaunching method, that’s where we’ll init the platform.

To init, we need a settings dictionary, and your appId and consumerId/Secret.

Create the Dictionary as follows:

//Init gree's settings!
NSDictionary* GreeSettings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:NO], GreeSettingUseWallet,
[NSNumber numberWithBool:YES], GreeSettingEnableGrade0,
[NSNumber numberWithBool:YES], GreeSettingNotificationEnabled,
GreeDevelopmentModeSandbox, GreeSettingDevelopmentMode
, nil];

Then Init the platform as follows:

[GreePlatform initializeWithApplicationId:@"YOUR_ID" consumerKey:@"YOUR_KEY" consumerSecret:@"YOUR_SECRET" settings:GreeSettings delegate:self];

Also, in the applicationWillTerminate method, make sure to shutdown GREE

- (void)applicationWillTerminate:(UIApplication *)application {
        //Stop Gree
        [GreePlatform shutdown];
	CCDirector *director = [CCDirector sharedDirector];
	[[director openGLView] removeFromSuperview];
	[viewController release];	
	[window release];
	[director end];	
}

At this point,  XCode will have probably started warning you about missing methods in the Gree delegate protocols, they are cool methods that allow you to do actions when the user logs in, out, or the dashboard appears, disappears, etc..

just add those methods to your AppDelegate.m file, anywhere you want.

//Gree delegate methods !
-(void) greePlatform:(GreePlatform *)platform didLoginUser:(GreeUser *)localUser{
    NSLog(@"Method called: %s", __FUNCTION__);
    //I did this to manually refresh the scene when the user logs in
    [[CCDirector sharedDirector]replaceScene:[HelloWorldLayer scene]];
}
-(void) greePlatform:(GreePlatform *)platform didLogoutUser:(GreeUser *)localUser{
    NSLog(@"Method called: %s", __FUNCTION__);
    //I did this to manually refresh the scene when the user logs Out
    [[CCDirector sharedDirector]replaceScene:[HelloWorldLayer scene]];
}
-(void) greePlatform:(GreePlatform *)platform didUpdateLocalUser:(GreeUser *)localUser{
    NSLog(@"Method called: %s", __FUNCTION__);
}
-(void) greePlatformDidDismissModalView:(GreePlatform *)platform{
    NSLog(@"Method called: %s", __FUNCTION__);
}
-(void) greePlatformParamsReceived:(NSDictionary *)params{
    NSLog(@"Method called: %s", __FUNCTION__);
}
-(void) greePlatformWillShowModalView:(GreePlatform *)platform{
    NSLog(@"Method called: %s", __FUNCTION__);
}
At this point you are ready to run and test !!, ready ?? (CMD+R)
Take a look at your console, it should say something like this:

[Gree][GreePlatform.m:368]  Initialized Gree Platform SDK 3.1.1 (Build DEVELOPER_BUILD128)

This means the platform was init’d correctly !, congrats !!

You’re probably wondering, why didn’t I see the dashboard ??

Cause we haven’t setup the RootViewController properly, head back a few lines up in your AppDelegate’s m file (anywhere actually)

And set the RootViewController property, depending on your cocos2d version, it will differ, here’s for both versions:

//cocos2d 1.0
self.window.rootViewController = viewController;
//cocos2d 2.0
self.window.rootViewController = navController_;

After creating that, your code is “almost” ready, the thing is, you haven’t asked GREE to authorize the player, you just initialized it, in order for the dashboard to show, you’ll need to call the authorize method, anywhere you need (preferably right after init method ??, we’ll change that later in the tutorial anyways)

[GreePlatform authorize];

Now go ahead and run your app (CMD+R), and it workes !!, woot woot.

 

(Create a test user account on GREE’s developer dashboard to be able to login using that account form your device, you can’t register test accounts using your device, just do it via the developer dashboard, and MAKE SURE to activate the account by clicking the confirmation link).

Now Login using the new credentials, voila ! you’re in GREE !, you may close the app and restart it, you’ll notice it greets you in a “welcome back, username” manner , just like OpenFeint and Game Center, nice..
Now you’ve earned a little break, go grab a coffee, when you’re back we’ll start modifying your cocos2d scene to play with GREE’s methods (Achievements and leader boards)

Okay, let’s go, fist thing, I don’t like the way the login is handled, so please remove the line that you just added

//Remove this
[GreePlatform authorize];

And let’s handle it in a better way, we want the user to start the game, and if he/she aren’t logged in, we show them a login button that’ll call GREE’s dashboard, this way, we avoid annoying the user with popups (I hate that).

head into the Game’s HelloWorldLayer scene .h file, let’s add two menus in there

@interface HelloWorldLayer : CCLayer
{
CCMenu *GreeMenu;
CCMenu *LoginMenu;
}

We’ll handle those in the .m file, open it up now..

Clean out the scene from the Hello World  label and everything, we want a clean empty scene..

Then add a new interesting title:

CCLabelTTF *Title = [CCLabelTTF labelWithString:@"Gree Platform Cocos2d test" fontName:@"Marker Felt" fontSize:50];
Title.anchorPoint = ccp(0,1);
Title.position =  ccp(10 , size.height - 10);
[self addChild: Title];

Now let’s do a little check to see if the user is logged in or not to display the corresponding menu !

//If user is logged in, show menu, if not ask to authorize !
if([GreePlatform isAuthorized]){
//User is Logged in..
}else{
//No one logged in, show the login button !
CCMenuItem *loginItem = [CCMenuItemFont itemFromString:@"Please Login" target:self selector:@selector(authUser)];
LoginMenu = [CCMenu menuWithItems:loginItem, nil];
LoginMenu.anchorPoint = ccp(.5,.5);
LoginMenu.position = ccp([[CCDirector sharedDirector]winSize].width/2,[[CCDirector sharedDirector]winSize].height/2);
[self addChild:LoginMenu];
}

as you noticed I created a new method called authUser, you’ll need to add that into your class:

-(void) authUser{
//Login the user
[GreePlatform authorize];
}

Anywhere will work, but i prefer before the dealloc method (to keep things organized, i don’t know why but i like the dealloc to always be the last method)

Now run the game, you’ll be greeted with a nice empty scene with a login button, press the button, if the user never logged in before, it’ll ask them to register, if they’re already registered, the button will just disappear and the user will see the welcome back banner, this is a little tricky, cause now since the user is registered, you can just automatically call the auth method and they won’t see any annoying popups, i’ll leave that to you since you’ll know your game’s implementation better than i do, the easiest way is to simply call the auth method right after you init the Gree platform, but you must understand that the first time the player runs the game, they’ll see an annoying registration popup, keep usability in mind..

Now it’s time to create all the controls, we’ll create a menu that contains items to:

  1. Get user data (Profile picture, nickname, etc…)
  2. Post a score to a predefined leader board
  3. Unlock a predefined achievement
  4. Relock a predefined achievement
  5. Logout the player

And a few labels to display all that data

Head into your HelloWorldLayer .m file and let’s begin by adding the menu:

inside the user logged in check, place the following code:

if([GreePlatform isAuthorized){
//User is Logged in, Show gree menu and info!
//Check achievement status first !
achState = [CCLabelTTF labelWithString:@"Achievement state: unknown" dimensions:CGSizeMake(200, 40) alignment:UITextAlignmentCenter fontName:@"Arial" fontSize:20*viewScale];
achState.anchorPoint = ccp(0,0);
achState.position = ccp(20,20);
[self addChild:achState z:1];
scoreState = [CCLabelTTF labelWithString:@"Score sent: 0" dimensions:CGSizeMake(200, 40) alignment:UITextAlignmentCenter fontName:@"Arial" fontSize:20*viewScale];
scoreState.anchorPoint = ccp(1,0);
scoreState.position = ccp([[CCDirector sharedDirector]winSize].width - 20,20);
[self addChild:scoreState z:1];
CCMenuItem *userName = [CCMenuItemFont itemFromString:@"Get User Data" target:self selector:@selector(getUserData)];
CCMenuItem *postScore = [CCMenuItemFont itemFromString:@"Add 10 points to current leaderboard" target:self selector:@selector(postLeaderBoard)];
CCMenuItem *lockAch = [CCMenuItemFont itemFromString:@"Lock Achievement" target:self selector:@selector(lockAch)];
CCMenuItem *unlockAch = [CCMenuItemFont itemFromString:@"Unlock Achievement" target:self selector:@selector(unlockAch)];
CCMenuItem *logoutButton = [CCMenuItemFont itemFromString:@"Logout user" target:self selector:@selector(deauthUser)];
GreeMenu = [CCMenu menuWithItems:userName,postScore, lockAch, unlockAch ,logoutButton, nil];
GreeMenu.anchorPoint = ccp(.5,.5);
GreeMenu.position = ccp([[CCDirector sharedDirector]winSize].width/2,[[CCDirector sharedDirector]winSize].height/2);
[GreeMenu alignItemsVertically];
[self addChild:GreeMenu];
[GreeMenu runAction:[CCFadeIn actionWithDuration:2.0]];
}else{......

Now we have a menu setup that will call methods to do what they’re supposed to, let’s add those methods :

getUserData

postLeaderBoard

lockAch

unlockAch

deauthUser

First method, is the getUserData method:

-(void) getUserData{
//Get reference to user
GreeUser *localUser = [[GreePlatform sharedInstance] localUser];
//Get their profile picture !
[localUser loadThumbnailWithSize:GreeUserThumbnailSizeHuge block:^(UIImage *icon, NSError *error) {
CCSprite *pic = [CCSprite spriteWithCGImage: key:nil];
pic.anchorPoint = ccp(.5,.5);
pic.rotation = 20;
pic.position = ccp([[CCDirector sharedDirector] winSize].width-150,[[CCDirector sharedDirector] winSize].height-150);
[self addChild:pic z:-1];
//make it fade in, why not ?!
[pic runAction:[CCFadeIn actionWithDuration:2.0]];
}];

//Get the nickname
CCLabelTTF *nick = [CCLabelTTF labelWithString:localUser.nickname dimensions:CGSizeMake(200, 200) alignment:UITextAlignmentCenter fontName:@"Arial" fontSize:28];
nick.anchorPoint = ccp(1,.5);
nick.color = ccc3(0xff,0,0xff);
nick.rotation = 20;
nick.position =  ccp([[CCDirector sharedDirector] winSize].width-150,[[CCDirector sharedDirector] winSize].height-350);
//Fade in actions are cool
[nick runAction:[CCFadeIn actionWithDuration:3.0]];
[self addChild:nick z:-1];

//There's much more data than just the picture and the nickname, check the output in the console !
NSLog(@"User data: %@", localUser);
}

Second method is the unlockAch method:

-(void) unlockAch{
//Create the achievement
GreeAchievement *myAchievement = [[GreeAchievement alloc] initWithIdentifier:ACHIEVEMENT_ID];
[myAchievement unlockWithBlock:^(void){
NSLog(@"Achievement unlocked!");
[achState setString:@"Achievement state: Unlocked!"];
achState.color = ccc3(0, 0xff, 0);
}];
[myAchievement release];
}

Next one is identical, but relocks the achievement

-(void) lockAch{
//Create the achievement
GreeAchievement *myAchievement = [[GreeAchievement alloc] initWithIdentifier:ACHIEVEMENT_ID];
[myAchievement relockWithBlock:^(void){
NSLog(@"Achievement locked!");
[achState setString:@"Achievement state: Locked!"];
achState.color = ccc3(0xff, 0, 0);
}];
[myAchievement release];
}

Fourth method posts incremental scores to a leader board:

-(void) postLeaderBoard{
//Add 10 to score with every tap !
score+=10;
GreeScore* myScore = [[GreeScore alloc] initWithLeaderboard:LEADERBOARD_ID score:score];
[myScore submitWithBlock:^{
NSLog(@"%@",[NSString stringWithFormat:@"Score submitted! %lld", score]);
[scoreState setString:[NSString stringWithFormat:@"Score sent:%lld", score]];
[scoreState runAction:[CCFadeIn actionWithDuration:.5]];
}];
[myScore release];
}

And the final and simnplest one, logout the user !

-(void) deauthUser{
//Logout the user
[GreePlatform revokeAuthorization];
}

Don’t forget to replace the ACHIEVEMENT_ID and LEADERBOARD_ID with your respective values !, I’ve placed macros on top of the file for ya !
Now Run your app and give it a  shot !, there might be simple changes in the downloaded project than in this tutorial, but simple stuff like the
displayScale variable, it just helps with font sizes on iPad and iPhone and some positioning, etc… so don’t worry about those little changes..

 

This is considered a simple tutorial, it doesn’t show you how to fetch data from leaderboards, or fetch Achievement data, I just did it

to explain how the project needs to be built and to give some users having difficulties a ready made skeleton app to work on !

it also doesn’t show the GameCenter integration, I can add that later but i had no time as I’m contracted on a game that i’m supposed to finish soon..

sorry about that, if i have some more time i’ll make sure to post about GameCenter integration !

if you found any mistakes or want to make amendments please comment or email me ! 🙂

 

Some previews of how the app will behave:

Download the XCode project here

 

 

Cocos2d-x update:

So , Stuart Templeton was working on integrating GREE with cocos2d-x, he did the whole thing flawlessly, except for a little error that cause the keyboard to popup

for not apparent reason (see video here).

after some fiddling around the internet, I found out that it’s a little bug in cocos2d-x in the EAGLView, thankfully Andre Rudlaff has patched this !

so after applying his patch, the rest was simply just  exactly like Cocos2d-iPhone !.

UPDATE:I have accidentally removed the files while i was updating to my new computer, i’ll try to find them and restore the link As soon as I can, sorry guys 🙁
Download full Cocos2d-x project here

Enjoy, don’t forget to leave comments below if you have any questions !

20 comments

  1. Pingback: How to add GREE to your iOS game | Berg's Blog

  2. Artem   •  

    Hi Berg! Thank you for great tutorial! It helped me a lot, but now I stuck with the dashboard. GREE docs describe “GREE Dashboard” that can be opened from game UI in order to show user his progress (like leader boards, user achievements). But I didn’t find a cue about this dashboard in the GREE iOs SDK Reference. Do you know how it works or where I can get more info on this issue?

    • Berg   •     Author

      Yes there’s this feature, you need to initialize the GreeWidget to enable that , it’s basically a small Gree Button that stays on the bottom or top of the window, and once the player touches it, it loads the GREE dashboard, just like it worked on OpenFeint !, I’m not free right now to check out the docs, but if you look it up you’ll definitely find it, let me know if you don’t and i’ll come back to you with more info ASAP !

  3. Diablo404   •  

    That’s sooooo great! Thanks for this tuts!!!

  4. Mr Cizo   •  

    Finally what I was looking for! Thanks dude!

  5. Farooq Asif   •  

    Hello !
    I have some problem with gree project , i downloaded xcode project as it is , and run it but i got “some thing went wrong” .. any help ?

    • Berg   •     Author

      I need more details to be able to help with anything !

  6. Stuart T   •  

    Thanks for the tips here. I’m having a hard time integrating this to my cocos2d-x project, but this was helpful with cocos2d-x as well. It’s so similar, but I keep getting hung up at the [… authorize] piece. I can’t seem to get the dialog to show up. :-/ The one thing I can’t get to work is the line “self.window.rootviewcontroller…” piece. I don’t think that line works well with cocos2d-x. Instead I have:


    // Set RootViewController to window
    [window addSubview: viewController.view];
    [window makeKeyAndVisible];

    Shouldn’t this work? Have you seen this or know off the top of your head what I’m missing here?

    • gustavo   •  

      Hi Stuart T , i stopped in same code , did you find a solution?
      The rest runs ok , but the Gree window doest appear , i think there is some different flow inside coco2dx viewController.

      thanks

    • Stuart T   •  

      Hey, Gustavo! I isolated the issue. It’s really, really simple, it turns out. At least it was for me.

      In your iOS project, in the AppController.mm (for cocos2d-x) include this line before your cocos2d::…Run(); line somewhere:


      //cocos2d-x v1.0
      window.rootViewController = viewController;

      When you access it with self.window…. it crashes. Maybe that will help! Below to Berg, I posted the complete function if you want to look at it.

      -Stu

    • gustavo   •  

      Thanks by the code , Stuart , i dont know if you are having a problem after this configuration , no window of gree appear , im having some problem with the shareInstance of the method:

      – (void)greeNotifyDelegateWillDisplay
      {
      if (![self greeIsPresenting] && ![self greeCurrentPopup]) {
      [[[GreePlatform sharedInstance] delegate] greePlatformWillShowModalView:[GreePlatform sharedInstance]];
      }
      }

    • Stuart T   •  

      I haven’t tried that piece yet, but the only problem I’m having is getting the keyboard to go away. I see your facebook link. I’ll message you there, so we don’t have to clutter Berg’s comments. 🙂

    • Berg   •     Author

      Yeah I ran into the same problem with cocos2d !, it had something to do with setting the rootviewcontroller properly !

      From your code I don’t see that you’re setting the RootViewController property !, this is the main cause of the authorize not showing !
      if you can send me a bigger snippet of the code I’m sure I can help !

      you can also email me and i’ll update it to the post here cause sometimes it’s hard to follow the comments !

    • Stuart T   •  

      Thank you so much for your offer to help. With a fresh set of eyes, a cup of coffee and my debugger I figured out what was wrong. With cocos2d-x you only need to modify your existing post a tiny bit to work! After all that effort! hah!

      Anyways, here’s what my “AppController.mm” didFinishLaunchingWithOptions looks like (this is the cocos2d-x version of your AppDelegate – it even has the same formal protocols, but there’s a c++ delegate for cocos2d-x)


      - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

      // Override point for customization after application launch.

      //Init gree's settings!
      NSDictionary* GreeSettings = [NSDictionary dictionaryWithObjectsAndKeys:
      [NSNumber numberWithBool:NO], GreeSettingUseWallet,
      [NSNumber numberWithBool:YES], GreeSettingEnableGrade0,
      [NSNumber numberWithBool:YES], GreeSettingNotificationEnabled,
      GreeDevelopmentModeSandbox, GreeSettingDevelopmentMode
      , nil];

      [GreePlatform initializeWithApplicationId:APP_ID consumerKey:CONSUMER_KEY consumerSecret:CONSUMER_SECRET settings:GreeSettings delegate:self];

      // Add the view controller's view to the window and display.
      window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];
      EAGLView *__glView = [EAGLView viewWithFrame: [window bounds]
      pixelFormat: kEAGLColorFormatRGBA8
      depthFormat: GL_DEPTH_COMPONENT16_OES
      preserveBackbuffer: NO
      sharegroup: nil
      multiSampling: NO
      numberOfSamples: 0 ];

      [__glView setMultipleTouchEnabled:YES];

      // Use RootViewController manage EAGLView
      viewController = [[RootViewController alloc] initWithNibName:nil bundle:nil];
      viewController.wantsFullScreenLayout = YES;
      viewController.view = __glView;

      // Set RootViewController to window
      [window addSubview: viewController.view];
      [window makeKeyAndVisible];

      [[UIApplication sharedApplication] setStatusBarHidden: YES];

      //cocos2d-x v1.0
      window.rootViewController = viewController;

      cocos2d::CCApplication::sharedApplication().run();
      return YES;
      }

      Feel free to add this in, leave it where it is, or whatever. But thank you for this blog post!

    • Stuart T   •  

      I did hit a problem with integration that I don’t see in your example code. I recorded a video demonstrating the issue. Have you seen this? It’s in a generic cocos2d-x “hello world” project — any interest in taking a look? I’ll happily send you the project. 🙂

      http://www.youtube.com/watch?v=calQG340Tb8&feature=youtu.be

    • Berg   •     Author

      Hey stuart !, just saw that comment now !
      please email me the project file as this is very interesting !, i’ll happily take a look at this guy for ya !

      i’ll also add your code to the post later this weekend !, thanks for the replies ! 🙂

  7. Jason Xu   •  

    Hi Berg, the links for downloading code seems invalidated… : (

    • Berg   •     Author

      Hey Jason, sorry about that i just noticed i accidentally deleted the files while moving to my new laptop :(, i’ll do my best to retrieve them ASAP !

  8. Chetan Rana   •  

    Thanks a lot Berg. It is really a great tutorial. But downloading link are invalid. Dropbox shows 404 page

    • Chris   •  

      I can confirm that both download links are broken and hope you will update them. Thanks for the great tutorial!

Leave a Reply

Your email address will not be published. Required fields are marked *