×

[PR]この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。


概要

吉里吉里には標準のライブラリとしてExpat.dllが含まれています。
ここではExpat.dllを使用して、簡単なXMLファイルを読み込む手順を説明します。
KKDE(Kiri Kiri Development Environment) ver 2.0.0で確認しました。

1. Expat.dllとは?何ができるの?

Expat.dllはC言語で書かれたXMLパーサです。 http://expat.sourceforge.net/
吉里吉里に標準で添付されており、XMLファイルを読み込んで、
「タグの開始」「タグの終了」「テキスト」を判別してくれます。

純粋なパーサとでも言うのか、本当に「解析機能」だけを提供するようです。
(解析したデータの保持もしないし、XMLファイルの書き出し機能もないです。
ゲームデータ管理なら、データ構造は独自のものである場合が多いので、
向いているのかもしれません)

2. Expat.dllを使ってみる

xmlファイルには「タグの開始」「タグの終了」「テキスト」が含まれます。
まず、これらに応じて、「何のタグの時データをどこへ格納するか」などの
処理を定義したイベントハンドラを作成します。

次に、expat.dllの XMLParser クラスに、読み込みたいxmlファイル名と
上記のイベントハンドラを渡すことで、処理が実行されます。

以下に、簡単なサンプルと、導入手順を説明します。

KKDEで、「ファイル→新規作成→プロジェクト作成」をクリックします。プロジェクトの種類として
「KAG3プロジェクト」、名前は適当に「readxmltest」、パスはどこでもよいです。
指定したパスにフォルダが生成されていることを確認します。

※ 以下簡単のため、今生成されたフォルダを「readxmltestフォルダ」、
KKDE本体があるフォルダを「kkdeフォルダ」と記載します。

kkde/krkr/kirikiri2/pluginフォルダを開くとexpat.dllがあるので、
readxmltest/pluginフォルダへコピーします。

読み込みたいxmlファイルを用意します。
ここではサンプルとして下記のようなxmlファイルを用意し、
readxmltest/others/sample.xml に保存します。
保存するとき、エンコードはUTF-8を指定します。

sample.xml
<?xml version="1.0" encoding="utf-8" ?>
<data>
	<enemy>
		<img file="slime01"/>
		スライム。ぶよぶよ。
	</enemy>
	<enemy>
		<img file="gobline01"/>
		ゴブリン。むんむん。
	</enemy>
</data>
エネミー一覧のようなデータを想定したサンプルとなっています。
enemyタグごとに、画像を現すimgタグと、説明を表すテキスト部分があります。

xml構造は厳密に検査されるようで、以下のような点に注意が必要です。
   ・ルート要素は1つでなければならない(上記では「data」)
   ・単体タグ(imgなど)は閉じカッコ">"の前にスラッシュ"/"をつける

KKDEに戻り、startup.tjsに処理を記述していきます。
ここではゲーム開始時にxmlファイルを読み込むことを想定して、
スクリプトの先頭にイベントハンドラクラスと、読み込み処理を記述しています。

startup.tjs
// startup.tjs - スタートアップスクリプト

// expat.dllをリンクする。
Plugins.link("expat.dll");

// データを格納するグローバル変数を定義。
var g_enemyList=new Array();
var enemyid=-1;

// イベントハンドラクラスを定義する
class EventTarget {

	// 「タグの開始」を検出した時に呼ばれるイベントハンドラ
	// nameにはタグ名が、dicにはタグの Attribute が 名前,値,名前,値, ... の順で配列で格納されている。
	// 例:<a href="...URL..." target="_blank"> なら、name="a"、dic=["href","...URL...","target","_blank"];
	function startElement(name, dic) {

		// enemyタグならidを次へ、配列を初期化。
		if(name=="enemy"){
			enemyid++;
			g_enemyList[enemyid]=new Array();
		}

		// imgタグならファイル名dic[1]を格納。
		if(name=="img"){
			g_enemyList[enemyid].img=dic.file;
		}
	}

	// 「タグの終了」を検出した時に呼ばれるイベントハンドラ
	function endElement(name) {
	}

	// 文字列データ(タグとタグの間のテキスト)を検出した時に呼ばれるイベントハンドラ
	function characterData(data) {
		// Trimなどして空白の要素は無視する
		data=data.replace(/\n/g,"");
		data=data.replace(/^\s+/g,"");
		data=data.replace(/\s+$/g,"");
		if(data=="") return;

		// 格納
		g_enemyList[enemyid].text=data;
	}
}

// 読み込み処理の実行
var hnd=new EventTarget();
var parser = new XMLParser(hnd);
parser.parseStorage("others/sample.xml");

Scripts.execStorage("system/Initialize.tjs");
上記では、利用頻度が高いと思われる startElement と characterData を使用して、
グローバル変数 g_enemyList に エネミーごとの情報を格納しました。

first.ksを開き、読み込み結果を表示するように修正します。

first.ks
[wait time=200]
ExpatでXML読み込みテスト[r]

[r]
[emb exp="g_enemyList[0].text"][r]
[emb exp="g_enemyList[0].img"][r]
[emb exp="g_enemyList[1].text"][r]
[emb exp="g_enemyList[1].img"][r]
結果はこちら

3. その他のメソッド

上記の他にも、不正なXMLが検出された場合に呼ばれる関数なども登録できます。
詳しくは下記を参照ください。
http://hpcgi1.nifty.com/gutchie/wifky/wifky.pl?p=...

4. Expat以外のXML関連プラグイン

Expatは吉里吉里に標準で添付されていますが、標準以外では
下記のようなプラグインがある様子。動作未確認です。(2013年5月現在)
ktl_ptree.dll
http://www.boleros.x0.com/doc/ktlwiki/index.php?example%2FXML%C6%C9%A4%DF%B9%FE%A4%DF