Tiny Defense: Using UIScrollView in Cocos2d by Sash

So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch.

Most of my time I was working on a solution to implementing scrollviews in cocos2d. Turns out this isn’t as straight forward as I thought, but I found a tutorial over at getsetgames.com which gave me a good place to start. I have to warn you, the code in that tutorial is pretty messy. I’ve cleaned it up a lot below.

The Problem

Cocos 2d has no equivalent to UIScrollView. You can’t even use the regular UIScrollview, since it doesn’t fit into the framework. This leaves you with two possible solutions:

  1. Reverse engineer the UIScroll View
    This would take a long time to get right. Apple has put a lot of polish into making the touch interactions perfect. There are a ton of edge cases and the code is not available to copy. Ouch.
  2. Implement an invisible UIScrollView
    And use its contentOffset property to position your CCNode. Much better!

The later solution is much cleaner and has a straight forward implementation. Basically it works like this. We subclass UIScrollView, make sure it is invisible, put it on top of Cocos2d so that the user is interacting with it, then take the scroll position and apply it to the stuff in cocos2D each frame. There are a few challenges that we will have a look at, but check out the code I wrote first:

Code: CCScrollView.h

#import "cocos2d.h"

@interface CCScrollView : UIScrollView

+ (CCScrollView *) makeScrollViewWithWidth:(int)width Height:(int)height;

- (void)setWidth:(int)width Height:(int)height;
- (int) getOffset;
- (CGPoint) getOffsetAsPoint;

@end

Code: CCScrollView.m

#import "CCScrollView.h"

@implementation CCScrollView

