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;
}
+ (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;

View File

@ -27,7 +27,7 @@
#import <spine/spine-cocos2d-iphone.h>
@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;
}

View File

@ -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;

View File

@ -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];

View File

@ -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 () {

View File

@ -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 ();
};
}

View File

@ -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<AnimationStateData*> stateDatas;