AnimatePacker 生成的动作的解析代码
- .h
#ifndef ANIMATEPACKER_H
#define ANIMATEPACKER_H
#include “cocos2d.h”
USING_NS_CC;
typedef std::map<std::string, CCAnimate > ANIMATEMAP;
class cAnimatePacker
{
public:
static cAnimatePacker Create();
cAnimatePacker();
~cAnimatePacker();
bool init();
void loadAnimate(const char* pathname,const char* animatename);
CCAnimate * getAnimate(const char * animatename);
void AddAnimateObj(CCAnimate * panimate, std::string animatename);
protected:
ANIMATEMAP m_Animatemap;
};
- .cpp
#include “cAnimatePacker.h”
cAnimatePacker::cAnimatePacker()
{
}
cAnimatePacker::~cAnimatePacker()
{
}
cAnimatePacker* cAnimatePacker::Create()
{
cAnimatePacker animate = new cAnimatePacker();
if(animate && animate->init())
return animate;
return NULL;
}
bool cAnimatePacker::init()
{
return true;
}
void cAnimatePacker::loadAnimate(const char pathname,const char* animatename)
{
tinyxml2::XMLDocument doc;
unsigned char * pBuffer = NULL;
unsigned long buffersize = 0;
std::string xmlname = pathname;
xmlname.append("/");
xmlname.append(animatename);
pBuffer = CCFileUtils::sharedFileUtils()->getFileData(xmlname.c_str(),“r”,&buffersize);
if(pBuffer)
{
doc.Parse((const char )pBuffer,buffersize);
tinyxml2::XMLElement * sence = doc.RootElement();
tinyxml2::XMLElement * surplists = sence->FirstChildElement(“plists”);
tinyxml2::XMLElement * surplistname = surplists->FirstChildElement(“plist”);
while(surplistname)
{
std::string plistname = surplistname->GetText();
char fileplistname= {0};
sprintf(fileplistname,"%s/%s",pathname,plistname.c_str());
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile(fileplistname);
surplistname = surplistname->NextSiblingElement();
}
tinyxml2::XMLElement * suranimations = sence->FirstChildElement(“animations”);
tinyxml2::XMLElement * suranimation = suranimations->FirstChildElement(“animation”);
while(suranimation)
{
std::string animationname = suranimation->FirstChildElement(“name”)->GetText();
float delaytime = atof( suranimation->FirstChildElement(“delay”)->GetText());
std::string flipx = suranimation->FirstChildElement(“flipX”)->GetText();
std::string flipy = suranimation->FirstChildElement(“flipY”)->GetText();
tinyxml2::XMLElement * spriteFramexml = suranimation->FirstChildElement(“spriteFrame”);
CCArray animatFrames = CCArray::create();
while(spriteFramexml)
{
std::string spritename = spriteFramexml->GetText();
CCSpriteFrame *spriteFrame = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(spritename.c_str());
animatFrames->addObject(spriteFrame);
spriteFramexml = spriteFramexml->NextSiblingElement();
}
CCAnimation animation;
animation = CCAnimation::createWithSpriteFrames(animatFrames,delaytime);
CCAnimate panimate = CCAnimate::create(animation);
if(panimate != NULL)
{
AddAnimateObj(panimate,animationname);
}
suranimation = suranimation->NextSiblingElement();
}
}
}
CCAnimate * cAnimatePacker::getAnimate(const char * animatename)
{
CCAnimate * resp = NULL;
std::string strname = animatename;
if(m_Animatemap.find(strname) != m_Animatemap.end())
{
resp = m_Animatemap;
}
return resp;
}
void cAnimatePacker::AddAnimateObj(CCAnimate * panimate, std::string animatename)
{
if(panimate == NULL)
return;
if(m_Animatemap.find(animatename) != m_Animatemap.end())
{
return;
}
m_Animatemap = panimate;
}