サーバー上においてある画像をダウンロードして使う(TextureAtlas)

サーバー上においてある画像をダウンロードして、それをそのままSpriteに使う例はそれなりにみかけますが、
TextureAtlas(pngとplist)をダウンロードしてSpriteFrameCacheを使う例は見かけなかったので、自分なりに試してみました。

今回使用したバージョン

  • Cocos2d-x 3.2

TextureAtlasを使う場合はpngとplistセットでダウンロードする必要があるので、あらかじめzipファイルに圧縮してサーバーに置いておくようにします。
この方法であれば、一緒に必要なファイルをまとめてダウンロードできるので便利です。

zipファイルの扱いについては、こちらを参考にさせていただきました。

http://qiita.com/kuuki_yomenaio/items/b93b236ed5563adf9c39

// zipファイルから取り出すファイル名一覧
std::string dataNameList[] = {"textureatlas.png","textureatlas.plist"};

...

void HttpAccessManager::downloadFile()
{
	std::string fileUrl = "http://www.example.com/data.zip";
	
	auto request = new HttpRequest();
	request->setUrl(fileUrl.c_str());
	request->setRequestType(HttpRequest::Type::GET);
	request->setResponseCallback([&](HttpClient *sender,HttpResponse * response)
	{
		if(response->isSucceed())
		{
			std::string filePath = FileUtils::getInstance()->getWritablePath() + "data.zip";
			
			std::vector<char>* buffer = response->getResponseData();
			// zipファイルを保存
			FILE* fp = fopen(filePath.c_str() , "wb");
			fwrite(buffer->data() , 1, buffer->size() , fp);
			fclose(fp);
			
			// zipファイルからそれぞれのファイルを取り出し
			for(std::string dataFileName : dataNameList)
			{
				unsigned long size = 0;
				unsigned char* buf = FileUtils::getInstance()->getFileDataFromZip(filePath.c_str(),
																				  dataFileName,
																				  (ssize_t*)&size);
				std::string writeFilePath = FileUtils::getInstance()->getWritablePath() + dataFileName;
				
				FILE* dataFile = fopen(writeFilePath.c_str(),"wb");
				fwrite(buf,1,size,dataFile);
				fclose(dataFile);
			}
			
			// SpriteFrameCache
			SpriteFrameCache::getInstance()->addSpriteFramesWithFile(FileUtils::getInstance()->getWritablePath() +
																	 "textureatlas.plist");
		}
		else
		{
			// 通信失敗した時の処理
			CCLOG("LoadImage failure.");
		}
	});

	HttpClient::getInstance()->send(request);
	request->release();
}

zipファイルをダウンロードしたら保存して、そこから順番にファイルを取り出して保存していきます。