调用:
POINT *p;
p->x = 350;
p->y = 0;
SpriterXNode * spxn=newSpriterXNode();//注:这里一定要new spriterXNode() 才能对spriterXNode的全局对象分配存储空间 不然spriterXNode中的全局对象在赋值时会报错
Thread1:EXC_BAD_ACCESS
spxn->spriterNodeWithFiles("monster.SCML","monster.png", 0.5,*p);
逻辑操作:
void SpriterXNode::spriterNodeWithFiles(std::string scmFile,std::string spriteSheet, double sdScale, POINT offset)
{
this->initNodeWithFiles(scmFile, spriteSheet, sdScale, offset);
}
void SpriterXNode::spriterNodeWithFiles(std::string scmFile,std::string spriteSheet)
{
POINT p;
p.x =0;
p.y =0;
this->spriterNodeWithFiles(scmFile, spriteSheet,0.5, p);
}
//读取所有的node以及node对应的属性
void SpriterXNode::initNodeWithFiles(std::string scmFile,std::string spriteSheet, double sdScale, POINT offset)
{
xmlDocPtr doc;
xmlNodePtr curNode;
xmlKeepBlanksDefault (0);
// CCLOG(@"");
// cocos2d::CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(scmFile.c_str());
// f->fullPathFromRelativePath(scmFile.c_str());
doc = xmlReadFile(cocos2d::CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(scmFile.c_str()),"UTF-8",XML_PARSE_RECOVER);
if(NULL == doc){
fprintf(stderr,"Document not parsed successflly");
return ;
}
curNode = xmlDocGetRootElement(doc);
// _configRoot->name = *curNode->name;
xmlAttrPtr mAttr = curNode->properties;
std::map<xmlChar*,xmlChar*> attrimap;
while (mAttr!=NULL) {
xmlChar * attr = xmlGetProp(curNode,BAD_CAST(mAttr->name));
// attrimap->insert(std::map<xmlChar, xmlChar*>::value_type(*mAttr->name,attr));
// attrimap.insert(std::pair<xmlChar*,xmlChar*>(BAD_CAST(mAttr->name),attr));
std::cout<<mAttr->name<<"-----"<<attr<<endl;
xmlFreeProp(mAttr);
mAttr = mAttr->next;
}
// _configRoot->properties = attrimap;
// std::list<SpriterXConfigNode *> children = *newstd::list<SpriterXConfigNode *>();
// this->_configRoot =new SpriterXConfigNode();
// _configRoot->configNode(*curNode->name,NULL, children, attrimap, NULL);
// SpriterXConfigNode * root = new SpriterXConfigNode(*curNode->name, NULL, children, attrimap, NULL);
std::map<xmlChar*,xmlChar*>::iterator it;
for (it =_attrimap.begin(); it!=_attrimap.end(); it++) {
std::cout<<"key:"<<it->first<<"---value:"<<it->second<<endl;
}
if(NULL == curNode){
fprintf(stderr,"empty document");
xmlFreeDoc(doc);
return ;
}
if(xmlStrcmp(curNode->name,BAD_CAST"spriter_data")){
fprintf(stderr,"document of the wrong type,root node != spriter_data");
xmlFreeDoc(doc);
return ;
}
// this->saveAllNodeAndAttribute(doc,curNode);
}
void SpriterXNode::saveAllNodeAndAttribute(xmlDocPtr doc,xmlNodePtr curNode){
traversingNode(curNode);
}
//递归遍历xml中的node
void SpriterXNode::traversingNode(xmlNodePtr curNode){
xmlNodePtr children;
children = curNode->xmlChildrenNode;
while (children!=NULL) {
std::cout<<children->name<<endl;
xmlAttrPtr mAttr = curNode->properties;
// std::map<xmlChar,xmlAttrPtr> *attrimap;
while (mAttr!=NULL) {
// attrimap->insert(std::map<xmlChar, xmlAttrPtr>::value_type(*mAttr->name,mAttr));
xmlChar * attr = xmlGetProp(curNode, BAD_CAST(mAttr->name));
std::cout<<mAttr->name<<"-----"<<attr<<endl;
mAttr = mAttr->next;
}
traversingNode(children);
children = children->next;
}
}