【cocos2dx】XMLを利用してサーバーと通信する。

【cocos2dx】XMLを利用してサーバーと通信する。
   

サーバーと通信をする際によく使われるデータ形式の1つに「XML」があります。サーバーのデータをXMLを使って受信することが可能になります。
今回は、cocos2dxで、「XML」を利用する方法を紹介したいと思います。

[JSONを利用する場合はこちらを参考]
【cocos2dx】JSONを利用してサーバーと通信する。 | albatrus.com

準備 – tinyxml2

XMLを分析するライブラリは「tinyxml2」を利用します。
cocos2dxに用意されているので、何もしなくても利用ができます。
//ライブラリを読み込みます。
#include "external/tinyxml2/tinyxml2.h"
using namespace tinyxml2;

準備 – HttpClient

サーバーとの通信には[HttpClient]クラスを利用します。
//ライブラリを読み込みます。
#include "network/HttpClient.h"
using namespace cocos2d::network;

Android側

Android.mkを修正します。
下記2つを追加します。

LOCAL_WHOLE_STATIC_LIBRARIES += cocos_network_static

$(call import-module,network)



準備 – xmlフアイル

サーバーに通信で読み込むxmlフアイルを設置します。
今回はDropboxを利用しています。
<?xml version="1.0" encoding="UTF-8" ?>
<test>
  <x>albatrus-xml</x>
  <y>cocos2dx-xml/</y>
</test>

これで準備完了です。

XMLを実装

XMLファイルの値を取り出すコードを書きました。
「cocos2dxのレシピ本」を参考にしています。
void NetWorkLayer::getXmlValue(const char *url){
    
    cocos2d::network::HttpRequest *request = new HttpRequest();
    request->setUrl(url);
    request->setRequestType(HttpRequest::Type::GET);
    request->setResponseCallback(CC_CALLBACK_2(NetWorkLayer::callback2,this));
    HttpClient::getInstance()->send(request);
    request->release();
    
}


void NetWorkLayer::callback2(cocos2d::network::HttpClient *sender, cocos2d::network::HttpResponse *response){
        
    if (!response->isSucceed()) {
        
        return;
    }
    
    std::vector<char> *buffer = response->getResponseData();
    std::string _xml = std::string(buffer->begin(), buffer->end());
    
    XMLDocument doc;
    if (doc.Parse(_xml.c_str()) == XML_NO_ERROR) {
        
        
        const XMLElement *test = doc.FirstChildElement();
        for (;test;test = test->NextSiblingElement()) {
            
       //ここでXMLフアイルの値を取り出します。
            const XMLElement *_x = test->FirstChildElement("x");
            __String *xStr = __String::create(_x->GetText());
            
            const XMLElement *_y = test->FirstChildElement("y");
            __String *yStr = __String::create(_y->GetText());
            
            CCLOG("x:%s y:%s",xStr->getCString(),yStr->getCString());
            
            
        }
        
    }
       
}


実際の利用する際にはgetXmlValue()にXMLファイルのURLを指定して下さい。
void NetWorkLayer::networkXML(){

    this->getXmlValue("https://dl.dropboxusercontent.com/..........xml");

}


これで完了です。

最後に

前回のエントリーに引き続き、サーバーとの通信についてのエントリーでした。
今回利用しているHttpClientは、非同期でファイルを読み込むことができるので、変な待ち時間ができません。
実際の利用は、libcurlよりもこちらの方がいいかもしれません。(もしかしたら、非同期ができるかもしれませんが)

いかがでしたでしょうか? サーバ関係、XMLについてはこれまで触ったことがなかったので、コードなど不安です。
もし、もっと良い方法等あれば教えていただけると嬉しいです。


Cocos2d‐x開発のレシピ―iOS/Android対応Cocos2d‐x開発のレシピ―iOS/Android対応
松浦 晃洋,齊藤 建二,古木 映治

秀和システム
売り上げランキング : 49215

Amazonで詳しく見る

Related Posts Plugin for WordPress, Blogger...