サーバーと通信をする際によく使われるデータ形式の1つに「XML」があります。サーバーのデータをXMLを使って受信することが可能になります。 今回は、cocos2dxで、「XML」を利用する方法を紹介したいと思います。
[JSONを利用する場合はこちらを参考] 【cocos2dx】JSONを利用してサーバーと通信する。 | albatrus.com
準備 - tinyxml2
XMLを分析するライブラリは「tinyxml2」を利用します。 cocos2dxに用意されているので、何もしなくても利用ができます。 [c] //ライブラリを読み込みます。
include "external/tinyxml2/tinyxml2.h"
using namespace tinyxml2; [/c]
準備 - HttpClient
サーバーとの通信には[HttpClient]クラスを利用します。 [c] //ライブラリを読み込みます。
include "network/HttpClient.h"
using namespace cocos2d::network; [/c]
Android側
Android.mkを修正します。 下記2つを追加します。 [c]
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_network_static
$(call import-module,network)
[/c]
準備 - xmlフアイル
サーバーに通信で読み込むxmlフアイルを設置します。
今回はDropboxを利用しています。
[c]
<?xml version="1.0" encoding="UTF-8" ?>
これで準備完了です。
XMLを実装
XMLファイルの値を取り出すコードを書きました。 「cocos2dxのレシピ本」を参考にしています。 [c] 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());
}
}
}
[/c]
実際の利用する際にはgetXmlValue()にXMLファイルのURLを指定して下さい。 [c] void NetWorkLayer::networkXML(){
this->getXmlValue("https://dl.dropboxusercontent.com/..........xml");
}
[/c]
これで完了です。
最後に
前回のエントリーに引き続き、サーバーとの通信についてのエントリーでした。 今回利用しているHttpClientは、非同期でファイルを読み込むことができるので、変な待ち時間ができません。 実際の利用は、libcurlよりもこちらの方がいいかもしれません。(もしかしたら、非同期ができるかもしれませんが)
いかがでしたでしょうか? サーバ関係、XMLについてはこれまで触ったことがなかったので、コードなど不安です。 もし、もっと良い方法等あれば教えていただけると嬉しいです。
Cocos2d‐x開発のレシピ―iOS/Android対応 松浦 晃洋,齊藤 建二,古木 映治 秀和システム 売り上げランキング : 49215 Amazonで詳しく見る |