From 0d488eafe633acf47becb2d45e14659fa2f4d6c2 Mon Sep 17 00:00:00 2001 From: NathanSweet Date: Mon, 29 Apr 2013 14:42:01 +0200 Subject: [PATCH] Refactoring to make it easier to load a SkeletonData in a subclass constructor. --- spine-cocos2d-iphone/src/spine/CCSkeleton.h | 4 +-- spine-cocos2d-iphone/src/spine/CCSkeleton.m | 20 +++++------ .../src/spine/CCSkeletonAnimation.h | 4 +-- .../src/spine/CCSkeletonAnimation.m | 8 ++--- spine-cocos2dx/src/spine/CCSkeleton.cpp | 34 ++++++++++++------- spine-cocos2dx/src/spine/CCSkeleton.h | 10 ++++-- .../src/spine/CCSkeletonAnimation.h | 3 ++ 7 files changed, 50 insertions(+), 33 deletions(-) diff --git a/spine-cocos2d-iphone/src/spine/CCSkeleton.h b/spine-cocos2d-iphone/src/spine/CCSkeleton.h index 0dc0a5f6d..be90d222b 100644 --- a/spine-cocos2d-iphone/src/spine/CCSkeleton.h +++ b/spine-cocos2d-iphone/src/spine/CCSkeleton.h @@ -44,11 +44,11 @@ Draws a skeleton. 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 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 atlasFile:(NSString*)atlasFile scale:(float)scale; diff --git a/spine-cocos2d-iphone/src/spine/CCSkeleton.m b/spine-cocos2d-iphone/src/spine/CCSkeleton.m index 52618bdf2..dbda083a8 100644 --- a/spine-cocos2d-iphone/src/spine/CCSkeleton.m +++ b/spine-cocos2d-iphone/src/spine/CCSkeleton.m @@ -27,7 +27,7 @@ #import @interface CCSkeleton (Private) -- (void) initialize:(SkeletonData*)skeletonData; +- (void) initialize:(SkeletonData*)skeletonData ownsSkeletonData:(bool)ownsSkeletonData; @end @implementation CCSkeleton @@ -37,8 +37,8 @@ @synthesize debugSlots = _debugSlots; @synthesize debugBones = _debugBones; -+ (id) skeletonWithData:(SkeletonData*)skeletonData { - return [[[CCSkeleton alloc] initWithData:skeletonData] autorelease]; ++ (id) skeletonWithData:(SkeletonData*)skeletonData ownsSkeletonData:(bool)ownsSkeletonData { + return [[[CCSkeleton alloc] initWithData:skeletonData ownsSkeletonData:ownsSkeletonData] autorelease]; } + (id) skeletonWithFile:(NSString*)skeletonDataFile atlas:(Atlas*)atlas scale:(float)scale { @@ -49,7 +49,9 @@ 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); _blendFunc.src = GL_ONE; @@ -61,13 +63,13 @@ [self scheduleUpdate]; } -- (id) initWithData:(SkeletonData*)skeletonData { +- (id) initWithData:(SkeletonData*)skeletonData ownsSkeletonData:(bool)ownsSkeletonData { NSAssert(skeletonData, @"skeletonData cannot be null."); self = [super init]; if (!self) return nil; - [self initialize:skeletonData]; + [self initialize:skeletonData ownsSkeletonData:ownsSkeletonData]; return self; } @@ -83,8 +85,7 @@ SkeletonJson_dispose(json); if (!skeletonData) return 0; - [self initialize:skeletonData]; - _ownsSkeletonData = YES; + [self initialize:skeletonData ownsSkeletonData:YES]; return self; } @@ -104,8 +105,7 @@ SkeletonJson_dispose(json); if (!skeletonData) return 0; - [self initialize:skeletonData]; - _ownsSkeletonData = YES; + [self initialize:skeletonData ownsSkeletonData:YES]; return self; } diff --git a/spine-cocos2d-iphone/src/spine/CCSkeletonAnimation.h b/spine-cocos2d-iphone/src/spine/CCSkeletonAnimation.h index 96aa57c65..9fa4766a0 100644 --- a/spine-cocos2d-iphone/src/spine/CCSkeletonAnimation.h +++ b/spine-cocos2d-iphone/src/spine/CCSkeletonAnimation.h @@ -40,11 +40,11 @@ Draws an animated skeleton, providing a simple API for applying one or more anim 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 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 atlasFile:(NSString*)atlasFile scale:(float)scale; diff --git a/spine-cocos2d-iphone/src/spine/CCSkeletonAnimation.m b/spine-cocos2d-iphone/src/spine/CCSkeletonAnimation.m index c7d19d6a3..46e1c5afa 100644 --- a/spine-cocos2d-iphone/src/spine/CCSkeletonAnimation.m +++ b/spine-cocos2d-iphone/src/spine/CCSkeletonAnimation.m @@ -34,8 +34,8 @@ @synthesize states = _states; -+ (id) skeletonWithData:(SkeletonData*)skeletonData { - return [[[CCSkeletonAnimation alloc] initWithData:skeletonData] autorelease]; ++ (id) skeletonWithData:(SkeletonData*)skeletonData ownsSkeletonData:(bool)ownsSkeletonData { + return [[[CCSkeletonAnimation alloc] initWithData:skeletonData ownsSkeletonData:ownsSkeletonData] autorelease]; } + (id) skeletonWithFile:(NSString*)skeletonDataFile atlas:(Atlas*)atlas scale:(float)scale { @@ -52,8 +52,8 @@ [self addAnimationState]; } -- (id) initWithData:(SkeletonData*)skeletonData { - self = [super initWithData:skeletonData]; +- (id) initWithData:(SkeletonData*)skeletonData ownsSkeletonData:(bool)ownsSkeletonData { + self = [super initWithData:skeletonData ownsSkeletonData:ownsSkeletonData]; if (!self) return nil; [self initialize]; diff --git a/spine-cocos2dx/src/spine/CCSkeleton.cpp b/spine-cocos2dx/src/spine/CCSkeleton.cpp index fb1a56042..2d3115fcf 100644 --- a/spine-cocos2dx/src/spine/CCSkeleton.cpp +++ b/spine-cocos2dx/src/spine/CCSkeleton.cpp @@ -32,8 +32,8 @@ using std::max; namespace spine { -static CCSkeleton* createWithData (SkeletonData* skeletonData) { - CCSkeleton* node = new CCSkeleton(skeletonData); +static CCSkeleton* createWithData (SkeletonData* skeletonData, bool ownsSkeletonData) { + CCSkeleton* node = new CCSkeleton(skeletonData, ownsSkeletonData); node->autorelease(); return node; } @@ -50,14 +50,11 @@ static CCSkeleton* createWithFile (const char* skeletonDataFile, const char* atl return node; } -void CCSkeleton::initialize (SkeletonData *skeletonData) { - ownsSkeletonData = false; +void CCSkeleton::initialize () { atlas = 0; debugSlots = false; debugBones = false; - skeleton = Skeleton_create(skeletonData); - blendFunc.src = GL_ONE; blendFunc.dst = GL_ONE_MINUS_SRC_ALPHA; @@ -65,22 +62,36 @@ void CCSkeleton::initialize (SkeletonData *skeletonData) { scheduleUpdate(); } -CCSkeleton::CCSkeleton (SkeletonData *skeletonData) { - initialize(skeletonData); +void CCSkeleton::setSkeletonData (SkeletonData *skeletonData, bool ownsSkeletonData) { + 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) { + initialize(); + SkeletonJson* json = SkeletonJson_create(atlas); json->scale = scale; SkeletonData* skeletonData = SkeletonJson_readSkeletonDataFile(json, skeletonDataFile); CCAssert(skeletonData, json->error ? json->error : "Error reading skeleton data."); SkeletonJson_dispose(json); - initialize(skeletonData); - ownsSkeletonData = true; + setSkeletonData(skeletonData, true); } CCSkeleton::CCSkeleton (const char* skeletonDataFile, const char* atlasFile, float scale) { + initialize(); + atlas = Atlas_readAtlasFile(atlasFile); 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."); SkeletonJson_dispose(json); - initialize(skeletonData); - ownsSkeletonData = true; + setSkeletonData(skeletonData, true); } CCSkeleton::~CCSkeleton () { diff --git a/spine-cocos2dx/src/spine/CCSkeleton.h b/spine-cocos2dx/src/spine/CCSkeleton.h index c5373c33f..275c2fc79 100644 --- a/spine-cocos2dx/src/spine/CCSkeleton.h +++ b/spine-cocos2dx/src/spine/CCSkeleton.h @@ -41,11 +41,11 @@ public: bool debugSlots; 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, 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, const char* atlasFile, float scale = 1); @@ -58,10 +58,14 @@ public: // CCBlendProtocol CC_PROPERTY(cocos2d::ccBlendFunc, blendFunc, BlendFunc); +protected: + CCSkeleton (); + void CCSkeleton::setSkeletonData (SkeletonData *skeletonData, bool ownsSkeletonData); + private: bool ownsSkeletonData; Atlas* atlas; - void initialize (SkeletonData *skeletonData); + void initialize (); }; } diff --git a/spine-cocos2dx/src/spine/CCSkeletonAnimation.h b/spine-cocos2dx/src/spine/CCSkeletonAnimation.h index fd468acac..db88e8555 100644 --- a/spine-cocos2dx/src/spine/CCSkeletonAnimation.h +++ b/spine-cocos2dx/src/spine/CCSkeletonAnimation.h @@ -58,6 +58,9 @@ public: void addAnimation (char* name, bool loop, float delay = 0, int stateIndex = 0); void clearAnimation (int stateIndex = 0); +protected: + CCSkeletonAnimation (); + private: typedef CCSkeleton super; std::vector stateDatas;