- 締切済み
Flash for文の修正
こんにちは. 今回は自分で書いたfor文の修正をお願いしたく書き込みました. for(i=1; i<=20; i++){ _root["btn"+i].onRelease = function() { _root.screan.loadMovie("loadmc"+i+".swf"); }} この記述の場合,ボタンを押してロードされるswfは,"loadmc21.swf"を選択しようとします.btn15をクリックしたらloadmc15.swfがロードされるように作りたいのです. そして,loadmcの指定を再度行うことも試してみました. for(i=1; i<=20; i++){ _root["btn"+i].onRelease = function() { for(j=1; j<=20; j++){ _root.screan.loadMovie("loadmc"+j+".swf"); }}} この場合は,loadmc1~20すべてをロードしようとします. iとjの相互関係を示したスクリプトが必要なのでしょうか?
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- DPE
- ベストアンサー率85% (666/776)
onRelease などのイベントハンドラに登録する関数の中でターゲットパスを省略して指定した変数や関数・インスタンスは、登録する関数の持ち主のものと見なされます。 ご提示のスクリプトが仮にメインのタイムラインに記述されているとすると、onRelease = function 内にある変数 i や j は、この関数が定義されているメインのタイムライン、つまり _root のものと判断されます。 前者のスクリプトですと、for ループで btn1 ~ btn20 までの onRelease イベントハンドラに関数が登録され、ループ終了時には i の値は 21 になっています。 ボタンをクリックした時に呼び出される関数はいずれも、ループカウンタとして使った i の値を見て loadMovie を実行するようになっているため、どのボタンをクリックしても loadmc21.swf を読み込もうとしてしまいます。 ボタンとファイルに”共通の名前+通し番号”で名前を付け、対応する番号のファイルを読み込む方法はいろいろあります。 簡単なところで、各ボタンにそれぞれ変数を作ってボタンごとの番号を記録しておき、この番号を見ながらファイルを読み込む方法はいかがでしょう。 スクリプトにしますと、次のようになります。 このスクリプトは、ボタンを配置したタイムラインのフレームに記述してください。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください) /*******************************************************/ for( i = 1 ; i <= 20 ; i++ ) { //ボタンの番号を各ボタンに記録 this[ "btn" + i ].no = i; //クリック時、番号に応じたswfファイルを読み込む this[ "btn" + i ].onRelease = function() { _root.screan.loadMovie( "loadmc" + this.no + "swf" ); }; } /*******************************************************/ onRelease = function の中で this.no = i; と書くと、結果的にはループ終了時の i の値を変数に記録することになってしまうので意味がありません。 ループ中の i の値を記録するには、onRelease = function の外で変数を作り、その時の i の値を保存します。 イベントハンドラに登録される関数の中での this は、イベントハンドラの持ち主を指します。 上記の例ですと、onRelease = function 内の this は、それぞれのボタン( btn1 ~ btn20 )を指します。 従って、this.no で、先ほど各ボタンに保存しておいた i の値であるボタンの番号を取得できます。 this は”自分自身”を指す表現ですが、使う場所によって”自分自身”を誰と考えるかが変わってしまうというクセモノです。 ActionScript では自分自身を指すターゲットパスを省略できますけれど、省略した時と this が指す対象が違う場合もあります。 this を付けても付けなくても同じ場合もあれば、this がないと上手くいかないもの、逆に this を付けたために正確に対象を指定できなくなる場合もありますので、ご注意ください。 ---------------------------------------------------------- 上記のスクリプトは、btn1 ~ btn20 がボタンシンボルのインスタンスでも動きます。 しかし、ボタンシンボルはタイムラインがなく1つの階層と見なされないので、本来は変数・関数・他のムービークリップ等のインスタンスを子として持つことができません。 スクリプトの書き方でボタンシンボルが変数などを持っているように見せかけることはできるものの、厳密に言うなら、変数を内部に持たせたい場合はボタンをムービークリップシンボルで作るべきなのかもしれません。 今回は番号を記録する方法を使いましたが、ボタンの名前から番号を抽出して読み込む方法もあります。 機会がありましたら、こちらも研究してみてください。
お礼
ご解決ありがとうございます! 変数に記録する方法は勉強になりました! 何度か使ったことはあったんですけど, これからも自分でいろいろ応用してみたいと思います. ありがとうございます.