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

フニゲの開発日記

Electronとか...

Cocos2d-xでcurlとかjsonとか


 サーバーと通信してデータをJSONで取得する処理。

 本当はCCHttpRequestを使いたいのだが、Cocos2dとUIKitを併用しているゲームの場合、UIKitでメニューを表示している間はCocos2dのイベントループが動いていないので、CCHttpRequestを投げてもレスポンスが返ってこないという困ったことになる。まあ仕様なんだからしょうがない。

 C/C++のlibcurl利用サンプル - Qiita

#include <curl/curl.h>

...
static char* errorBuffer;
static string buffer;

static int writer(char *data, size_t size, size_t nmemb, string *buffer)  
{
    int result = 0;
    if (buffer != NULL) {  
        buffer->append(data, size * nmemb);  
        result = size * nmemb;  
    }  
    return result;  
}

GiftData* GiftData::load()
{
    CURL *curl = curl_easy_init();
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
        curl_easy_setopt(curl, CURLOPT_URL, "サーバーのURL");
        curl_easy_setopt(curl, CURLOPT_HEADER, 0);
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);  

        CURLcode result = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        if (result == CURLE_OK) {
            CCLog("curl ok! %s", buffer.c_str());
        } else {
            CCLog("curl error! %s", errorBuffer);
        }
    }

 で、さらにpicojsonでバラして読み込み。これも本当はcocos2d-xのSpineに入っているJSONパーサーを使うべきなのだと思う。

#include "picojson.h"
using namespace picojson;
using namespace std;
...

    const char *json = buffer.c_str();
    value v;

    string err = parse(v, json, json + strlen(json), &err);
    if (err.length() <= 1) { // なぜかerr.empty()だとうまくいかない
        array items = v.get<array>();

        array::iterator it;
        for (it = items.begin(); it != items.end(); it++) {
            object o = it->get<object>();

            std::string name = o["name"].get<string>();
            ...

 どうも気が滅入る。早くCocos2d-JSの記事が書きたい……。

広告を非表示にする