AS3.0でXMLを使ってみる

 Flash MXでのやりかたはXMLを読もうを参照してください。
 ちなみに、以前のXMLと同じ扱いをする場合はflash.xml パッケージ のオブジェクトを使ってもらうようになっているよーです。移植する時ぐらいしか使わないと思いますが。

 えーと、今回からはFlash CS3を使って色々やります。
 折角前回Flex SDKをインストールしておいてなんですが。

 とりあえず、Flash(ActionScript3.0) / 用語辞書なんてものを作ってみようかなーと。
 Adobeのリファレンスにリンクするだけのページではあるんだけど、なにしろオブジェクトが多いので、一度整理しておかないとなんともわけ分からん。
 実際に使うのは、1/10が良いところだろうと思うんだけど。

 とりあえず、この中でトップレベルのオブジェクトはECMAScript(Core)と同じらしいので、AS1.0からすると新たに加わったRegExpとかuintとかintとかあるけれど、まぁだいたいフツーのJavaScript的な感じでOKのようです。
 でActionScript3.0なんですけど、名前空間でパッケージ分けされてるとゆー、なんともJavaくさい仕様に変わってます。デザイナー無視な風潮が見られる今日この頃、いかがお過ごしですか。
 ただし、flashというパッケージはデフォルトで読み込まれているので、特にパッケージを意識することなく使えるという救済策が取られています。でもまぁ…導入部分が面倒なことになっているのは間違いない。

 そして、この記事は入門用に書いている訳ではないので、私の興味があるところからやっていきます。
 そんなわけでいきなりXMLの操作について調べます。ひでーや。

E4Xが採用されたとか

 ActionScript3.0はXMLを扱うために、ECMAScript for XML (E4X) を採用している。
 ActionScript1.0や2.0はDOM的なXML操作ができたが、E4Xのほうがより直感的な操作ができる。
 まず以前のやりかたは、確かこんな感じ。もうちょっと省略しても書けたと思うけど。

item0 = _xml.getElementsByTagName('sample').item(0).value;

 いくら何でも面倒すぎると、策定するときに気づけよ!という感じだが、殿上人の考えることは良く判らん。

 同様の操作をAS3.0(E4X)で。

item0 = _xml.sample[0];

 圧倒的に簡単。E4Xはすげーぜ。

その場で読む

 XMLオブジェクトのリテラルはXMLそのままで、文字列以上に気軽に書ける。
 Perlなんかのヒアドキュメントのような感覚だけど、特別な書式無しにいきなり書けるので、ヒアドキュメント以上に楽。

var _xml:XML =
<base>
	<item>りんご</item>
</base>

 ちなみに、いちいちリテラルに次のようなXMLの宣言を入れる必要はない。というか入れるとエラーとなる。

<?xml version="1.0" encoding="UTF-8"?>

 複雑なObjectやDictionaryとして使える。というよりもう、ObjectとかDictionaryを構造体的に使う場合はもうXMLで作った方が機能豊富でいいんじゃないだろうか。
 重さを気にしないなら、ちょっとしたデータ構造までぜんぶXMLでいいんじゃないか。

ファイルから読む

 今度は、ファイルから読んでみる。
 当サイトにはメイドロイド「みちよ」/メイド漫才とゆー、ステキコンテンツがあるのだが、これの台本データはXMLで書かれているのだだだっ。
 でまー、軽くこれを再現してみようと言うスンポー。
 次のXMLテキストを"textio.xml"というファイル名で保存。

<?xml version="1.0" encoding="UTF-8" ?>
<textio>
<act>
	<p name="みちよ">こんにちは、おひさしぶりです。みちよです</p>
	<p name="ご主人">どーも、その主人です</p>
	<p name="みちよ">はい、こいつがうちの主人です</p>
	<p name="ご主人">なーんか、敬われているような、そーでないような言いかただなぁ</p>
	<p name="みちよ">なに言ってるんですか、主人はうやままれてますよ</p>
	<p name="ご主人">そ、そう?</p>
	<p name="みちよ">うやままの意味は分かりませんが</p>
	<p name="ご主人">分かってねーのかよ!!</p>
</act>
</textio>

みちよ「じゃっかん痛いです」
 …
みちよ「面白くもないです」
 …

 えーと気を取り直して。
 ステージ上に、インスタンス名"_txt"で、ダイナミックテキストを全面に置きまして。
 フレームアクションに次のスクリプトを書く。

// XML読み込み用
var textio_xml:XML = new XML();
const XML_REQUEST:URLRequest = new URLRequest( "textio.xml" );
var XMLLoader:URLLoader = new URLLoader( XML_REQUEST );
XMLLoader.addEventListener( Event.COMPLETE, xmlLoaded );

// Timer用
var pCounter:int = 0;
var timerObj:Timer;

function xmlLoaded(event:Event):void {
	textio_xml = XML( XMLLoader.data );
	var maxP:int = textio_xml.act[ 0 ].p.length();
	timerObj = new Timer( 1 ,maxP );
	timerObj.addEventListener( TimerEvent.TIMER, onTick );
	timerObj.start();
}

function onTick(e:TimerEvent):void {
	var curP:XML = textio_xml.act[0].p[ timerObj.currentCount - 1 ];
	timerObj.delay = curP.toString().length * 100;
	_txt.appendText( curP.@name.toString() + "「" + curP.toString() + "」¥n" );
}

 なんか、constで定数使えたり、変数の定義でのクラス指定必須だったり、色々変わってます。
 例によって、入門時の敷居上げてますなー。言語としては正しい方向性だとは思うけど。
 あと、Timerクラス使いやすい!便利!

 意外に困ったのが"¥n" 。なんかしらんけどopt + ¥(Mac OS X)で入力したバックスラッシュでないと受け付けないみたい。
 しかも最初"¥r"でやってたら、動きがおかしくなって、おーじょーしました。Flash CS3のバグっぽい。

メイド漫才のActionScript化に一歩近づいた

 最初、Stringはlengthというプロパティで長さが取れるのに、XMLの方はlength()というメソッドであることに違和感を覚えたんですが、よくよく考えたら、メソッドにしておかないとlengtnという要素名があるXMLデータが操作できなくなっちゃうので、メソッドにせざるを得ないんですよねー、なるほどねー。

 ただ、私まだボタンの使い方も良く判ってないのよね。はははははははー。

 今日はここまで。


2008-02-16