Refactoring to make it easier to load a SkeletonData in a subclass constructor.

This commit is contained in:
NathanSweet 2013-04-29 14:42:01 +02:00
parent eb190c4b3e
commit 0d488eafe6
7 changed files with 50 additions and 33 deletions

View File

@ -44,11 +44,11 @@ Draws a skeleton.
Atlas* _atlas; Atlas* _atlas;
} }
+ (id) skeletonWithData:(SkeletonData*)skeletonData; + (id) skeletonWithData:(SkeletonData*)skeletonData ownsSkeletonData:(bool)ownsSkeletonData;
+ (id) skeletonWithFile:(NSString*)skeletonDataFile atlas:(Atlas*)atlas scale:(float)scale; + (id) skeletonWithFile:(NSString*)skeletonDataFile atlas:(Atlas*)atlas scale:(float)scale;
+ (id) skeletonWithFile:(NSString*)skeletonDataFile atlasFile:(NSString*)atlasFile scale:(float)scale; + (id) skeletonWithFile:(NSString*)skeletonDataFile atlasFile:(NSString*)atlasFile scale:(float)scale;
- (id) initWithData:(SkeletonData*)skeletonData; - (id) initWithData:(SkeletonData*)skeletonData ownsSkeletonData:(bool)ownsSkeletonData;
- (id) initWithFile:(NSString*)skeletonDataFile atlas:(Atlas*)atlas scale:(float)scale; - (id) initWithFile:(NSString*)skeletonDataFile atlas:(Atlas*)atlas scale:(float)scale;
- (id) initWithFile:(NSString*)skeletonDataFile atlasFile:(NSString*)atlasFile scale:(float)scale; - (id) initWithFile:(NSString*)skeletonDataFile atlasFile:(NSString*)atlasFile scale:(float)scale;

View File

@ -27,7 +27,7 @@
#import <spine/spine-cocos2d-iphone.h> #import <spine/spine-cocos2d-iphone.h>
@interface CCSkeleton (Private) @interface CCSkeleton (Private)
- (void) initialize:(SkeletonData*)skeletonData; - (void) initialize:(SkeletonData*)skeletonData ownsSkeletonData:(bool)ownsSkeletonData;
@end @end
@implementation CCSkeleton @implementation CCSkeleton
@ -37,8 +37,8 @@
@synthesize debugSlots = _debugSlots; @synthesize debugSlots = _debugSlots;
@synthesize debugBones = _debugBones; @synthesize debugBones = _debugBones;
+ (id) skeletonWithData:(SkeletonData*)skeletonData { + (id) skeletonWithData:(SkeletonData*)skeletonData ownsSkeletonData:(bool)ownsSkeletonData {
return [[[CCSkeleton alloc] initWithData:skeletonData] autorelease]; return [[[CCSkeleton alloc] initWithData:skeletonData ownsSkeletonData:ownsSkeletonData] autorelease];
} }
+ (id) skeletonWithFile:(NSString*)skeletonDataFile atlas:(Atlas*)atlas scale:(float)scale { + (id) skeletonWithFile:(NSString*)skeletonDataFile atlas:(Atlas*)atlas scale:(float)scale {
@ -49,7 +49,9 @@
return [[[CCSkeleton alloc] initWithFile:skeletonDataFile atlasFile:atlasFile scale:scale] autorelease]; return [[[CCSkeleton alloc] initWithFile:skeletonDataFile atlasFile:atlasFile scale:scale] autorelease];
} }
- (void) initialize:(SkeletonData*)skeletonData { - (void) initialize:(SkeletonData*)skeletonData ownsSkeletonData:(bool)ownsSkeletonData {
_ownsSkeletonData = ownsSkeletonData;
_skeleton = Skeleton_create(skeletonData); _skeleton = Skeleton_create(skeletonData);
_blendFunc.src = GL_ONE; _blendFunc.src = GL_ONE;
@ -61,13 +63,13 @@
[self scheduleUpdate]; [self scheduleUpdate];
} }
- (id) initWithData:(SkeletonData*)skeletonData { - (id) initWithData:(SkeletonData*)skeletonData ownsSkeletonData:(bool)ownsSkeletonData {
NSAssert(skeletonData, @"skeletonData cannot be null."); NSAssert(skeletonData, @"skeletonData cannot be null.");
self = [super init]; self = [super init];
if (!self) return nil; if (!self) return nil;
[self initialize:skeletonData]; [self initialize:skeletonData ownsSkeletonData:ownsSkeletonData];
return self; return self;
} }
@ -83,8 +85,7 @@
SkeletonJson_dispose(json); SkeletonJson_dispose(json);
if (!skeletonData) return 0; if (!skeletonData) return 0;
[self initialize:skeletonData]; [self initialize:skeletonData ownsSkeletonData:YES];
_ownsSkeletonData = YES;
return self; return self;
} }
@ -104,8 +105,7 @@
SkeletonJson_dispose(json); SkeletonJson_dispose(json);
if (!skeletonData) return 0; if (!skeletonData) return 0;
[self initialize:skeletonData]; [self initialize:skeletonData ownsSkeletonData:YES];
_ownsSkeletonData = YES;
return self; return self;
} }

