トップ » 技術記事 » 無料で作るケータイFlash(Flash Lite2/3)(4) - ズームする待ち受けFlashを作る

無料で作るケータイFlash(Flash Lite2/3)(4) - ズームする待ち受けFlashを作る

タグ: ActionScript 待ち受けFlash

本連載では、ケータイFlash(Flash Lite 2/3)を無料ツールだけで作ることを目標にしています。今回は携帯電話で使える待ち受けFlashを作るまでの過程を紹介します。

おさらいと今回の内容

  • 1回目は、Flash Lite 2/3 を作ることのできるオープンソースのソフトをいろいろ紹介しました。
  • 2回目は、MTASCを使ってコンパイルの仕方を紹介しました。簡単なFlashファイルを作って携帯電話で動かしてみました。
  • 3回目は、swfmill を利用して画像やフォントを組み込んだ Flashファイルを作りました。

今回は、前回の補足と、もう少しスクリプトを組み込んで「ズームする待ち受けFlash」を作ってみます。

前回の復習~MTASCとswfmillで素材入りSWFファイルの生成

前回は、FlashDevelop の機能を使って、swfmill で作った SWFファイルにスクリプトを埋め込んでみました。FlashDevelop を使わずに作業する場合や、Mac OS X で作業をする場合などは、コマンドラインからコンパイルする必要があります。

もう一度、手動での作業手順と簡単なサンプルを確認してみます。

必要となるファイルは次の通りです。

  • sozai.xml
  • gazou.png
  • Main.as

gazou.png は、240×240px の PNG画像ファイルです。

file:sozai.xml

<?xml version="1.0" encoding="UTF-8" ?>
<movie width="240" height="240" framerate="12" version="7">

  <background color="#000000"/>
  <frame name="first">
    <!-- ライブラリに素材を追加する -->
    <library>
      <clip id="GAZOU" import="gazou.png" />

    </library>
    <!-- 画面に素材を配置する -->
    <place id="GAZOU" name="pic_mc" x="0" y="0" depth="1"/>

  </frame>
</movie>

file:Main.as

class Main
{
    public static function main(swfRoot:MovieClip):Void
    {
        // TextField を配置する
        var clock_txt:TextField;
        swfRoot.createTextField("clock_txt", swfRoot.getNextHighestDepth(),
                                10, 10, 200, 50);
        clock_txt = swfRoot.clock_txt;
        clock_txt.textColor = 0xFFFFFF;
        // 毎フレーム時計を表示する
        swfRoot.onEnterFrame = function() {
            var d:Date = new Date();
            clock_txt.text = d.getHours() + ":" + d.getMinutes() + ":" +
                             d.getSeconds();
        };
    }
}

以下、コンパイル手順です。

(1)swfmill で素材入りの SWF ファイルを作る

MTASC だけでは、画像やフォントなど素材入りのSWFを作ることができません。そこで、素材の元となるSWFファイルを swfmill で作成します。

> swfmill simple sozai.xml sozai.swf

コンパイルすると、sozai.swf が生成されます。

(2)SWFファイルにスクリプトを埋め込む

次に、素材入りSWFファイル「sozai.swf」にスクリプト「Main.as」を埋め込みます。

> mtasc -main Main.as -swf sozai.swf -out Matiuke.swf

コンパイルすると、「Matiuke.swf」が生成されます。

このSWFファイル「Matiuke.swf」を携帯電話に転送して、動作確認できます。

(参考)画像の切り抜きツール

ちなみに、画像ファイルを指定の大きさで切り取るツールを、日本語プログラミング言語「なでしこ」で作ってみたので、良かったら試してみてください。

使い方ですが、なでしこのエディタに以下のプログラムを貼り付けて実行します。画像ファイルを尋ねられるので、画像ファイルを指定すると、画像が画面に表示されます。そこで、ドラッグでウィンドウの大きさを変更すると、画像も同じようにリサイズされます。そこで、画面上の四角い枠を移動させて切り抜きたい部分に合わせて、枠をダブルクリックします。すると、画像を保存できます。

#-----------------------------------------------------------------------
# 画像切り抜きツール
#-----------------------------------------------------------------------
画像W=240
画像H=240
「画像|*.jpeg;*.jpg;*.png」のファイル選択して対象ファイルに代入。
もし、対象ファイルが空ならば、終わる。
#-----------------------------------------------------------------------
対象画像とはイメージ。その位置は「0,0」
一時画像とはイメージ。その可視はオフ。
保存画像とはイメージ。その可視はオフ。
一時画像の画像は対象ファイル。
母艦のサイズ変更した時は
  対象画像の画像は空。
  対象画像の幅=一時画像の幅。
  対象画像の高さ=一時画像の高さ。
  一時画像を対象画像の0,0へ画像コピー。
  対象画像を(母艦の幅),(母艦の高さ)で、
  画像比率変えずリサイズ。
