読者です 読者をやめる 読者になる 読者になる

Cocos2d-x-2.xでサーバー上のデータをダウンロードして保存する

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);

こんな感じ。

あとはCCFileUtilssetSearchPathsとかにWritablePathを指定できたら初回起動時にリソースダウンロードするみたいなやつがカジュアルに出来ると思うんだけど、確認してない。