はじめまして、カヤック新人FDのナカムラと申します。
まだ右も左もわからないヒヨッコですが、作業中に出てきたネタや試作、Tips等の記事を書いていこうと思っています。どうぞよろしくお願いします。

さて、ここ1ヶ月ほど、携帯用Flashの制作でFlashLite1.1を触り始めています。
FlashLiteで作られたコンテンツといえば、日本を席巻しかねない勢いで人気急上昇中の珍感覚ペット「コンチ」などが挙げられ、携帯Flashには必須の言語です。

しかし、FlashLite1.1はFlash4時代のAS1相当の仕様で、その独自の実装に幾度もつまづかされてきました。 今回は一発目という事で、これまでの制作でつまづいた点とその回避策を書いてみようと思います。それではどうぞ!

数値とストリングの評価の違い

FlashLiteを使い始めて間もない頃、携帯から数字を入力する機能でつまづいたこと。
未入力(入力漏れ)を判断するため、変数にストリングが入力されていない状態を除外する

if ( inputTxt != "" ) {

という条件式を最初使ってました。

が、この評価の仕方では、変数に0が入っている時もnull扱いになり、条件に合致しない事になってしまいます。 当時文字列比較の演算子の存在を知らなかったのでムダにはまってしまいましたが、ストリングが「無い」事を評価する時は

if ( inputTxt ne ""; ) {

という風にしましょう。
ちなみにストリングの等価を評価する場合は

if ( inputTxt eq "String"; ) {

となります。
また、aragaさんからのTipsで

if( length( inputTxt ) != 0 ) {

とすれば、変数の内容に関わらず、値があるかどうかを評価できます。

ループ内におけるtellTarget使用時の、インデックス変数のパスに注意!

ステージ(ルート)上に置いてある複数個のMC(_targetMc)と、MC(stackedMc)内に入れ子にしてある複数個のMC(_innerMc)に、同時にアクセスしたい時があります。
何も考えずに、forループの中にそれぞれのMCにアクセスするコードを書くと

for( i = 0; i < objNum; i++ ) { eval( "_targetMc" add i )._y = 50 * i; tellTarget( "stackedMc/_innerMc" add i ) { _y = 50 * i; } }

とかになりますが、これでは通りません。

for( i = 0; i < objNum; i++ ) { eval( "_targetMc" add i )._y = 50 * i; tellTarget( "stackedMc/_innerMc" add i ) { _y = 50 * _root.i; } }

という感じで、"i"などのインデックス変数のパスをループ実行元に通す必要があります。

duplicateMovieClip実行直後の、tellTargetの不審な挙動について

自身のタイムラインにアニメーションを持ったMCをduplicateで複製し、直後に実行する場合、

duplicateMovieClip( "mc", "_mc", depth ); tellTarget( "/_mc" ) { play(); }

という風にやりますが、なぜかこれだとMCのタイムラインが動きません。
他のフレームにgotoAndPlay()してもダメ。

あまりの謎の挙動に、FlashLite実装経験豊富な弊社Flasherのchitose君に相談した所、彼の行っている回避策は…

MCの2フレーム目にplay()を書いて

tellTarget( "/_mc" ) { gotoAndPlay( 2 ); }

とする、でした。なんという匠の技。

この3つ目に関しては、今もって原因不明なので、根本的な解決策をご存知の方がおられましたらご一報頂けると幸いです。

では、一発目はこんな感じで。
今後もどうぞよろしくお願いします。

(※2009.05.28追記:文中のchitose君より指摘のあった分かりづらい表記等を修正しました。
不審なコード等ありましたら遠慮なくご指摘ください!)

HTML5飯