View File

@ -40,11 +40,11 @@ Draws an animated skeleton, providing a simple API for applying one or more anim
NSMutableArray* _stateDatas; NSMutableArray* _stateDatas;
} }
+ (id) skeletonWithData:(SkeletonData*)skeletonData; + (id) skeletonWithData:(SkeletonData*)skeletonData ownsSkeletonData:(bool)ownsSkeletonData;
+ (id) skeletonWithFile:(NSString*)skeletonDataFile atlas:(Atlas*)atlas scale:(float)scale; + (id) skeletonWithFile:(NSString*)skeletonDataFile atlas:(Atlas*)atlas scale:(float)scale;
+ (id) skeletonWithFile:(NSString*)skeletonDataFile atlasFile:(NSString*)atlasFile scale:(float)scale; + (id) skeletonWithFile:(NSString*)skeletonDataFile atlasFile:(NSString*)atlasFile scale:(float)scale;
- (id) initWithData:(SkeletonData*)skeletonData; - (id) initWithData:(SkeletonData*)skeletonData ownsSkeletonData:(bool)ownsSkeletonData;
- (id) initWithFile:(NSString*)skeletonDataFile atlas:(Atlas*)atlas scale:(float)scale; - (id) initWithFile:(NSString*)skeletonDataFile atlas:(Atlas*)atlas scale:(float)scale;
- (id) initWithFile:(NSString*)skeletonDataFile atlasFile:(NSString*)atlasFile scale:(float)scale; - (id) initWithFile:(NSString*)skeletonDataFile atlasFile:(NSString*)atlasFile scale:(float)scale;

View File

