質問: 2) { ........ と書いてレイヤーmaru1とレイヤーmaru2の指定フレームへ移動しムービー再生後にソートプログラムへ戻り次の処理へ移るようにしたいのですがwhile文でflagを使い処理を待たせることを考えたのですがflashは非同期であるためflagの値のやり取りが上手く行きませんでした。 タイミング処理においてコールバック関数というものがあるという所に行き着いたのですがプログラムがあまり得意でなくイマイチ理解することができません・・。 flash mxで処理を待機させておくといったことを実現するにはどのように対処するといいのでしょうか? 何かアドバイスください。お願いします。
回答: #1&2 です。 >> if文通りに処理されなく、 >> タイムラインに書かれた順番で >> ムービーが再生されてしまいました・・・・。 >> なぜそうなってしまったのか、わからないのですが・・・・? と言われましても,こちらも flaファイル が見えない以上, どういう状況かが全くわからないので,わかりませぬぅ... 困った。 (flaファイル を見てもわからない可能性は大ですが。) とりあえず, 第一の最低条件は, flash は 本来アニメーションソフトですから, メインムービー( _root )も,ムービークリップも, stop(); など止めるスクリプト何処かに書いておかなければならないということです。 何かそれらしいことを何処かに書かないと, それぞれのタイムラインは,表示と同時に再生しはじまめす。 (フレームが 1フレーム しかないときだけは話が別です。) 次の最低条件は,オブジェクトのあるなしです。 例えば,100フレーム のメインムービーがあったとして, 50フレーム目から maru1 というムービークリップが登場したとします。 メインムービーの 1フレーム目で, maru1.gotoandplay(2); と書いても, 1フレーム目では,まだ maru1 というオブジェクトは存在していませんから,に命令は届きません。 仮に(超仮にで,実際はないことです。), maru1 が gotoandplay(2); したとしても,50フレーム目まで行かないとそれは確認できませんから, 確認した時には,maru1 は,どこか別のフレームに移動しているでしょう。 ここまでが最低条件で, ここまでではたいていの方はミスしませんし, ミスしてもだいたいすぐに気づきます。 多くの方が,最もミスに気づかず詰まるポイントはパス(階層(住所))です。 変数や関数には,それらが存在するパス(階層(住所))があります。 パスがあるからこそ,分類や場合分けができるので大変便利なのですが, このパスの問題で詰まる方が多いようです。 「flashで,思うように動かないのはパスが原因だと思え。」 と,よく言われます。 パスとは,ムービークリップ間でのお互いの住所と思って良いと思います。 実は,メインムービー( _root )も1つのムービークリップです。 #2では,階層は1つしか増やしていませんが,実は無数に階層は増やせます。 簡単に言うと,ムービークリップの入れ子はいくらでもできるということです。 (当然限度はありますが,先に人間の階層管理や記憶の方が限界が来るでしょう。) 「f-site ターゲットパス」 参考url: http://f-site.org/articles/2002/01/26153958.html こちらの都合したものばかりで,大変申し訳ありませんが, #2 の 少しだけ延長を作りました。 単なる簡単な例です。 メインムービーは相変わらず, □ レイヤー 筆・・|●| のままで,その上にレイヤーを1つ追加します。 (追加しなくても良いと言えば良いのですが スクリプトを書くレイヤーは分けた方が 都合が良い場合が多いです。) □ レイヤー 筆・・|○| □ レイヤー 筆・・|●| 上の空白キーフレームにスクリプトを書きます。 ---------------------------------- // maru1を移動させる関数pofmaru1 function pofmaru1(l) { // l が 1 だったら maru1 を フレーム2 へ if (l == 1) { _root.maru1.gotoandplay(2); // l が 2 だったら maru1 を フレーム15 へ } else if (l == 2) { _root.maru1.gotoandplay(15); } } // maru2を移動させる関数pofmaru2 function pofmaru2(r) { // r が 1 だったら maru2 を フレーム2 へ if (r == 1) { _root.maru2.gotoandplay(2); // r が 2 だったら maru2 を フレーム20 へ } else if (r == 2) { _root.maru2.gotoandplay(20); } } ---------------------------------- これは最初に, pofmaru1,pofmaru2 を定義しているだけです。 そしてインスタンス名 maru1 の フレーム1 のスクリプトには --------------------- stop(); --------------------- と書きます。 上記,「第一の最低条件」で書いたことです。 これで, maru1 は勝手に進み出しません。 そして, インスタンス名 maru1 の 最終フレーム のスクリプトは ---------------------------------- stop(); r = math.floor(math.random()*2)+1; _root.pofmaru2(r); ---------------------------------- のように書きかえます。 変数r にランダムな 1 か 2 を入れ, その r を持って, _root の pofmaru2 という関数を実行する。 ということです。 pofmaru1,pofmaru2 は _global な関数で定義していないのでここにもパスが必要です。 http://www.fumiononaka.com/technotes/flash/fn0205003.html また,ここの変数r は, _root の 変数r ではありません。別物の r です。 メインムービーの 変数r をあえてパス付きで書くと, _root.r です。 このムービークリップの r はパス付きで書くと, _root.maru1.r です。 この,_root.maru1.r を持って, _root の pofmaru2 を実行します。 そしてインスタンス名 maru2 の フレーム1 のスクリプトにも --------------------- stop(); --------------------- と書きます。 そして, インスタンス名 maru2 の 最終フレーム のスクリプトは ---------------------------------- stop(); l = math.floor(math.random()*2)+1; _root.pofmaru1(l); ---------------------------------- のように書きかえます。 これで,パブリッシュしても, 関数を定義しただけで,maru1 も maru2 もストップしたままなので, 何にも起こりません。 最初の1歩を進ませるものが必要です。 そこで,メインムービーの フレーム1 にボタンを作ります。 何でも良いので塗りで ■ を書いて,ボタンシンボルに変換します。 そして,そのボタンシンボルには以下のように書きます。 -------------------------- on (release) { a = 1; pofmaru1(a); } -------------------------- 回りくどいスクリプトですが,これで, pofmaru1(1); が実行されます。 つまり,if の分岐により _root.maru1.gotoandplay(2); が実行されるということです。 ボタンシンボルは階層を持ちません。 _root にあるボタンなので,pofmaru1(); で _root の pofmaru1(); が実行されます。 これが,ムービークリップとの大きな違いです。 とうぜん, _root.pofmaru1(); でも良いです。 urlのパスと同じで,絶対パスでも相対パスでも良いです。 変数 a にしたのは特に意味はありません。 それと,ボタンをわざわざ用意したのは,階層の説明をするためでもありますが, フレーム1 に書いた function の下に, pofmaru1(1); を付け足しても動かなかったからです。 完全にオブジェクト,つまり maru1 と maru2 が認識される前に pofmaru1(1); が実行されるからだと思います。 メインムービーのタイムラインを 2フレーム にして, フレーム2 に, stop(); pofmaru1(1); と書けば,pofmaru1(1); は動作しました。 1行目に stop(); と書いたのは, ムービーがループされるとまずいからです。 メインムービーが2フレームだけでできていたとすると, stop(); を書かないと フレーム1 と フレーム2 を行ったり来たりしてしまいます。 すると,フレーム2 に戻るたびに pofmaru1(1); が実行されるので, _root.maru1.gotoandplay(2); がしょっちゅう実行されます。 つまり,maru1 が 3フレーム目に進もうにも,すぐに 2フレーム目に戻されてしまいます。 とにかく,flash では時間軸で次々何かが起こるので(起こせるようにしてあるので),その辺の慣れや推測も必要です。 というか,最初から普通のアニメーションを作っていると,別に何でもないことなのですが, いきなり難しいことをしようとすると,妙なところで詰まってしまうと思います。 ちょっとずつ順を追ってするほうが早道だと思いますよ。 いつか書かれていた, 配列の順序を並び替えて,それによって l や r を得て... というのにはほど遠いとは思いますが, これがなんとか回答できる限度です。