content top

Difference between frame and bound?

This question gets asked a lot, so here’s a perfect slide to explain:

Read More

Tip: amount of enum items for a type

typedef enum FoodType{
	fruit = 0,
	bread,
	candy,
	numFoodTypes
}FoodType;

Keep in mind that this only works for contigues values, meaning, when fruit = 0, bread = 1, candy = 2.

Read More

Clipping / Masking a CCNode / CCSprite

In order to shave off the parts of a CCNode or a CCSprite, the parts of which you do not want to be shown, you’ll have to overload the visit method of the CCNode or the CCSprite. Like so:

-(void)visit
{
	glEnable(GL_SCISSOR_TEST);
	if([[CCDirector sharedDirector] enableRetinaDisplay:YES])
		//glScissor(2*x, 2*y, 2*width, 2*height);
	else
		//glScissor(x, y, width, height);
	glDisable(GL_SCISSOR_TEST);
}

Since the OpenGL functions interpret points literally, you can’t just use the local points (in which Cocos2d interprets the points differently for retina and non-retina displays). This is why I have a check against retina displays.

Read More

Adwhirl + Cocos2d iPhone iPad implementation tutorial

I read a blogpost over at: http://emeene.com/2010/10/adwhirl-cocos2d-iphone/ Couldn’t get it to work while following the tutorial. There’s also a lot of extra code that I didn’t need (such as offline ad storage, and optional ads for free and paid versions). Anyways, here’s how I implemented it:
1. Follow the readme first, add any extra frameworks as needed for each of your ad networks and add the files into your project.
2. In the AppDelegate.h here’s what mine looks like (imported AdwhirlDelegateProtocol.h, specify that this AppDelegate will follow the AdwhirlDelegate, add the property for root controller, and list out the extra methods needed to implement the AdwhirlDelegate):

#import <UIKit/UIKit.h>
#import "AdWhirlDelegateProtocol.h"
@class RootViewController;

@interface AppDelegate : NSObject <UIApplicationDelegate, AdWhirlDelegate> {
	UIWindow			*window;
	RootViewController	*viewController;
}
- (NSString *)adWhirlApplicationKey;
- (UIViewController *)viewControllerForPresentingModalView;
- (void)applicationDidFinishLaunching:(UIApplication *)application;
@property (nonatomic, retain) UIWindow *window;
@property (nonatomic, retain) RootViewController *viewController;
@end

3. In AppDelegate.m, implemented the extra methods as follows (make sure to import “AdWhirlView.h”):

- (NSString *)adWhirlApplicationKey {
	return @"XXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
}
- (UIViewController *)viewControllerForPresentingModalView {
	return viewController;
}
- (void)adWhirlDidReceiveAd:(AdWhirlView *)adWhirlView { 

    [adWhirlView rotateToOrientation:UIInterfaceOrientationLandscapeRight]; //My game is landscape only, adjust yours accordingly
	CGSize adSize = [adWhirlView actualAdSize];
	CGRect newFrame = adWhirlView.frame;

	newFrame.size = adSize;
	newFrame.origin.x = [[CCDirector sharedDirector] winSize].width/2-adSize.width/2;
	newFrame.origin.y = [[CCDirector sharedDirector] winSize].height-adSize.height;

	adWhirlView.frame = newFrame;

}

Make sure to input your adwhirlapplicationkey (get it from the adwhirl website).

4. Lastly, add this to the end of applicationDidFinishLaunching in AppDelegate.m

	AdWhirlView *adWhirlView = [AdWhirlView requestAdWhirlViewWithDelegate:self];
	[[[CCDirector sharedDirector] openGLView] addSubview:adWhirlView];

The ads should now be visible.

Read More

Converting Objects into NSData for sending over remote connections (Bluetooth/Wifi)

First you need your object to conform to the NSCoding protocol. (Note: PacketType is a simple enumerated type. If you aren’t sure, imagine packetType is an int).

#import <Foundation/Foundation.h>
#import "PacketObject.h"
@interface PacketJoinObject : PacketObject <NSCoding>{
        PacketTypes packetType;
	NSString *name;
}
@property PacketTypes packetType;
@property (copy) NSString *name;

@end

Here’s the PacketJoinObject.m

#import "PacketJoinObject.h"

@implementation PacketJoinObject
@synthesize packetType, name;
#define kPacketTypes @"PacketTypes"
#define kName @"Name"
-(void)encodeWithCoder:(NSCoder*)coder
{
	[coder encodeInt:self.packetType forKey:kPacketTypes];
	[coder encodeObject:self.name forKey:kName];
}
-(id)initWithCoder:(NSCoder*)aDecoder
{
	self.packetType = [aDecoder decodeIntForKey:kPacketTypes];
	self.name = [aDecoder decodeObjectForKey:kName];
	return self;
}
-(NSString*)getName
{
	return name;
}
-(void)dealloc
{
	[name release];
	[super dealloc];
}
@end

Then in your code that will send this object to another iOS device:

PacketJoinObject *newJoinPacket = [[PacketJoinObject alloc] init];
newJoinPacket.packetType = kPacketTypeJoin;
newJoinPacket.name = @"SomeName";

Then in your receiver code:

PacketJoinObject *joinPacket = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Read More

What’s going to be in here?

I’m starting this website mainly just to dump snippets of code that I might need to remember later. Could be useful to others so I’m making it public.

Read More
content top