/*
* Returns a CCScrollView Object.
* You can treat this like a regular UIScrollView, but don't add subviews. Instead
* use the methods getOffset and getOffsetAsPoint to set the Y Position of the
* CCNode you want to scroll each frame
*/
+(CCScrollView *) makeScrollViewWithWidth:(int)width Height:(int)height
{
   CCScrollView * scrollView =
     [[CCScrollView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
   scrollView.contentSize = CGSizeMake(width, height);
   scrollView.showsHorizontalScrollIndicator = NO;
   scrollView.showsVerticalScrollIndicator = NO;
   [scrollView setUserInteractionEnabled:TRUE];
   [scrollView setScrollEnabled:TRUE];

   [[[CCDirector sharedDirector] openGLView] addSubview:scrollView];

   return scrollView;
}

/*
* Change the size of the scrollable area
*/
- (void)setWidth:(int)width Height:(int)height
{
   self.contentSize = CGSizeMake(width, height);
}

/*
* Returns the offset of the scrollview as a point
*/
- (CGPoint) getOffsetAsPoint
{
   CGPoint offset = [self contentOffset];
   offset = [[CCDirector sharedDirector] convertToGL: offset];
   offset.y *= -1;
   offset.x *= -1;

   return offset;
}

/*
* Returns the Y co-ordinate of the offset of the ScrollView
*/
- (int) getOffset
{
   CGPoint offset = [self getOffsetAsPoint];
   return offset.y;
}

- (void) dealloc
{
   [self removeFromSuperview];
   [super dealloc];
}

/*
* Override touch functions
* This allows Cocos2d to process touches
*/
-(void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event
{
   if (!self.dragging)
      [[[CCDirector sharedDirector] openGLView] touchesBegan:touches withEvent:event];

   [super touchesBegan: touches withEvent: event];
}

-(void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event
{
   if (!self.dragging)
      [[[CCDirector sharedDirector] openGLView] touchesEnded:touches withEvent:event];

   [super touchesEnded: touches withEvent: event];
}
@end

Code: Implementation.m

//
//  Implementation.m
//  TinyDefense
//
//  Created by Sasha MacKinnon on 21/09/11.
//  Copyright 2011 Bit Battalion. All rights reserved.
//

#import "Implementation.h"

@implementation Implementation

+ (CCScene *) scene
{
    CCScene * s = [CCScene node];
    Implementation * l = [Implementation node];
    [s addChild:l];

    return s;
}

- (id)init
{
    if (self = [super init])
    {
        gameNode = [[CCNode alloc] init];

        //add the background to the game
        background = [CCSprite spriteWithFile:@"background.png"];
        background.position = ccp(160, 480);
        [gameNode addChild:background];
        [self addChild: gameNode];

        //set up scrolling
        scrollView = [CCScrollView makeScrollViewWithWidth:320 Height:960];

        [self schedule:@selector(enterFrame:)];
    }

    return self;
}

- (void) enterFrame: (ccTime) dt
{
    gameNode.position = ccp(0, [scrollView getOffset]);
}
@end

Setting up the UIScrollView

We want an easy way to create scroll views without having to go through the hassle of manually allocing and setting properties every time w need a new one. The makeScrollViewWithWidth method does just this. It:

  • creates the scroll view,
  • sets its content size to the arguments
  • adds itself to the OpenGLView, so it appears on the screen
+(CCScrollView *) makeScrollViewWithWidth:(int)width Height:(int)height
{
    CCScrollView * scrollView =
       [[CCScrollView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
    scrollView.contentSize = CGSizeMake(width, height);
    scrollView.showsHorizontalScrollIndicator = NO;
    scrollView.showsVerticalScrollIndicator = NO;
    [scrollView setUserInteractionEnabled:TRUE];
    [scrollView setScrollEnabled:TRUE];

    [[[CCDirector sharedDirector] openGLView] addSubview:scrollView];

    return scrollView;
}

The contentOffset Property

Next we need is to be able to access the position of our ScrollView after the user has scrolled. Since CCScrollView is a subclass of UIScrollView, we could access the “contentOffset” property directly, but we need to do a few transformations on that before hand to make it work the way we want. I made getter methods to make life easier:

- (CGPoint) getOffsetAsPoint
{
    CGPoint offset = [self contentOffset];
    offset = [[CCDirector sharedDirector] convertToGL: offset];
    offset.y *= -1;
    offset.x *= -1;

    return offset;
}

- (int) getOffset
{
    CGPoint offset = [self getOffsetAsPoint];
    return offset.y;
}

Making sure touches are registered by cocos2D

Right now we can have elements scrolling on the screen, but we can’t touch any of them. This is because CCScrollView is sitting on top of cocos2d, so the touches stop being processed before they hit cocos2D. To solve this we override touchBegan and touchEnd, and pass the touches down to cocos2D

-(void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event
{
    if (!self.dragging)
        [[[CCDirector sharedDirector] openGLView] touchesBegan:touches withEvent:event];
    [super touchesBegan: touches withEvent: event];
}

-(void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event
{
    if (!self.dragging)
        [[[CCDirector sharedDirector] openGLView] touchesEnded:touches withEvent:event];
    [super touchesEnded: touches withEvent: event];
}

Fixing the content offset bug

But it STILL won’t work. Cocos2D, for some weird reason, isn’t prepared to deal with the touches we get from UIScrollView. It offsets the touches by a small margin when you scroll down far enough. I found a great solution online, which requires a quick change to CCNode.m

http://stackoverflow.com/questions/2457380/uiscrollview-and-cocos2d

Basically replace these functions in CCNode.m:

- (CGPoint)convertTouchToNodeSpace:(UITouch *)touch {
    // cocos2d 1.0 rc bug when using with additional overlayed views (such as UIScrollView).
    // CGPoint point = [touch locationInView: [touch view]];
    CGPoint point = [touch locationInView: [[CCDirector sharedDirector] openGLView]];
    point = [[CCDirector sharedDirector] convertToGL: point];
    return [self convertToNodeSpace:point];
}

- (CGPoint)convertTouchToNodeSpaceAR:(UITouch *)touch {
    // cocos2d 1.0 rc bug when using with additional overlayed views (such as UIScrollView).
    // CGPoint point = [touch locationInView: [touch view]];
    CGPoint point = [touch locationInView: [[CCDirector sharedDirector] openGLView]];
    point = [[CCDirector sharedDirector] convertToGL: point];
    return [self convertToNodeSpaceAR:point];
}

and CCMenu.m

-(CCMenuItem *) itemForTouch: (UITouch *) touch {
    // cocos2d 1.0 rc bug when using with additional overlayed views (such as UIScrollView).
    // CGPoint touchLocation = [touch locationInView: [touch view]];
    CGPoint touchLocation = [touch locationInView: [[CCDirector sharedDirector] openGLView]];
    touchLocation = [[CCDirector sharedDirector] convertToGL: touchLocation];
    ...

And now it’s ready to go!! The code is here in full, so feel free to copy paste these classes.

Fixing it for iOS 5

After all this, it might still not work with iOS 5. Instead of explaining why, I’ll point you to a stack overflow answer that has the solution:

Animation in OpenGL ES view freezes when UIScrollView is dragged on the iPhone

Whats Next

I’ve done a ton of work since I made this video which I’ll post in a few days. Tonight, I’m travelling back to Australia! I’m hoping to get a bit of code written on the plane before my battery dies. Wish me luck!


Discussion

  1. spartagen xt says:

    Woah! I’m really enjoying the template/theme of this site. It’s simple, yet effective. A lot of times it’s challenging to get that “perfect balance” between user friendliness and visual appeal. I must say that you’ve done a awesome job with this. Also, the blog loads extremely fast for me on Internet explorer. Excellent Blog!

  2. spartagen xt says:

    I have read several good stuff here. Certainly worth bookmarking for revisiting. I surprise how much effort you put to create such a great informative web site.

  3. spartagen xt says:

    Outstanding post but I was wondering if you could write a litte more on this subject? I’d be very grateful if you could elaborate a little bit more. Kudos!

  4. As a Newbie, I am permanently browsing online for articles that can aid me. Thank you

  5. My husband and i got very happy that Peter could carry out his inquiry using the precious recommendations he discovered through the site. It’s not at all simplistic to simply possibly be freely giving helpful tips which the rest might have been trying to sell. And now we realize we’ve got the writer to appreciate for that. Those illustrations you’ve made, the straightforward web site navigation, the friendships your site help instill – it’s got most remarkable, and it’s really helping our son in addition to our family understand that topic is satisfying, which is exceptionally essential. Thanks for the whole thing!

  6. Auto Engine says:

    I like what you guys are up too. Such smart work and reporting! Carry on the excellent works guys I¡¦ve incorporated you guys to my blogroll. I think it’ll improve the value of my site :)

  7. excellent put up, very informative. I ponder why the other experts of this sector don’t notice this. You should continue your writing. I’m sure, you have a huge readers’ base already!

  8. Business says:

    Undeniably believe that which you said. Your favorite justification seemed to be on the net the easiest thing to be aware of. I say to you, I definitely get irked while people think about worries that they just don’t know about. You managed to hit the nail upon the top and also defined out the whole thing without having side effect , people could take a signal. Will probably be back to get more. Thanks

  9. You can certainly see your skills in the paintings you write. The world hopes for even more passionate writers like you who are not afraid to say how they believe. At all times go after your heart.

  10. Horticulture says:

    Excellent post. I was checking constantly this blog and I am impressed! Very useful info specifically the last part :) I care for such info a lot. I was looking for this certain information for a very long time. Thank you and best of luck.

  11. Truck Repair says:

    I just could not depart your website prior to suggesting that I actually enjoyed the standard information a person provide to your visitors? Is going to be again steadily in order to inspect new posts

  12. Plants says:

    Awsome site! I am loving it!! Will come back again. I am taking your feeds also

  13. You really make it seem so easy with your presentation but I find this topic to be really something that I think I would never understand. It seems too complex and very broad for me. I am looking forward for your next post, I will try to get the hang of it!

  14. Accounting says:

    Hey There. I found your blog using msn. This is a really well written article. I will be sure to bookmark it and come back to read more of your useful info. Thanks for the post. I’ll certainly return.

  15. I¡¦ve been exploring for a bit for any high quality articles or weblog posts in this kind of house . Exploring in Yahoo I finally stumbled upon this website. Studying this info So i¡¦m satisfied to show that I’ve an incredibly good uncanny feeling I discovered just what I needed. I so much indisputably will make sure to do not omit this website and give it a look on a constant basis.

  16. Heya i’m for the first time here. I came across this board and I find It truly useful & it helped me out a lot. I hope to give something back and help others like you aided me.

  17. naturally like your web site however you need to take a look at the spelling on several of your posts. Several of them are rife with spelling issues and I find it very troublesome to tell the truth nevertheless I will definitely come again again.

  18. ppob arindo says:

    You really make it seem so easy with your presentation but I find this matter to be actually something that I think I would never understand. It seems too complex and extremely broad for me. I am looking forward for your next post, I will try to get the hang of it!

  19. cek pdam says:

    You made certain fine points there. I did a search on the issue and found a good number of folks will consent with your blog.

  20. I’ve been browsing on-line more than three hours nowadays, but I by no means discovered any attention-grabbing article like yours. It is pretty worth sufficient for me. In my opinion, if all site owners and bloggers made good content material as you probably did, the internet will be much more helpful than ever before.

  21. A lot of thanks for all of your labor on this site. Kate take interest in setting aside time for internet research and it’s obvious why. A number of us notice all relating to the dynamic manner you convey very useful ideas by means of your web blog and encourage response from other people on the area of interest plus our favorite daughter is now learning a lot of things. Take pleasure in the remaining portion of the year. You have been performing a useful job.

  22. New Car says:

    Hello.This post was extremely interesting, especially because I was browsing for thoughts on this topic last Wednesday.

  23. It is truly a nice and helpful piece of info. I am glad that you shared this useful information with us. Please stay us up to date like this. Thank you for sharing.

  24. ppob fastpay says:

    We are a group of volunteers and starting a new scheme in our community. Your website offered us with valuable information to work on. You’ve done a formidable job and our entire community will be grateful to you.

  25. It’s the best time to make some plans for the longer term and it’s time to be happy. I have read this put up and if I could I want to recommend you some fascinating issues or advice. Maybe you could write subsequent articles regarding this article. I desire to learn even more issues about it!

  26. Wonderful paintings! This is the type of information that should be shared around the net. Shame on Google for no longer positioning this put up upper! Come on over and talk over with my web site . Thank you =)

  27. ppob arindo says:

    whoah this weblog is wonderful i really like studying your posts. Keep up the good paintings! You already know, many individuals are searching round for this information, you can aid them greatly.

  28. As a Newbie, I am permanently browsing online for articles that can help me. Thank you

  29. ppob fastpay says:

    I am continuously browsing online for ideas that can help me. Thanks!

  30. cek pdam says:

    hello!,I like your writing very much! share we keep up a correspondence more about your article on AOL? I need an expert on this area to solve my problem. May be that is you! Taking a look forward to look you.

  31. Simply want to say your article is as astonishing. The clearness in your post is just great and i can assume you are an expert on this subject. Well with your permission allow me to grab your RSS feed to keep updated with forthcoming post. Thanks a million and please continue the enjoyable work.

  32. Thanks a lot for providing individuals with an exceptionally remarkable possiblity to read in detail from this website. It is usually so good and full of fun for me personally and my office fellow workers to visit your web site nearly three times per week to learn the newest secrets you have. And lastly, I am also always impressed considering the striking solutions you give. Selected 3 tips in this article are without a doubt the finest we have all ever had.

  33. Our rigorous screening methods ensure the greatest pureness
    feasible. All our products are made and offered
    in UNITED STATE only by various distribution centers.

  34. Acupuncture says:

    Very nice article and straight to the point. I am not sure if this is actually the best place to ask but do you people have any ideea where to hire some professional writers? Thank you :)

  35. Simply wish to say your article is as surprising. The clearness in your post is just spectacular and i can assume you’re an expert on this subject. Well with your permission let me to grab your RSS feed to keep updated with forthcoming post. Thanks a million and please keep up the gratifying work.

  36. Definitely believe that which you stated. Your favorite justification seemed to be on the web the simplest thing to be aware of. I say to you, I certainly get annoyed while people consider worries that they plainly do not know about. You managed to hit the nail upon the top and defined out the whole thing without having side effect , people could take a signal. Will likely be back to get more. Thanks

  37. If you are not sure as to whether or not you may need a prescription for any type of particular product, merely check
    the item’s details on our website or you can get our on the internet examination. Our peptide
    items offer an entire range of advantages and high qualities, and it’s important to understand the high qualities of what you get.
    For instance, CJC-1295 cream boosts the body’s development bodily
    hormone in feedback and also has an anabolic impact on the body’s cells by boosting
    lean body mass, advertising deep rest, enhancing vigor, stamina and endurance,
    advertising liver features to name a few benefits.

    For all of our products’ details, simply choose the item you want to
    scroll and watch down to get a complete analysis of the peptide item’s functions, advantages and also materials.

  38. Wow, incredible blog layout! How long have you been blogging for? you made blogging look easy. The overall look of your site is wonderful, let alone the content!

  39. whoah this blog is magnificent i really like studying your articles. Stay up the good work! You understand, a lot of people are searching around for this info, you can help them greatly.

  40. Bisa Nomerix says:

    Great write-up, I am a big believer in placing comments on sites to inform the blog writers know that they’ve added something advantageous to the world wide web!

  41. I cling on to listening to the rumor speak about getting boundless online grant applications so I have been looking around for the best site to get one. Could you advise me please, where could i get some?

  42. I really appreciate this post. I have been looking everywhere for this! Thank goodness I found it on Bing. You’ve made my day! Thank you again

  43. Ams says:

    I have been surfing online greater than 3 hours today, but I by no means discovered any interesting article like yours. It¡¦s pretty worth sufficient for me. Personally, if all website owners and bloggers made good content material as you probably did, the net might be a lot more useful than ever before.

  44. I am just commenting to let you understand what a really good experience my friend’s daughter went through studying your web page. She learned numerous pieces, including what it is like to possess a wonderful helping mood to make other people with ease have an understanding of certain specialized things. You undoubtedly did more than readers’ expected results. I appreciate you for giving these priceless, healthy, edifying and as well as easy tips about your topic to Kate.

  45. Content pour cette documentation très complète. Je vais attendre les prochains articles avec interet. Chris

  46. My wife and i were absolutely more than happy when Raymond could finish off his preliminary research through the entire precious recommendations he had from your very own web site. It’s not at all simplistic to just find yourself releasing guides that others have been selling. Therefore we figure out we now have you to appreciate for that. These illustrations you made, the simple web site menu, the relationships you assist to foster – it’s all sensational, and it’s leading our son in addition to our family feel that that matter is exciting, which is certainly especially essential. Many thanks for everything!

  47. Hi there, i read your blog from time to time and i own a similar one and i was just curious if you get a lot of spam remarks? If so how do you prevent it, any plugin or anything you can advise? I get so much lately it’s driving me mad so any support is very much appreciated.

  48. nicee content keep writing

  49. This is one very informative blog. I like the way you write and I will bookmark your blog to my favorites.

  50. magnificent submit, very informative. I’m wondering why the other experts of this sector do not understand this. You should proceed your writing. I’m sure, you’ve a great readers’ base already!

  1. read more linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  2. adam and eve sex toy linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  3. kona coffee linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  4. my website linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  5. The MLS Real Estate linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  6. kona coffee linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  7. mobile app builder linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  8. home gym linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  9. Family solicitor linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  10. how to make an app linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  11. Miniclip Oyunları linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  12. [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  13. MLS linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  14. perusahaan anti rayap linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  15. noclegi sopot linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  16. backlinks linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  17. my review here linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  18. [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  19. original site linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  20. Bailers linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  21. new movies linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  22. [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  23. [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  24. [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  25. acheter follower linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  26. singing talent search linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  27. how to earn linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  28. gem residences psf linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  29. [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  30. [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  31. [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  32. [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  33. kona coffee linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  34. kona coffee linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  35. coffee beans linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  36. Denver web designer linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  37. container houses linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  38. useful content linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  39. girne üniversite linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  40. gourmet coffee beans linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  41. kona coffee beans linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  42. kona coffee linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  43. [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  44. [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  45. kona coffee k cups linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  46. [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  47. hualalai coffee linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  48. kona coffee linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  49. kona coffee linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

  50. royal kona coffee linked here

    [... So as you know that I spent the weekend trying to get xcode, objective c and cocos2d to be my bitch. Most of my time I was working on a solution ...]

Leave a Comment