母艦のサイズ変更した時。
範囲とはトラック。
そのサイズは「0,0,{画像W},{画像H}」
範囲のダブルクリックした時は
  保存画像の幅は範囲の幅。その高さは範囲の高さ。
  対象画像の(範囲のX),(範囲のY),(範囲の幅),(範囲の高さ)を、
  保存画像の0,0へ画像部分コピー。
  F=「PNG|*.png」の保存ファイル選択。
  もし、F=空ならば、戻る。
  保存画像をFへ画像保存。
範囲を最前面。
#-----------------------------------------------------------------------

絵を動かしてみる

それでは、時計だけが表示されていた待ち受けFlashに、もう少し動的な要素を組み込んでみようと思います。

Main.as を以下のように書き換えると、以下の画像の位置とサイズを次第に大きくしたり、小さくしたりを繰り返すようになります。

class Main
{
    public static function main(swfRoot:MovieClip):Void
    {
        // --- 時計 ---
        var clock_txt:TextField;
        swfRoot.createTextField("clock_txt", swfRoot.getNextHighestDepth(),
                                10, 10, 200, 50);
        clock_txt = swfRoot.clock_txt;
        clock_txt.textColor = 0xFFFFFF;
        // --- 毎フレームの処理 ---
        var v   = 1;
        var dir = 1;
        var speed = 1.3;
        var w = swfRoot.pic_mc._width;
        var h = swfRoot.pic_mc._height;
        swfRoot.onEnterFrame = function() {
            // 時計
            var d:Date = new Date();
            clock_txt.text = d.getHours() + ":" + d.getMinutes() + ":" +
                             d.getSeconds();
            // 画像を拡大する
            // 位置の変更
            swfRoot.pic_mc._x  = (240 - w) / 2;
            swfRoot.pic_mc._y  = (240 - h) / 2;
            // サイズの変更
            swfRoot.pic_mc._width  = w;
            swfRoot.pic_mc._height = h;
            w = w + dir * speed;
            h = h + dir * speed;
            v = v + dir;
            if (v <= 0 || v > 100) {
                dir = dir * -1;
            }
        };
    }
}

画像オブジェクト(ムービークリップ)のサイズを変更するには、_width と _height を変更します。位置を変更するには、_x と _y を変更します。

ただし、ActionScript で、連続でムービークリップのサイズ変更するときなどに、for 文を使うと、最後の状態だけが反映されて経過を見ることはできません。例えば、以下のように記述して実行したとします。

for (var i = 0; i < 300; i++) {
    swfRoot.pic_mc._x = i;
}

これは、pic_mc._x には、for 文の最後の値、299 が代入されて終わり、繰り返しの経過を目で確認することはできません。

それでは、どうすれば、良いのかと言うとフレームの書き換え時に呼ばれる「onEnterFrame」イベントで処理します。このイベントの中で、カウンタを加算することにより、オブジェクトの移動を表現できます。

var i = 0;
swfRoot.onEnterFrame = function() { // ... フレームの書き換え時のイベント
    if (i < 300) {
        swfRoot.pic_mc._x = i++;
    }
}

ActionScript2.0 を学ぶにはどうしたら良いか?

ここまでで、なんとなく、ActionScript2.0 を使って、絵を動かしたり、テキストを設定する方法を紹介してきました。しかし、断片的な情報で、ActionScript2.0 のことが、よく分からないという方も多いと思います。

最新の ActionScript のバージョンは、3.0 で、FlashLite で使う ActionScript2.0 とは、またちょっと違った物になっています。そこで、役立つのが、Flash 8以前の資料です。Flash MX 2004 や、Flash 8 に対応したものなら、ActionScript2.0 用です。これは、そのまま、FlashLite 2/3 に対応できます。

また、ActionScript は、JavaScript と互換性があるので、JavaScript が分かる方なら、Adobe にある ActionScript 2.0 の資料に目を通すだけで、その大まかな部分を掴むことができると思います。

まとめ

以上、簡単ながらフリーソフトの、MTASCとswfmillを利用して、FlashLite 2/3 対応の SWFファイルの作り方を紹介しました。

デザインにこだわりたい人は、Adobe Flash を利用して作る方が生産性は高いと思います。しかし、この連載で紹介したように、画像を表示したり、それをちょっと動かすだけのものや、ゲームを作るなら、Adobe Flash よりも、MTASC を中心にスクリプトを書いた方が効率が良い場合もあります。

FlashLite の表現力では、制約も多くあまり重厚なアプリケーションは作れませんが、ちょっとしたゲームや簡単なツールなどを作るのにはぴったりです。フリーではじめられる利点を活かして、ぜひ、何か作ってみてください。

Series Navigation«待ち受けFlashを作る

執筆者紹介

クジラ飛行机

クジラ飛行机

くじらはんど(http://kujirahand/)にて、日本語プログラミング言語「なでしこ」(IPA未踏ユース採択)、テキスト音楽「サクラ」(OSPオンラインソフト大賞入賞)など多くのオンラインソフトを開発。著書に「Flexプロフェッショナルガイド」「なでしこ公式バイブル」、「一週間でマスターするActionScript3.0」など。

TrackBack URL :