Hi, if you happen to be stuck on cocos2d v0.8.2 like me, and can't upgrade to latest versions 0.99.X for any reason (probably something wrong on our code), but still want to use Zwoptex to manage your sprite sheets, here it is a simple solution based on the CCSpriteFrameCache class on v0.99.3:
SpriteManager.h
#import "cocos2d.h"
@interface AtlasSpriteManager (SpriteManager)
NSDictionary *frames;
int formatPlist;
+(id)spriteManagerWithFile:(NSString*)fileImage plist:(NSString*)plist capacity:(NSUInteger)capacity;
+(id)spriteManagerWithFile:(NSString*) imageFile plist:(NSString*)plist;
+(void)createDictionaryFromPlist:(NSString*)plist;
-(AtlasSprite *)createSprite:(NSString*) imageFileName;
@end
SpriteManager.m:
#import "SpriteManager.h"
const int _defaultCapacity = 29;
@implementation AtlasSpriteManager (SpriteManager)
+(id)spriteManagerWithFile:(NSString*)fileImage plist:(NSString*)plist capacity:(NSUInteger)capacity
{
[AtlasSpriteManager createDictionaryFromPlist:plist];
return [[[AtlasSpriteManager alloc] initWithFile:fileImage capacity:capacity] autorelease];
}
+(id)spriteManagerWithFile:(NSString*) imageFile plist:(NSString*)plist
{
[AtlasSpriteManager createDictionaryFromPlist:plist];
return [[[AtlasSpriteManager alloc] initWithFile:imageFile capacity:_defaultCapacity] autorelease];
}
+(void)createDictionaryFromPlist:(NSString*)plist
{
NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:plist];
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
NSDictionary *metadataDict = [dict objectForKey:@"metadata"];
// get the format
if (metadataDict != nil) {
formatPlist = [[metadataDict objectForKey:@"format"] intValue];
} else {
formatPlist = 0;
}
frames = [dict objectForKey:@"frames"];
//NSLog(@"SpriteManager.spriteManagerWithFile: %@", frames);
}
-(AtlasSprite *)createSprite:(NSString*) imageFileName
{
if(formatPlist == 0) {
NSDictionary *properties = [frames objectForKey:imageFileName];
float x = [[properties objectForKey:@"x"] floatValue];
float y = [[properties objectForKey:@"y"] floatValue];
float w = [[properties objectForKey:@"width"] floatValue];
float h = [[properties objectForKey:@"height"] floatValue];
float ox = [[properties objectForKey:@"offsetX"] floatValue];
float oy = [[properties objectForKey:@"offsetY"] floatValue];
//int ow = [[properties objectForKey:@"originalWidth"] intValue];
//int oh = [[properties objectForKey:@"originalHeight"] intValue];
//NSLog(@"SpriteManager.createSprite: %@", properties);
AtlasSprite *sprite = [AtlasSprite spriteWithRect:CGRectMake(x + ox, y + oy, w, h) spriteManager:self];
[self addChild:sprite];
return sprite;
} else if (formatPlist == 1) {
NSDictionary *properties = [frames objectForKey:imageFileName];
CGRect frame = CGRectFromString([properties objectForKey:@"frame"]);
CGPoint offset = CGPointFromString([properties objectForKey:@"offset"]);
//CGSize sourceSize = CGSizeFromString([properties objectForKey:@"sourceSize"]);
frame.origin.x += offset.x;
frame.origin.y += offset.y;
AtlasSprite *sprite = [AtlasSprite spriteWithRect:frame spriteManager:self];
[self addChild:sprite];
return sprite;
} else {
NSAssert(NO,@"cocos2d: WARNING: format is not supported for SpriteManager");
return nil;
}
}
@end
To use it, easy:
AtlasSpriteManager *spriteManager = [AtlasSpriteManager spriteManagerWithFile:@"sprite_sheet.png" plist:@"sprite_sheet.plist"];
[self addChild:spriteManager z:1];
AtlasSprite *spriteAtlas = [spriteManager createSprite:@"file_name.png"];