SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

フリーのFlashコンパイラMTASCを使ってお絵かきツールを作る

MTASCの使い方とサンプルプログラム


初めてのプログラム

 それでは「test」と画面に表示するだけの簡単なプログラムを作ってみます。メモ帳などのテキストエディタで、以下のプログラムを書いて、「test.as」という名前で保存します。

初めてのプログラム「test.as」
class test
{
    static function main()
    {
        _root.createTextField("a_txt", 100, 0, 0, 400, 32);
        _root.a_txt.text = "test!";
    }
}

 そして、コマンドラインで以下のように入力し、コンパイルします。

>mtasc -swf test.swf -main test.as -header 400:200:30

 これで「test.swf」という名前のFlashファイルが作成されています。先ほど、「mtasc --help」で見たとおり、MTASCでコンパイルするには、以下の書式で記述します。

コンパイルの書式
mtasc -swf (出力ファイル) -main (入力ファイル)
 -header (幅):(高さ):(フレーム)

 Flashプレイヤーが拡張子「.swf」と関連付けられていれば、ダブルクリックするだけで起動できます。Flashプレイヤーは、Webサイトより入手できます。

 改めてプログラムを見てみます。Macromedia Flashで行うプログラミングと違って、MTASCでは、必ずクラスを定義する必要があります。Javaと同じで、ファイル名とクラス名を必ず対応させ、1ファイル1クラスの原則を守らなくてはなりません。つまり、「test.as」というファイルなら、その中でtestというクラスを宣言する必要があります。1のファイルの中に2つ以上のクラスを宣言することはできません。

 そしてメインプログラムは、クラス定義の中でmain()という関数を定義します。この時、main()関数には、staticキーワードをつけて宣言します。

 詳しくプログラムを見ると、main()関数の1行目で、_rootが使われています。_rootはメインステージを表すMovieClipクラスのインスタンスです。そして、画面に文字を表示するために、「createTextField()」メソッドを使ってTextFiledを生成し、テキストを設定しています。

 Macromedia Flashでは、trace()関数を使って、デバッグ用のウィンドウにメッセージや変数の値を出力することができますが、MTASCにはtrace()関数が用意されていません。デバッグ用になにか表示させたい場合は、TextFiledを生成しそこにテキストを設定することで、trace()関数の代わりにします。

シンプルなお絵かきプログラム

 それでは、お絵かきプログラムを作ってみましょう。以下がシンプルなお絵かきプログラムになります。EDrawという名前のクラスを作りますので、「EDraw.as」という名前で保存してください。

お絵かきプログラム
class EDraw
{
    static function main()
    {
        var mouse_b:Boolean;
        
        // 描画スタイルの指定
        _root.lineStyle(5, 0xFF0000, 100); // 赤色で線を描画
        
        // マウスボタンを押した時の動作
        _root.onMouseDown = function ()
        {
            mouse_b = true;
            _root.moveTo(_root._xmouse, _root._ymouse);
        }
        // マウスボタンを離した時の動作
        _root.onMouseUp = function ()
        {
            mouse_b = false;
        }
        // マウスボタンを動かした時の動作
        _root.onMouseMove = function ()
        {
            if (!mouse_b) { return; }
            _root.lineTo(_root._xmouse, _root._ymouse);
        }
    }
}

 これをコンパイルするには、以下のように指定します。

>mtasc -swf EDraw.swf -main EDraw.as -header 400:400:30

 先ほども述べましたが、_rootMovieClipのインスタンスとなっています。ですから、_rootには様々なメソッドやプロパティが用意されています。マウスイベントを設定し、その中で、線を描画するように指示するだけで、お絵かきプログラムが完成したのは、MovieClipに豊富な機能が備わっているおかげです。

シンプルなお絵かきプログラム:
シンプルなお絵かきプログラム:

