えーと、今回からはFlash CS3を使って色々やります。
折角前回Flex SDKをインストールしておいてなんですが。
とりあえず、Flash(ActionScript3.0) / 用語辞書なんてものを作ってみようかなーと。
Adobeのリファレンスにリンクするだけのページではあるんだけど、なにしろオブジェクトが多いので、一度整理しておかないとなんともわけ分からん。
実際に使うのは、1/10が良いところだろうと思うんだけど。
とりあえず、この中でトップレベルのオブジェクトはECMAScript(Core)と同じらしいので、AS1.0からすると新たに加わったRegExpとかuintとかintとかあるけれど、まぁだいたいフツーのJavaScript的な感じでOKのようです。
でActionScript3.0なんですけど、名前空間でパッケージ分けされてるとゆー、なんともJavaくさい仕様に変わってます。デザイナー無視な風潮が見られる今日この頃、いかがお過ごしですか。
ただし、flashというパッケージはデフォルトで読み込まれているので、特にパッケージを意識することなく使えるという救済策が取られています。でもまぁ…導入部分が面倒なことになっているのは間違いない。
そして、この記事は入門用に書いている訳ではないので、私の興味があるところからやっていきます。
そんなわけでいきなりXMLの操作について調べます。ひでーや。
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のバグっぽい。
最初、Stringはlengthというプロパティで長さが取れるのに、XMLの方はlength()というメソッドであることに違和感を覚えたんですが、よくよく考えたら、メソッドにしておかないとlengtnという要素名があるXMLデータが操作できなくなっちゃうので、メソッドにせざるを得ないんですよねー、なるほどねー。
ただ、私まだボタンの使い方も良く判ってないのよね。はははははははー。
今日はここまで。
2008-02-16