@ -34,8 +34,8 @@
@synthesize states = _states; @synthesize states = _states;
+ (id) skeletonWithData:(SkeletonData*)skeletonData { + (id) skeletonWithData:(SkeletonData*)skeletonData ownsSkeletonData:(bool)ownsSkeletonData {
return [[[CCSkeletonAnimation alloc] initWithData:skeletonData] autorelease]; return [[[CCSkeletonAnimation alloc] initWithData:skeletonData ownsSkeletonData:ownsSkeletonData] autorelease];
} }
+ (id) skeletonWithFile:(NSString*)skeletonDataFile atlas:(Atlas*)atlas scale:(float)scale { + (id) skeletonWithFile:(NSString*)skeletonDataFile atlas:(Atlas*)atlas scale:(float)scale {
@ -52,8 +52,8 @@
[self addAnimationState]; [self addAnimationState];
} }
- (id) initWithData:(SkeletonData*)skeletonData { - (id) initWithData:(SkeletonData*)skeletonData ownsSkeletonData:(bool)ownsSkeletonData {
self = [super initWithData:skeletonData]; self = [super initWithData:skeletonData ownsSkeletonData:ownsSkeletonData];
if (!self) return nil; if (!self) return nil;
[self initialize]; [self initialize];

View File

@ -32,8 +32,8 @@ using std::max;
namespace spine { namespace spine {
static CCSkeleton* createWithData (SkeletonData* skeletonData) { static CCSkeleton* createWithData (SkeletonData* skeletonData, bool ownsSkeletonData) {
CCSkeleton* node = new CCSkeleton(skeletonData); CCSkeleton* node = new CCSkeleton(skeletonData, ownsSkeletonData);
node->autorelease(); node->autorelease();
return node; return node;
} }
@ -50,14 +50,11 @@ static CCSkeleton* createWithFile (const char* skeletonDataFile, const char* atl
return node; return node;
} }
void CCSkeleton::initialize (SkeletonData *skeletonData) { void CCSkeleton::initialize () {
ownsSkeletonData = false;
atlas = 0; atlas = 0;
debugSlots = false; debugSlots = false;
debugBones = false; debugBones = false;
skeleton = Skeleton_create(skeletonData);
blendFunc.src = GL_ONE; blendFunc.src = GL_ONE;
blendFunc.dst = GL_ONE_MINUS_SRC_ALPHA; blendFunc.dst = GL_ONE_MINUS_SRC_ALPHA;
@ -65,22 +62,36 @@ void CCSkeleton::initialize (SkeletonData *skeletonData) {
scheduleUpdate(); scheduleUpdate();
} }
CCSkeleton::CCSkeleton (SkeletonData *skeletonData) { void CCSkeleton::setSkeletonData (SkeletonData *skeletonData, bool ownsSkeletonData) {
initialize(skeletonData); skeleton = Skeleton_create(skeletonData);
this->ownsSkeletonData = ownsSkeletonData;
}
CCSkeleton::CCSkeleton () {
initialize();
}
CCSkeleton::CCSkeleton (SkeletonData *skeletonData, bool ownsSkeletonData) {
initialize();
setSkeletonData(skeletonData, ownsSkeletonData);
} }
CCSkeleton::CCSkeleton (const char* skeletonDataFile, Atlas* atlas, float scale) { CCSkeleton::CCSkeleton (const char* skeletonDataFile, Atlas* atlas, float scale) {
initialize();
SkeletonJson* json = SkeletonJson_create(atlas); SkeletonJson* json = SkeletonJson_create(atlas);
json->scale = scale; json->scale = scale;
SkeletonData* skeletonData = SkeletonJson_readSkeletonDataFile(json, skeletonDataFile); SkeletonData* skeletonData = SkeletonJson_readSkeletonDataFile(json, skeletonDataFile);
CCAssert(skeletonData, json->error ? json->error : "Error reading skeleton data."); CCAssert(skeletonData, json->error ? json->error : "Error reading skeleton data.");
SkeletonJson_dispose(json); SkeletonJson_dispose(json);
initialize(skeletonData); setSkeletonData(skeletonData, true);
ownsSkeletonData = true;
} }
CCSkeleton::CCSkeleton (const char* skeletonDataFile, const char* atlasFile, float scale) { CCSkeleton::CCSkeleton (const char* skeletonDataFile, const char* atlasFile, float scale) {
initialize();
atlas = Atlas_readAtlasFile(atlasFile); atlas = Atlas_readAtlasFile(atlasFile);
CCAssert(atlas, "Error reading atlas file."); CCAssert(atlas, "Error reading atlas file.");
@ -90,8 +101,7 @@ CCSkeleton::CCSkeleton (const char* skeletonDataFile, const char* atlasFile, flo
CCAssert(skeletonData, json->error ? json->error : "Error reading skeleton data file."); CCAssert(skeletonData, json->error ? json->error : "Error reading skeleton data file.");
SkeletonJson_dispose(json); SkeletonJson_dispose(json);
initialize(skeletonData); setSkeletonData(skeletonData, true);
ownsSkeletonData = true;
} }
CCSkeleton::~CCSkeleton () { CCSkeleton::~CCSkeleton () {

View File

@ -41,11 +41,11 @@ public:
bool debugSlots; bool debugSlots;
bool debugBones; bool debugBones;
static CCSkeleton* createWithData (SkeletonData* skeletonData); static CCSkeleton* createWithData (SkeletonData* skeletonData, bool ownsSkeletonData = false);
static CCSkeleton* createWithFile (const char* skeletonDataFile, Atlas* atlas, float scale = 1); static CCSkeleton* createWithFile (const char* skeletonDataFile, Atlas* atlas, float scale = 1);
static CCSkeleton* createWithFile (const char* skeletonDataFile, const char* atlasFile, float scale = 1); static CCSkeleton* createWithFile (const char* skeletonDataFile, const char* atlasFile, float scale = 1);
CCSkeleton (SkeletonData* skeletonData); CCSkeleton (SkeletonData* skeletonData, bool ownsSkeletonData = false);
CCSkeleton (const char* skeletonDataFile, Atlas* atlas, float scale = 1); CCSkeleton (const char* skeletonDataFile, Atlas* atlas, float scale = 1);
CCSkeleton (const char* skeletonDataFile, const char* atlasFile, float scale = 1); CCSkeleton (const char* skeletonDataFile, const char* atlasFile, float scale = 1);
@ -58,10 +58,14 @@ public:
// CCBlendProtocol // CCBlendProtocol
CC_PROPERTY(cocos2d::ccBlendFunc, blendFunc, BlendFunc); CC_PROPERTY(cocos2d::ccBlendFunc, blendFunc, BlendFunc);
protected:
CCSkeleton ();
void CCSkeleton::setSkeletonData (SkeletonData *skeletonData, bool ownsSkeletonData);
private: private:
bool ownsSkeletonData; bool ownsSkeletonData;
Atlas* atlas; Atlas* atlas;
void initialize (SkeletonData *skeletonData); void initialize ();
}; };
} }

View File

@ -58,6 +58,9 @@ public:
void addAnimation (char* name, bool loop, float delay = 0, int stateIndex = 0); void addAnimation (char* name, bool loop, float delay = 0, int stateIndex = 0);
void clearAnimation (int stateIndex = 0); void clearAnimation (int stateIndex = 0);
protected:
CCSkeletonAnimation ();
private: private:
typedef CCSkeleton super; typedef CCSkeleton super;
std::vector<AnimationStateData*> stateDatas; std::vector<AnimationStateData*> stateDatas;