此类工具网上搜了一些,都不太好用,于是决定自己实现一个。

思路很直接:把大图集拆开为小图片。由于只是工具性质,效率不是关键,直接用 Cocos2dx 随手写了一个。基本思想是读取图集,然后把每个 SpriteFrame 输出为独立文件。

#include "HelloWorldScene.h"
                #include "cocostudio/CocoStudio.h"
                #include "ui/CocosGUI.h"
                #include <iostream>
                #include <iostream>
                #include <vector>
                #include <string>
                #include <stdio.h>
                #include <fstream>
                #include <stdlib.h>
                USING_NS_CC;
                using namespace  std;
                using namespace cocostudio::timeline;
                
                Scene* HelloWorld::createScene()
                {
                	// 'scene' is an autorelease object
                	auto scene = Scene::create();
                
                	// 'layer' is an autorelease object
                	auto layer = HelloWorld::create();
                
                	// add layer as a child to scene
                	scene->addChild(layer);
                
                	// return the scene
                	return scene;
                }
                
                // on "init" you need to initialize your instance
                bool HelloWorld::init()
                {
                	// 1. super init first
                	if (!Layer::init())
                	{
                		return false;
                	}
                	vector<string> files;
                
                	const char *TEM_WORK_FILE_NAME = "filelist.txt";
                	string path = "res";
                
                	string cmd_txt = "cmd.exe /c  DIR  " + path + "  /S /B   >   ";
                	cmd_txt += TEM_WORK_FILE_NAME;
                
                	system(cmd_txt.c_str());
                
                	fstream f;
                
                	f.open(TEM_WORK_FILE_NAME, ios::in);
                
                	vector<string> _queue;
                
                	string buf;
                
                	while (getline(f, buf))
                	{
                		//	cout << buf << "       ... " << endl;
                		//	cout<<buffer;
                		if (buf.find(".plist") == string::npos)
                		{
                			continue;
                		}
                
                		string file_ = buf;
                		string file_path = file_.substr(strlen("Resources\\res") + file_.find("Resources\\res") + 1, file_.size() - strlen("Resources\\res") - file_.find("Resources/res"));
                
                
                		while (file_path.find("\\") != string::npos)
                		{
                			//	file_path.replace('\\', '/');
                			file_path[file_path.find("\\")] = '/';
                		}
                		log(file_path.c_str());
                
                		files.push_back(file_path);
                
                	}
                	//	this->WriteToFile();
                	f.close();
                
                	//FileUtils::getInstance()->removeFile(TEM_WORK_FILE_NAME);
                
                	//system("pause");
                	//return 0;
                
                	//开始转换
                	//	vector<string> files;
                	//	//files.push_back("game_1_1.plist");
                	//files.push_back("game_1_2.plist");
                	//files.push_back("game_1_3.plist");
                	/*files.clear();
                	files.push_back("ui/awake.plist");
                	files.push_back("ui/yingxiongfuben_1.plist");
                	files.push_back("ui/yuanbaobiaoche.plist");
                	files.push_back("ui/xingkong2.plist");
                	files.push_back("ui/synthesis_equipment_4.plist");
                	files.push_back("ui/updateRecommend3.plist");
                	files.push_back("ui/shenmishangcheng.plist");
                	*/
                	for (auto & name : files)
                	{
                		string dir = name.substr(0, name.size() - strlen(".plist"));
                		//log((FileUtils::getInstance()->getWritablePath() + "/" + dir).c_str());
                		FileUtils::getInstance()->removeDirectory(FileUtils::getInstance()->getWritablePath() + "/" + dir);
                		FileUtils::getInstance()->createDirectory(FileUtils::getInstance()->getWritablePath() + "/" + dir);
                		SpriteFrameCache::getInstance()->addSpriteFramesWithFile(name);
                		auto mapp = SpriteFrameCache::getInstance()->_spriteFrames;
                
                		for (auto & cp : mapp)
                		{
                			auto sp = Sprite::createWithSpriteFrameName(cp.first.c_str());// Sprite::createWithSpriteFrameName("accomplishTitle.png");
                			sp->setPosition(sp->getTextureRect().size.width / 2,   sp->getTextureRect().size.height / 2 );
                			this->addChild(sp);
                			if (sp->getTextureRect().size.width <= 0 || sp->getTextureRect().size.height <= 0)
                			{//invalid sprite
                				continue;;
                			}
                
                			log(("	out:" + dir + "/" + cp.first).c_str());
                
                			auto re = RenderTexture::create(sp->getTextureRect().size.width, sp->getTextureRect().size.height);
                
                			re->begin();
                			sp->visit(Director::getInstance()->getRenderer(), Director::getInstance()->getMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_TEXTURE), 0);
                
                			re->end();
                			string path = dir + "/" + cp.first;
                
                			re->saveToFile(path);
                		}
                		SpriteFrameCache::getInstance()->removeSpriteFramesFromFile(name);
                		TextureCache::getInstance()->removeAllTextures();
                		SpriteFrameCache::getInstance()->removeUnusedSpriteFrames();
                	}
                	//Director::getInstance()->end();
                	return true;
                }