tinyxm2变了很多,文档又少,坑爹
#include "template.h" #define cp(str) !strcmp(str, argv[i]) void make(AnimationInfo & info) { // insert code here... int error = doc.LoadFile( "Animation.ccb"); if(error){ return; } tinyxml2::XMLElement * root = doc.RootElement(); tinyxml2::XMLNode * dict = root->FirstChildElement("dict"); tinyxml2::XMLElement * element = dict->FirstChildElement(); //root while(element){ std::string nodeGraphStr = "nodeGraph"; std::string seqStr = "sequences"; if(element->GetText() && nodeGraphStr == element->GetText()){ addAnimation(element, &info); }else if(element->GetText() && seqStr == element->GetText()){ changeDuration(element->NextSiblingElement(), info.duration); } element = element->NextSiblingElement(); } // doc.SaveFile(info.output.c_str()); } int main(int argc, const char * argv[]) { if(argc < 13){ printf("13 arg needed! %d specified!\n", argc); return -1; } // AnimationInfo info; bool flag[6]; for(int i=0; i<6; ++i)flag[i]=false; for(int i=1; i<argc; i+=2){ if(cp("-o")){ assert(!flag[0]); info.output = argv[i+1]; assert(info.output != "Animation.ccb"); flag[0] = true; }else if(cp("-d")){ assert(!flag[1]); info.duration = atof(argv[i+1]); flag[1] = true; }else if(cp("-i")){ assert(!flag[2]); info.interval = atof(argv[i+1]); flag[2] = true; }else if(cp("-plist")){ assert(!flag[3]); info.plistfile = argv[i+1]; flag[3] = true; }else if(cp("-prefix")){ assert(!flag[4]); info.filePrefix = argv[i+1]; flag[4] = true; }else if(cp("-frame")){ assert(!flag[5]); info.frameCount = atoi(argv[i+1]); flag[5] = true; }else { printf("error arg \"%s\"! \n", argv[i]); } } info.duration = info.interval*info.frameCount; make(info); return 0; }
#ifndef AnimationMake_template_h #define AnimationMake_template_h #include <iostream> #include <string> #include <vector> #include "tinyxml2.h" struct AnimationInfo { float interval; //间隔 std::string pngfile; std::string plistfile; int frameCount; float duration; std::string filePrefix;//xy_walk std::string output; }; tinyxml2::XMLDocument doc; void handleFrameValue(tinyxml2::XMLElement * arrayDictNode, int id) { printf("%s\n", arrayDictNode->Name()); tinyxml2::XMLElement * childNode = arrayDictNode->FirstChildElement(); while(childNode){ printf("***** %s\n", childNode->GetText()); std::string time = "time"; childNode = childNode->NextSiblingElement(); } // } tinyxml2::XMLElement * addFirstKey(tinyxml2::XMLElement * parent, const char * keyName, const char * keyValueName, const char * value) { tinyxml2::XMLElement * keyNode = doc.NewElement("key"); keyNode->InsertFirstChild(doc.NewText(keyName)); parent->InsertFirstChild(keyNode); tinyxml2::XMLElement * nameValue = doc.NewElement(keyValueName); nameValue->SetName(keyValueName); if(value){ nameValue->InsertFirstChild(doc.NewText(value)); } parent->InsertAfterChild(keyNode, nameValue); return nameValue; } tinyxml2::XMLElement * addKey(tinyxml2::XMLElement * parent, tinyxml2::XMLElement * node, const char * keyName, const char * keyValueName, const char * value) { tinyxml2::XMLElement * keyNode = doc.NewElement("key"); keyNode->InsertFirstChild(doc.NewText(keyName)); parent->InsertAfterChild(node, keyNode); tinyxml2::XMLElement * nameValue = doc.NewElement(keyValueName); nameValue->SetName(keyValueName); if(value){ nameValue->InsertFirstChild(doc.NewText(value)); } parent->InsertAfterChild(keyNode, nameValue); return nameValue; } tinyxml2::XMLElement * addFirstValue(tinyxml2::XMLElement * parent, const char * valueName, const char * value) { tinyxml2::XMLElement * nameValue = doc.NewElement(valueName); nameValue->SetValue(valueName); if(value){ nameValue->InsertFirstChild(doc.NewText(value)); } parent->InsertFirstChild(nameValue); return nameValue; } tinyxml2::XMLElement * addValue(tinyxml2::XMLElement * parent, tinyxml2::XMLElement * nodeBefore, const char * valueName, const char * value) { tinyxml2::XMLElement * nameValue = doc.NewElement(valueName); nameValue->SetValue(valueName); if(value){ nameValue->InsertFirstChild(doc.NewText(value)); } parent->InsertAfterChild(nodeBefore, nameValue); return nameValue; } void createFrame(tinyxml2::XMLElement * arrayNode, AnimationInfo* info, int id) { tinyxml2::XMLElement * dict = doc.NewElement("dict"); arrayNode->InsertFirstChild(dict); //easing tinyxml2::XMLElement * easing = addFirstKey(dict, "easing", "dict", 0); addFirstKey(easing, "type", "integer", "0"); //name tinyxml2::XMLElement * name = addKey(dict, easing, "name", "dict", 0); addFirstKey(name, "type", "integer", "0"); //time char stime[10]; sprintf(stime, "%.2f", (id-1)*info->interval); tinyxml2::XMLElement * time = addKey(dict, name, "time", "real", stime); //type tinyxml2::XMLElement * type = addKey(dict, time, "type", "integer", "7"); //value tinyxml2::XMLElement * value = addKey(dict, type, "value", "array", 0); char spng[100]; sprintf(spng, "%s%d.png", info->filePrefix.c_str(), id); tinyxml2::XMLElement * png = addFirstValue(value, "string", spng); tinyxml2::XMLElement * plist = addValue(value, png, "string", info->plistfile.c_str()); } void addAnimation(tinyxml2::XMLNode * nodeGraph, AnimationInfo * info) { tinyxml2::XMLElement * node = nodeGraph->NextSiblingElement()->FirstChildElement("key")->NextSiblingElement(); tinyxml2::XMLElement * zeroNode = node->FirstChildElement("key"); tinyxml2::XMLElement * displayName = zeroNode->NextSiblingElement()->FirstChildElement(); tinyxml2::XMLElement * keyframes = displayName->NextSiblingElement()->FirstChildElement(); tinyxml2::XMLElement * arrayNode = keyframes->NextSiblingElement(); arrayNode->DeleteChildren(); for(int i=info->frameCount; i>=1; --i){ createFrame(arrayNode, info, i); } } void changeDuration(tinyxml2::XMLNode * seq, float duration) { tinyxml2::XMLElement * dict = seq->FirstChildElement("dict"); tinyxml2::XMLElement * node = dict->FirstChildElement("key"); while(node){ if(node->GetText() == std::string("length")){ tinyxml2::XMLElement * length = node->NextSiblingElement(); length->DeleteChildren(); char s[100]; sprintf(s, "%.2f", duration); length->InsertFirstChild(doc.NewText(s)); } node = node->NextSiblingElement("key"); } } #endif
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>centeredOrigin</key> <false/> <key>currentResolution</key> <integer>0</integer> <key>currentSequenceId</key> <integer>0</integer> <key>fileType</key> <string>CocosBuilder</string> <key>fileVersion</key> <integer>4</integer> <key>guides</key> <array/> <key>nodeGraph</key> <dict> <key>animatedProperties</key> <dict> <key>0</key> <dict> <key>displayFrame</key> <dict> <key>keyframes</key> <array> <dict> <key>easing</key> <dict> <key>type</key> <integer>0</integer> </dict> <key>name</key> <string>displayFrame</string> <key>time</key> <real>0.0</real> <key>type</key> <integer>7</integer> <key>value</key> <array> <string>TaskUI/bg_01.png</string> <string>Pic/TaskUI.plist</string> </array> </dict> <dict> <key>easing</key> <dict> <key>type</key> <integer>0</integer> </dict> <key>name</key> <string>displayFrame</string> <key>time</key> <real>0.5</real> <key>type</key> <integer>7</integer> <key>value</key> <array> <string>TaskUI/bg_02.png</string> <string>Pic/TaskUI.plist</string> </array> </dict> <dict> <key>easing</key> <dict> <key>type</key> <integer>0</integer> </dict> <key>name</key> <string>displayFrame</string> <key>time</key> <real>1</real> <key>type</key> <integer>7</integer> <key>value</key> <array> <string>TaskUI/bg_03.png</string> <string>Pic/TaskUI.plist</string> </array> </dict> <dict> <key>easing</key> <dict> <key>type</key> <integer>0</integer> </dict> <key>name</key> <string>displayFrame</string> <key>time</key> <real>1.5</real> <key>type</key> <integer>7</integer> <key>value</key> <array> <string>TaskUI/bg_04.png</string> <string>Pic/TaskUI.plist</string> </array> </dict> </array> <key>name</key> <string>displayFrame</string> <key>type</key> <integer>7</integer> </dict> </dict> </dict> <key>baseClass</key> <string>CCSprite</string> <key>children</key> <array/> <key>customClass</key> <string></string> <key>displayName</key> <string>CCSprite</string> <key>memberVarAssignmentName</key> <string></string> <key>memberVarAssignmentType</key> <integer>0</integer> <key>properties</key> <array> <dict> <key>name</key> <string>anchorPoint</string> <key>type</key> <string>Point</string> <key>value</key> <array> <real>0.5</real> <real>0.5</real> </array> </dict> <dict> <key>name</key> <string>scale</string> <key>type</key> <string>ScaleLock</string> <key>value</key> <array> <real>1</real> <real>1</real> <false/> <integer>0</integer> </array> </dict> <dict> <key>name</key> <string>ignoreAnchorPointForPosition</string> <key>type</key> <string>Check</string> <key>value</key> <false/> </dict> <dict> <key>baseValue</key> <array> <string>TaskUI/bg_01.png</string> <string>Pic/TaskUI.plist</string> </array> <key>name</key> <string>displayFrame</string> <key>type</key> <string>SpriteFrame</string> <key>value</key> <array> <string>Pic/TaskUI.plist</string> <string>TaskUI/bg_04.png</string> </array> </dict> </array> <key>seqExpanded</key> <true/> </dict> <key>notes</key> <array/> <key>resolutions</key> <array> <dict> <key>centeredOrigin</key> <false/> <key>ext</key> <string>ipad hd</string> <key>height</key> <integer>0</integer> <key>name</key> <string>iPad</string> <key>scale</key> <real>2</real> <key>width</key> <integer>0</integer> </dict> </array> <key>sequences</key> <array> <dict> <key>autoPlay</key> <true/> <key>chainedSequenceId</key> <integer>0</integer> <key>length</key> <real>2</real> <key>name</key> <string>Default Timeline</string> <key>offset</key> <real>0.0</real> <key>position</key> <real>2</real> <key>resolution</key> <real>30</real> <key>scale</key> <real>128</real> <key>sequenceId</key> <integer>0</integer> </dict> </array> <key>stageBorder</key> <integer>3</integer> </dict> </plist>