Cocos2d-xのサーバー通信にはCCHttpRequest
を使います。
ダウンロードする画像はhttp://placeimg.com/640/480/anyから頂きます。
Http通信の開始
CCHttpRequest *request = new CCHttpRequest(); // いろいろ設定 request->setUrl("http://placeimg.com/640/480/any"); request->setRequestType(CCHttpRequest::kHttpGet); // 通信終了時のcallbackを設定する request->setResponseCallback(this, httpresponse_selector(Clazz::onHttpRequestCompleted)); // Http通信開始 CCHttpClient::getInstance()->send(request); request->release();
CCHttpRequestのインスタンスにたいしてautorelease()
を呼び出すと怒られる。
callback
void Clazz::onHttpRequestCompleted(CCHttpClient *client, CCHttpResponse *response) { if (!response->isSucceed()) {return;} // ダウンロードしたデータを取り出す std::vector<char> *buffer = response->getResponseData(); // ファイルパス作る std::string filePath = CCFileUtils::sharedFileUtils()->getWritablePath() + "image.png"; // 書き込む std::ofstream ofs; ofs.open(filePath.c_str(), std::ios::out | std::ios::trunc); ofs.write(&(buffer->front()), buffer->size()); ofs.flush(); ofs.close(); }
これで、各OSごとに指定されたアプリから書き込み可能なフォルダに画像が保存されました。
コールバックメソッドはメインスレッドで実行されるので、ファイルの保存処理は非同期処理にした方がいいと思います。
保存した画像をCCSpriteにしてみる
使う時はファイルパスを指定して使います。
// さっき保存したのと同じファイルパスを作る std::string filePath = CCFileUtils::sharedFileUtils()->getWritablePath() + "image.png"; CCSprite *sprite = CCSprite::create(filePath);
こんな感じ。
あとはCCFileUtils
のsetSearchPaths
とかにWritablePathを指定できたら初回起動時にリソースダウンロードするみたいなやつがカジュアルに出来ると思うんだけど、確認してない。