さんまがおいしい季節だねー(´・ω・`)

Flash + ブラウザで printf デバッグ

Flash,一人でできるもん! — タグ: , , — さくら @ 2009/03/17 21:59

さくらです♪こんばんわ☆

予告どおり Flash のプログラミング Tips をお送りするわ。
今回は超基本、printf デバッグね!!

flashplayer で trace

まず flashplayer からデバッグするときは trace を呼び出せばコンソール(Windows なら DOS 窓ね)にメッセージが出力されるわ。

package {
    import flash.display.*;
    public class TraceDebugTest extends Sprite {
        public function TraceDebugTest() {
            trace("TraceDebugTest()");
        }
    }
}

このパッケージをコンパイルして flashplayer から動かすとこんな感じでメッセージが表示されるわね。

$ flashplayer TraceDebugTest.swf
TraceDebugTest()

メッセージはコンソールに出力されるから、必ずDOS窓とかターミナルから実行してね。
Flex Builder 使ってるならたぶん trace メッセージ表示用の何かがあるはずよ。さくらは使ってないから何かが何かは知らないわ。

ブラウザ上で ActionScript を printf デバッグ

次はブラウザから実行した場合の printf デバッグのやり方よ。
っていうか trace はどの資料見ても書いてるから特に調べなくても分かるんだけど、ブラウザからどうやってデバッグしたらいいのかさくらはかなり悩んだわ。特にさくらは FireFox 使ってるし、Flex Builder を使ってないから、どこから手をつけたらいいのか分かりにくかったの。

で、結論から言うと2つ方法があるみたいね。

FireFox の addon/extension を使…えなかったわ

一つ目は FireFox の addon とか extension で trace を出力する方法ね。
FlashTracer とか flash-thunderbolt が使えるみたいよ。

みたいよって書いたのは、さくらはこの辺のもの使わなかったからよ。
とりあえず FlashTracer は最新の FireFox に対応していないみたいだったので使わなかったわ。
flash-thunderbolt はなんかインストールが面倒くさそうだったので試してないわ。

JavaScript の alert 関数を ActionScript から呼び出す

もう一つの方法は JavaScript 関数を呼び出す方法よ。こっちは具体的に紹介しとくわね。

JavaScript の関数を ActionScript から呼び出すには ExternalInterface パッケージの call 関数を使うといいわ、って Adobe の人も言ってるわ。
マニュアルによると ExternalInterface.call 関数を使う際は、ExternalInterface.available プロパティを参照して外部インタフェースが有効か調べてからの方がいいみたいよ。

こんな感じで JavaScript の alert を呼び出すと便利だと思うわ。
いつもと同じ方法っていうのは楽でいいわね。

package {
    import flash.display.*;
    import flash.external.ExternalInterface;
    public class AlertTest extends Sprite {
        private static function alert(mesg:*):void {
            if (ExternalInterface.available) {
                ExternalInterface.call('alert', String(mesg));
            } else {
                trace(String(mesg));
            }
        }
        public function AlertTest() {
            alert("AlertTest()");
        }
    }
}

フォールバックに trace 突っ込んでもっとキテ!るのはオマケね。flashplayer から動かすとフォールバックコードを通るわ。完璧ね!

ちなみに ExternalInterface.call は、alert に限らずどんな JavaScript 関数でも呼び出すことができるわ。便利ね!

ExternalInterface のマニュアルによると marshallExceptions プロパティを true にすることで ActionScript 例外を現在のブラウザに渡すことができるようなことが書いてあったんだけど、さくらのところではできなかったわ。
具体的に言うとこんな感じのソース書いて動かしてみたんだけど、ブラウザは例外を補足しなかったってこと。

package {
    import flash.display.*;
    import flash.external.ExternalInterface;
    public class ExceptionsTest extends Sprite {
        public function ExceptionsTest() {
            ExternalInterface.marshallExceptions = true;
            throw new Error("Exception from ActionScript");
        }
    }
}

さくらのコードが悪かったのかもしれないけど、ActionScript からブラウザに例外投げたい状況がいまいち想像しにくいのでどっちでも言いような気もするわ。

ActionScript から JavaScript 関数を ExternalInterface.call で呼び出して、その JavaScript 関数から投げられた例外を ActionScript で補足したいんだったら ExternalInterface.marshallExceptions を true にしとかないといけないみたいね。AlertTest のコンストラクタでもセットしといた方がいいのかもしれないけど、無くてもいいと思うわ。
ちゃんと知りたい人は ExternalInterface のマニュアルでも読んでちょうだい。(上にリンク貼ってあるわ。)

さくら

0 Comments »

コメントはまだありません。

この投稿へのコメントの RSS フィード。 TrackBack URI

コメントする

Copyright © 2017 さくらたんどっとびーず | powered by WordPress with Barecity