HOME > Flash Memo > Flash Lite Memo for Flash MX Users

Flash Lite Memo for Flash MX Users

最終更新日 2006/8/16
何のページ?
Flash MX から ActionScript を始めた僕が Flash Lite (i mode用Flashの名前)を作るにあたって、つまずいたところやつまずいてるところのメモです。なので、Flash4からActionScriptをやってる人にはまったく不要なページです。あくまでも5やMXから入った人向けです。必要なものはDoCoMoとMacromediaからダウンロードしておいてくださいませ。いいかげんに書いていくので、用語の誤用なんかは気にしないでください。それかこっそり指摘して!
ちなみにhttp://www.grkt.com/に携帯でアクセスすると、今まで作ったFlashLiteが置いてありますよ。確認用にどうぞ。
QRCODE
MXとLiteどうちがうか
LiteはFlash4のActionScriptの機能限定版、みたいなものだそうです。主にマウスとサウンドに関するアクションが削られてるみたいです。(詳しくはこのあたりに。)このへんが最初の厄介。MXだと「MovieClip_mc.」って打ってから、アクションの頭文字を数文字打てば補完してくれるのに、Flash4のActionScript(以下Lite)だと一字一句打たないといけない。
_parent(相対パス)
_parent にあるムービークリップの _x の値を変更させたかったんです。で、書いたスクリプト

_parent.player_mc._x++;

エラーが出ました。それはFlash5からの書き方です、って怒られました。じゃあどうやって操作すればいいんだ!と思ってリファレンスを見てたら出てきたのが tellTarget。これは次の項で。
相対パスに関してもう少し。さっきの

_parent.player_mc._x++;

はダメなんだけど、

nPlayerX = _parent.player_mc._x;

とかって書くと値が取得できました。なんだこの統一感の無さは。

2005.01.29追記

上記の方法でも動くのですが、後になって Flash 4 時代の正しい記述方法がわかりました。詳しくはsetProperty と 変数 を御覧下さい。
tellTarget()
さあそれではtellTarget。書き方はこんな感じ。
tellTarget( 対象となるムービークリップ ){
〜スクリプト〜
}
DoCoMoAuthoringGuidelinesには
アクション。特定のタイムラインまたはムービークリップに指示を適用するために使用されます。たとえば、ステージ上でムービークリップを停止または開始するボタンか、特定のフレームにジャンプするように要求するボタンに、tellTarget を割り当てることができます。
とあります。ふむふむ。早速、player_mcの_xを1つずつ増やしていくスクリプトを書いてみました。
tellTarget(_parent.player_mc){
    _x++;
}
またエラー。なんでだ。書き方がまずいのかな?と思って _parent を _root に書き換えたりしてもダメ。ムムム。仕方が無いのでgoogle様の出番です。「tellTarget Flash4」だとかって検索してみたらこんな感じのスクリプトが出てきました。
tellTarget("/hoge"){
    _x++;
}
フガッ!なんだこれは。/ってのは_rootって事なんでしょうか。で、最初のスクリプトを変更。
tellTarget("/player_mc"){
    _x++;
}
上手く動きました。
eq ne
切符のはしっこを505用に移植している時の事です。変数 nNum が null だった時に処理を行う if 文を書きました。
if(nNum == null){
    〜スクリプト
}
実行してみると、「nullを使うにはFlash5以上でパブリッシュしろ」と言われます。仕方が無いので "" を使って、
if(nNum == ""){
    〜スクリプト
}
に書き換えて実行してみると、先ほどのエラーは出なくなりました。
よしよし、と思ってデバッグのためにしばらくいじっていると、どうも挙動がおかしい。nNum が null じゃないときもスクリプトが実行されています。なんだろうなーと思って、また DoCoMoAuthoringGuidelines を調べてみると、
eq ( 等しいストリング)
比較演算子。2 つの式が等しいかどうかを比較します。式1 が式2 と等しい場合にはtrue を返します。それ以外の場合はfalseを返します。このアクションはストリング固有のものです。
という項目が。なるほど、ストリング(文字列)はeqを使って比較するんですね。Flash5以降のスクリプトだと、数値も文字も == や != で比較できちゃうんで、僕みたいにMXから入った人は注意が必要ですね。さっきのスクリプトを書き直して、
if(nNum eq ""){
    〜スクリプト
}

