サーバー上においてある画像をダウンロードして使う(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ファイルをダウンロードしたら保存して、そこから順番にファイルを取り出して保存していきます。