Static method to create autoreleased CCSkeleton.

Example shows memory management.
Fixed bug in memory management, texture not retained. :)
This commit is contained in:
NathanSweet 2013-03-25 23:51:33 +01:00
parent ec8509b511
commit 6342ed949e
5 changed files with 26 additions and 7 deletions

View File

@ -1,7 +1,6 @@
#include "ExampleScene.h" #include "ExampleScene.h"
#include <iostream> #include <iostream>
#include <fstream> #include <fstream>
#include <spine-cocos2dx/spine.h>
using namespace cocos2d; using namespace cocos2d;
using namespace spine; using namespace spine;
@ -9,21 +8,20 @@ using namespace std;
CCScene* ExampleScene::scene () { CCScene* ExampleScene::scene () {
CCScene *scene = CCScene::create(); CCScene *scene = CCScene::create();
ExampleScene *layer = ExampleScene::create(); scene->addChild(ExampleScene::create());
scene->addChild(layer);
return scene; return scene;
} }
bool ExampleScene::init () { bool ExampleScene::init () {
if (!CCLayer::init()) return false; if (!CCLayer::init()) return false;
Atlas *atlas = new Atlas("spineboy.txt"); atlas = new Atlas("spineboy.txt");
SkeletonJson json(atlas); SkeletonJson json(atlas);
json.scale = 0.5; json.scale = 0.5;
SkeletonData *skeletonData = json.readSkeletonData("spineboy-skeleton.json"); skeletonData = json.readSkeletonData("spineboy-skeleton.json");
Animation *animation = json.readAnimation("spineboy-walk.json", skeletonData); animation = json.readAnimation("spineboy-walk.json", skeletonData);
CCSkeleton* skeletonNode = new CCSkeleton(skeletonData); CCSkeleton* skeletonNode = CCSkeleton::create(skeletonData);
skeletonNode->state->setAnimation(animation, true); skeletonNode->state->setAnimation(animation, true);
skeletonNode->debug = true; skeletonNode->debug = true;
@ -33,3 +31,9 @@ bool ExampleScene::init () {
return true; return true;
} }
ExampleScene::~ExampleScene () {
delete atlas;
delete skeletonData;
delete animation;
}

View File

@ -2,10 +2,17 @@
#define _EXAMPLESCENE_H_ #define _EXAMPLESCENE_H_
#include "cocos2d.h" #include "cocos2d.h"
#include <spine-cocos2dx/spine.h>
class ExampleScene: public cocos2d::CCLayer { class ExampleScene: public cocos2d::CCLayer {
private:
spine::Atlas *atlas;
spine::SkeletonData *skeletonData;
spine::Animation *animation;
public: public:
static cocos2d::CCScene* scene (); static cocos2d::CCScene* scene ();
~ExampleScene ();
virtual bool init (); virtual bool init ();

View File

@ -41,6 +41,7 @@ public:
AnimationState *state; AnimationState *state;
bool debug; bool debug;
static CCSkeleton* CCSkeleton::create (SkeletonData* skeletonData);
CCSkeleton (SkeletonData *skeletonData, AnimationStateData *stateData = 0); CCSkeleton (SkeletonData *skeletonData, AnimationStateData *stateData = 0);
virtual ~CCSkeleton (); virtual ~CCSkeleton ();

View File

@ -56,6 +56,7 @@ Atlas::Atlas (const char *begin, const char *end) {
BaseAtlasPage* Atlas::newAtlasPage (const std::string &name) { BaseAtlasPage* Atlas::newAtlasPage (const std::string &name) {
AtlasPage *page = new AtlasPage(); AtlasPage *page = new AtlasPage();
page->texture = CCTextureCache::sharedTextureCache()->addImage(name.c_str()); page->texture = CCTextureCache::sharedTextureCache()->addImage(name.c_str());
page->texture->retain();
page->atlas = CCTextureAtlas::createWithTexture(page->texture, 4); page->atlas = CCTextureAtlas::createWithTexture(page->texture, 4);
page->atlas->retain(); page->atlas->retain();
return page; return page;

View File

@ -37,6 +37,12 @@
using namespace spine; using namespace spine;
USING_NS_CC; USING_NS_CC;
CCSkeleton* CCSkeleton::create (SkeletonData* skeletonData) {
CCSkeleton* skeleton = new CCSkeleton(skeletonData);
skeleton->autorelease();
return skeleton;
}
CCSkeleton::CCSkeleton (SkeletonData *skeletonData, AnimationStateData *stateData) : CCSkeleton::CCSkeleton (SkeletonData *skeletonData, AnimationStateData *stateData) :
debug(false) { debug(false) {
if (!skeletonData) throw std::invalid_argument("skeletonData cannot be null."); if (!skeletonData) throw std::invalid_argument("skeletonData cannot be null.");