ちなみに文字列で != を使う時には ne を使います。not equal でしょうか。
ne ( 等しくないストリング)
比較演算子。2 つの式が不等価かどうかを比較します。式1 が式2 と等しくない場合はtrue を返します。それ以外の場合はfalse を返します。このアクションはストリング固有のものです。
setProperty と変数
プロパティ(アンダーバーで始まるやつ。_x とか _visible とか)を変更する際には setProperty を使用します。
setProperty("/foo/baa",_x,fuga)
これで /foo/baa の _x の値が fuga になります。プロパティを取得する時には getProperty。
hoge = getProperty("/foo/baa",_x);
で hoge に /foo/baa の _x の値が代入されます。

ただ、これらはあくまでプロパティを取得設定するものなので、自分で設定した変数を取得する事はできません。
取得には、前記の _parent を使っても動くのですが、Flash 4 の正しい表記にしたいのであれば、
foo = /hoge/fuga:moge;
としてみましょう。
foo に_root.hoge.fuga.moge の値が代入されます。ルート(/)からたどって行き、目標の変数の前はコロン(:)になります。
ただ、演算子の / や : と見間違いそう…という人(僕)は _parent を使っても取得はできるので、それでも良いかもしれません。
文字の連結
文字列を連結するには + が使えません。そこで add を使います。
hoge = "fuga" add "moga"
これで hoge は "fugamoga" になります。

tellTarget 等で、ムービークリップの指定を動的にしたい場合もadd を使います。例えば
num = random(10);
tgt = "/game/enemy" add num;
tellTarget(tgt){
    _x++;
}
という感じ。
小数点以下の切り捨て
Flash lite には四捨五入や切り上げ切り捨てのアクションがありません。そこで int() を使います。
hoge = 3.14;
fuga = int(hoge);
fuga には 3 が入っています。小数を整数に型変換して切り捨てをしています。

2005.6.16 追記

KYUCON*BLOGさんの記事だと、どうやら Flash lite でも Math関数が使えるみたいです。これなら floor や ceil や round も使えると思います。やってみて。
eval でニセ配列
Flash lite には 配列がありません。僕も「必要な分だけ変数を用意しないといけないの!?」と思ってしまいましたが、eval を使うと解決します。
num = 10;
for(i = 0;i < num;i++){
    eval("array" add i) = random(10);
}
これで array0 〜 array9 に0から9までのランダムな数字が入ります。二次元配列が必要な時は
num = 5;
for(i = 0;i < num;i++){
    for(j = 0;j < num;j++){
        eval("array" add j add "_" add i) = random(10);
    }
}
これで array0_0 〜 array4_4 にランダムな数字が入ります。

ただし、この方法は DoCoMoAuthoringGuidelines で非推奨になっています。メモリとの兼ね合いで使って下さい。

2006.8.16追記
代入する時は eval() ではなく set() を使った方が良いそうです。参照は eval() でも良いとの事。ご指摘ありがとうございました。>edo さん
ということで、上の例を
num = 10;
for(i = 0;i < num;i++){
    set("array" add i,random(10));
}
みたいに置き換えるといいはず。試してみたら20%くらい速くなりました。ありがたい。
call の使用
Flash lite には function がないので、「同じスクリプトを色々なところに書いてしまって容量が足りなくなった!」という事もあるかもしれません。そこで call を使います。
call(フレームラベル名);
こう書くと、フレームラベル名で指定したフレームのアクションを実行します。フレームはどこにあってもいいので、メインの処理のループの後に余白を作ってそこに書いても良いです。ただ、引数や返り値がないために、タイムラインの変数を直接いじるしかありません。
油断すると大変な事になるかもしれません。
引数、返り値用の変数を用意すると比較的トラブルは少なくなります。

ちなみに、call で呼び出したスクリプトの中で call を使い、同じスクリプトを呼び出す事ができるので、eval のニセ配列 を上手く使って変数を上手に管理すれば、再帰ができるかもしれません。頑張れば、ぷよぷよ系の落ちゲーも夢じゃない…?
参考書
Menu
  1. 何のページ?
  2. MXとLiteどうちがうか
  3. _parent
  4. tellTarget()
  5. eq ne
  6. setProperty と 変数
  7. 文字の連結
  8. 小数点以下の切り捨て2005.06.16 追記
  9. eval でニセ配列
  10. call の使用
  11. 参考書

参考リンク
  • マクロメディアモバイル

ガラクタコージョー