2015年01月20日

【cocos2d-x】ローカルのXMLファイルの読み込み&解析

cocos2d-xでasset内のXMLを読み込んで解析して使う方法を試してみた。
開発環境はEclipse4.4、cocos2d-xはver.3.2、動かした実機はXperiaVL SOL21、AndroidのOSバージョンは4.1。

test.xml(読み込むXMLファイル)

<charadata>
<item>
<id>0</id>
<reach>0.0</reach>
<power>8</power>
<target>0</target>
</item>
<item>
<id>1</id>
<reach>0.0</reach>
<power>8</power>
<target>0</target>
</item>
<item>
<id>2</id>
<reach>0.0</reach>
<power>8</power>
<target>2</target>
</item>
……
</charadata>


cocos2d-x内、cppファイル。
テストXML読み込み、解析、表示。

//ファイルパスの取得
FileUtils* fileUtils = FileUtils::getInstance();
const char* path = "test.xml";
std::string fullpath = fileUtils->fullPathForFilename(path);
log("filepath:%s",fullpath.c_str());

//XMLを読み込んでパース
auto content = fileUtils->getDataFromFile(fullpath.c_str());
tinyxml2::XMLDocument *doc = new XMLDocument();
log("xml:%d",(const char*)content.getSize());
auto ret = doc->Parse((const char*)content.getBytes(), content.getSize());
if (ret != tinyxml2::XML_NO_ERROR) {
//xml
log("xml:fail:%d",ret);
return;
}

//XMLのルートを呼び出す
auto rootElement = doc->RootElement();
if (!rootElement){
log("xml:rootElement Error");
return;
}

//最初の要素を呼ぶ
tinyxml2::XMLElement* childElement = rootElement->FirstChildElement("item");

while (childElement) {
tinyxml2::XMLElement* element_id = childElement->FirstChildElement("id");
log("id:%s",element_id->GetText());
tinyxml2::XMLElement* element_reach = childElement->FirstChildElement("reach");
log("reach:%s",element_reach->GetText());
tinyxml2::XMLElement* element_power = childElement->FirstChildElement("power");
log("power:%s",element_power->GetText());
tinyxml2::XMLElement* element_target = childElement->FirstChildElement("target");
log("target:%s",element_target->GetText());
//次の要素を呼ぶ
childElement = childElement->NextSiblingElement("item");
}


プログラム実行、XML内容表示

01-20 01:43:40.148: D/cocos2d-x debug info(18446): id:0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): reach:0.0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): power:8
01-20 01:43:40.148: D/cocos2d-x debug info(18446): target:0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): id:1
01-20 01:43:40.148: D/cocos2d-x debug info(18446): reach:0.0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): power:8
01-20 01:43:40.148: D/cocos2d-x debug info(18446): target:0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): id:2
01-20 01:43:40.148: D/cocos2d-x debug info(18446): reach:0.0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): power:8
01-20 01:43:40.148: D/cocos2d-x debug info(18446): target:2
01-20 01:43:40.148: D/cocos2d-x debug info(18446): id:3
01-20 01:43:40.148: D/cocos2d-x debug info(18446): reach:0.0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): power:8
01-20 01:43:40.148: D/cocos2d-x debug info(18446): target:2
01-20 01:43:40.148: D/cocos2d-x debug info(18446): id:4
01-20 01:43:40.148: D/cocos2d-x debug info(18446): reach:0.0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): power:8
01-20 01:43:40.148: D/cocos2d-x debug info(18446): target:2

……


こんな感じでできました。

ちなみにファイル読み込み時にtinyxml2::XMLDocument::LoadFileを使ってみたのですが、正常に動けば0を返すところが、Androidでは3を返してちゃんと動作しませんでした。

const char* path = "test.xml";
std::string fullpath = fileUtils->fullPathForFilename(path);
tinyxml2::XMLDocument *doc = new XMLDocument();
auto ret= doc ->LoadFile(fullpath.c_str());
if (ret != tinyxml2::XML_NO_ERROR) {
//xml
log("xml:fail:%d",ret);
return;
}

この3が何を意味するのか詳しく調べないとわからないのですが、できればLoadFileメソッドを使いたかったなと。
こちらのほうがコードが簡素に書けるので。
iPhoneだとどうなんだろうか?

posted by B.cos at 02:17| Comment(0) | TrackBack(0) | cocos2d-x | このブログの読者になる | 更新情報をチェックする

2015年01月08日

cocos2d-x、開発基礎、まとめ2

@[C++] Cocos2D-xでゲームを作る前の準備
http://qiita.com/edo_m18/items/4a53eee51bbc95974770
↑C++の使い方の復習、、、というかそれ以前に知らんことだらけ。

ApicoJsonに関して
cocos2d-xでJSONを使う
http://nirasan.hatenablog.com/entry/2013/10/24/232905

picojsonを使ってみる
http://ameblo.jp/systemtelescope/entry-11820880734.html

【cocos2d-x】picojsonでJSONファイルを読み込む
http://tsuyushiga.hatenablog.jp/entry/2014/06/04/232104
(ローカルファイルから読み込む方法)

picojsonを使用してHTTP(POST)通信する
http://qiita.com/hkomo746/items/214d0482b6090c0a3ce0
(HTTP通信使用)

BHTTP通信をcocos2d-xで使う際の注意
cocos2d::network::HttpClientを使う際はAndroid.mk内の

LOCAL_WHOLE_STATIC_LIBRARIES += cocos_network_static

及び

$(call import-module,network)

のコメントアウトを外す。


CXMLを解析
【cocos2dx】XMLを利用してサーバーと通信する。
http://albatrus.com/main/cocos2d/6239

DC++のキャストについて
C++ のキャスト - static_cast
http://yohshiy.blog.fc2.com/blog-entry-17.html

C++のキャスト演算子
http://www.geocities.jp/bleis_tift/cpp/newcast.html

static_cast
http://www.wdic.org/w/TECH/static_cast

Eオマケ
どう見ても確信犯…!! 表紙詐欺に全力を尽くした「ヤマノススメ」のパロディ本が話題に
表紙をめくったら、女子高生がゴツいおっさんに…
http://togech.jp/2015/01/05/17258

俺のあおいたんが・・・・・・俺みたいに・・・・・・ッッ!!
posted by B.cos at 01:38| Comment(0) | TrackBack(0) | cocos2d-x | このブログの読者になる | 更新情報をチェックする