保存機能の実装

 さて、これに保存機能を実装してみます。Flashは通常WEBブラウザ内で動かしますので、セキュリティの問題上、好き勝手にファイルを保存することができません。そのため、保存機能を実現するには、以下の2つの方法しかありません。

  • (ブラウザのCookieに似た機能)SharedObjectを使ってローカルPCに保存
  • CGIを介してサーバーに保存

 まずは、前者のSharedObjectを使って保存してみます。保存機能のついたお絵かきプログラムを「EDraw2.as」という名前で作りました。

保存機能のついたお絵かきプログラム:
保存機能のついたお絵かきプログラム:

 以下が、その中から、SharedObjectを使ってデータを保存と読み込みをしているしている部分です。

SharedObjectを利用したプログラムの一部分
// 保存
function saveDataToSharedObject(save_data:String)
{
    /* SharedObjectへ保存 */
    var so = SharedObject.getLocal("EDraw");
    so.data.draw = save_data;
}
// 読込
function loadDataFromSharedObject():String
{
    var so = SharedObject.getLocal("EDraw");
    return so.data.draw;
}

 「SharedObject.getLocal(オブジェクト名)」でSharedObjectオブジェクトを取得し、このdataプロパティへ適当なフィールド名で読み書きすることでデータを保存したり、読み込んだりできます。

 そして、保存する描画データですが、これはプログラムを単純にするために、描画コマンドと座標の組み合わせで実現しています。以下が描画データの作成部分ですが、実際の描画と同時に、保存用のデータも作成しています。

 例えば、座標(10, 20)でマウスボタンを押した時には、"m,10,20:"という文字列を保存用の変数に追加し、マウスを座標(20, 30)へ動かすと、"l,20,30:"という文字列を追加します。

描画データの作成部分
/* コンストラクタ */
function EDraw2()
{
    var mouse_b:Boolean; // マウスの状態
    var link = this;     // this の省略用
    /* ...省略... */
    // マウスボタンを押した時の動作
    _root.onMouseDown = function ()
    {
        mouse_b = true;
        _root.canvas_mc.moveTo(_root._xmouse, _root._ymouse);
        link.draw_str +=
            "m," + _root._xmouse + "," + _root._ymouse + ":";
    }
    // マウスボタンを動かした時の動作
    _root.onMouseMove = function ()
    {
        if (!mouse_b) { return; }
        _root.canvas_mc.lineTo(_root._xmouse, _root._ymouse);
        link.draw_str +=
            "l," + _root._xmouse + "," + _root._ymouse + ":";
    }
    // マウスボタンを離した時の動作
    _root.onMouseUp = function ()
    {
        mouse_b = false;
    }
    /* ...省略... */

 文字列の描画データを、実際にキャンバスへ反映するプログラムが以下になります。描画用のコマンド文字列は1コマンドごとが":"で区切られており、さらにコマンドの引数が","で区切られています。そこで、split()メソッドを使って、文字列を区切ることで、すっきり解析処理ができるようにしました。

描画データの反映
/* 描画の再現 */
function drawSaveData(save_data:String)
{
    var commands:Array = save_data.split(":"); // ":"がコマンドの区切り
    for (var i = 0; i < commands.length; i++) {
        var arg = commands[i].split(","); // ","が引数の区切り
        if (arg[0] == "m") { // 基点移動コマンド
            _root.canvas_mc.moveTo(arg[1],arg[2]);
        } else if (arg[0] == "l") { // 線描画コマンド
            _root.canvas_mc.lineTo(arg[1],arg[2]);
        }
    }
}

次のページ
外部の画像を読み込んでボタンとして使う

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

クジラ飛行机(クジラヒコウヅクエ)

ソフト企画「くじらはんど」にて、多数のフリーソフトを公開しています。日本語プログラミング言語「なでしこ」、テキスト音楽「サクラ」、日本語Wiki記法が特徴の「KonaWiki」などを公開しています。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/298 2006/05/15 19:15

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー