• 締切済み

アクションスクリプト2.0でfor文の出力結果

for (i = 1; i < 53; i++) { this["pad"+i].onRelease = function() { trace("pad"+i); }; } pad1~pad52というインスタンス名のムービークリップを配置します。 ムービークリップを押したときに各番号をtraceしたいのですが、 すべて"pad53"という同じ結果(出力)になってしまいます。 よくよく考えてみるとそうなってしまうな・・・ というのはわかるのですが、どこをどのように変更すれば よいのか思いつきません。。。 根本的に考え方が違うのでしょうか。 よろしくお願いいたします。

  • Flash
  • 回答数2
  • ありがとう数1

みんなの回答

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

ActionScript 2.0(1.0) の場合は ムービークリップのみならずボタンにも勝手なプロパティを与えることができます。 その性質(仕様)を使って 次のようにしても良いと思います。 ----------------------------------------------- for (i=1; i<53; i++) { this["pad"+i].num = i; this["pad"+i].onRelease = function() { trace("pad"+this.num); }; } ----------------------------------------------- === === === === === === === なお(大きなお世話だとは思いますがすみません。) #1の方のスクリプトを フレームに書く ActionScript 2.0 に翻訳すると次のようになります。 ----------------------------------------------- for (i=1; i<53; i++) { this["pad"+i].onRelease = createPrintTrace(i); } function createPrintTrace(x:Number):Function { return function ():Void { trace("pad"+x); }; } ----------------------------------------------- さらに ActionScript 1.0 に翻訳すると次のようになります。 ----------------------------------------------- for (i=1; i<53; i++) { this["pad"+i].onRelease = createPrintTrace(i); } function createPrintTrace(x) { return function () { trace("pad"+x); }; } -----------------------------------------------

  • hattorix
  • ベストアンサー率80% (4/5)
回答No.1

ひとつ関数を挟みましょう。 for (i = 1; i < 53; i++) {  this["pad"+i].onRelease = createPrintTrace(i); } } // ... 上記の処理を含むメソッドの終わり private static function createPrintTrace(x:int):Function {  return function():void {   trace("pad" + x);  }; }

関連するQ&A

  • 【action script】複数のMCを・・・

    環境:Flash8 actionscript2.0 10こ程度のムービークリップをそれぞれクリックした時に同じ動きをさせる文を1つにまとめることは可能でしょうか? ムービークリップそれぞれに mc1 mc2 mc3 …mc10 とインスタンス名をつけています。 さらにその下位層に mc1  └kai_mc mc2 └kai_mc ・ ・ ・ mc10 └kai_mc と置いています。 このそれぞれのムービークリップをクリックした際、その下位層のムービークリップを次のフレームに移動させたいと考えています。 それぞれ個別に書くと _root.mc1.onRelease=function(){ _root.mc1.kai_mc.nextFrame() } と書いていたのですが、ムービークリップの数を増やすかも知れずムービークリップの数分書くのは大変なので1つにまとめたいと考えています。 自分で以下のように書いてみました。 i=0 for(i=1; i>10; i++){ _root["mc"+i].onRelease.function(){ _root["mc"+i].kai_mc.nextFrame() } } うまくいかないので試行錯誤したりtraceで調べたりしたのですがどうもよくわかりません。 i=0 for(i=1; i>10; i++){ _root["mc"+i].onRelease.function(){ trace(i) } } で出力すると 11と表示されるのでpassが違うとは思うのですが・・・ iを1~10で指定しているのになぜ11となるのでしょうか? どうすればpass指定できるのでしょうか? そもそものやり方、考え方が違うかどうかも含め、教えて頂きたく質問しました。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • スクリプトをまとめて書くには

    Actionscript 2.0で作成しています。 例えばムービークリップaaa1~aaa10までと、bbb1~bbb10があったとして、 aaa1をクリックするとaaa1とbbb1が動く、というようなスクリプトを書きたい場合、 for( i = 1 ; i <= 10 ; i++ ){ eval("aaa"+i).onRelease = function(){ this.gotoAndPlay(2); _root.eval("bbb"+i).gotoAndPlay(2); } } としてもbbbの方が動きません。 iの値がeval("bbb"+i)の時点で11になってしまってます。 なので現状forを使わずに書いているのですが、 このような方法を簡単な記述で実現するにはどうすればいいのでしょう? それと、同じ動作を別のムービークリップにさせたい場合、 まとめて書くことはできますでしょうか? (例えばこれをまとめて書くとか) aaa.onRelease = function(){ _root.stop(); } bbb.onRelease = function(){ _root.stop(); }

    • ベストアンサー
    • Flash
  • 関数にカウント変数を随時代入したいのですが・・

    インスタンス名「typ1」から「typ17」までの連番のムービークリップのボタンがステージに配置されている状態でフレームアクション for (i = 1; i < 18; i++) { this["typ" + i].onRelease = function () { trace(i); xChangeSelType (i); }; } を行い、プレビューでボタンを押すときちんと動作しませんでした。 ためしにtraceアクションで何が代入されているか見ると一律「18」が代入されていました。 typ1のムービークリップをクリックしたときは xChangeSelType(1); typ9のムービークリップをクリックしたときは xChangeSelTyoe(9); を動作させたいのですが↑のコードをどう書き換えればいいでしょうか? ボタンが多いのでできればスクリプトでなんとかしたいのですが・・。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • ActionScript2.0のイベントについて

    親ムービークリップに配置した子ムービークリップのイベントが実行されなくて困っています。 親ムービークリップ自体には下記のイベントを設定しています。親ムービークリップはattachMovieで動的に配置しています。 onRollOver・・・onEnterFrameを設定 onRollOut・・・onEnterFrameを削除 子ムービークリップを配置して子ムービークリックにイベントを設定しました。onEnterFrameをは実行されますが、onReleaseが実行されず困っています。 function Parent() { this.onRollOver = function() { this.onEnterFrame = function(){・・・} } this.onRollOut = function(){ delete this.onEnterFrame; } this["child_mc"].onRelease = function() { trace('a') // 実行されない } this["child_mc"].onEnterFrame = function() { trace('b') // 実行される } } ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ _root.attachMovie("Parent", "parent_mc", _root.getNextHighestDepth(), new Parent()); 子ムービークリップはオーサリングで静的にParentに配置し、プロパティでchild_mcと設定しています。 onReleaseは実行できず、そこで止まっています。 なんでも良いので教えてください。

    • ベストアンサー
    • Flash
  • Flash着せ替え用アクションスクリプト

    はじめまして。 FlashCS3で、キャラクター(体)にドラックドロップで服を着せられるような"着せ替え"を制作したいと考えています。 現在はキャラクターの体部分にあたるムービークリプ(インスタンス名"target")と服ににあたるムービークリップ(インスタンス名"clothes0")をシーン上に配置し、 "clothes0"内に this.onPress = function () { this.swapDepths(++_root.depth); this.startDrag(); } // this.onRelease = function () { this.stopDrag(); } // this.onMouseMove = function () { updateAfterEvent (); } というスクリプトを書いて、一応ドラックドロップで服だけ動くような感じです。 服の"clothes0"を体である"target"に吸着させる方法をご存じの方がいましたら教えてください! いろいろ検索などして調べたのですがどうもうまくいきません。 参考になりそうなwebサイトなどもありましたら教えていただけると助かります! ちなみにまだアクションスクリプトを触りだしたばかりの詳しくない者です;

  • AS3.0でボタン処理をまとめて書くには?

    はじめまして。当方、最近プログラム的なものを始めたばかりで困っています。 例えばルートにbtn0,btn1,btn2という3つのムービークリップを置いたとして、 ボタンを押したらそれぞれのムービークリップ名をトレースするには、 AS2.0以前ではルートのフレームアクションで for (var i=0;i<3;i++){  _root.["btn" + i].onRelease = function{   trace(this._name);  } } といった感じでforループでまとめられると思うのですが、 3.0ではどうしたらよいのか見当もつかず困っています。 for (var i=0; i<3; i++) {  ["btn"+i]addEventListener(MouseEvent.CLICK,over); } このようにまとめてリスナーに登録したとしても、 リスナー関数が別になってしまうので、this.nameは使えず…はて。といったところです。 なにとぞご教示よろしくお願い申し上げます。

    • ベストアンサー
    • Flash
  • for & duplicateMovieClip & function

    for & duplicateMovieClip & function // == info用テキスト作成 ==================== /**/ var H_TextFieldInfo = _root.createTextField("I_textField",1001 ,10 ,10 ,690 ,20); _root.H_TextFieldInfo.text = ""; // 文字列を表示 テキスト表示テスト // == データ読み込み ============================== for(Hi=2; Hi<=10; Hi++){ H_name01 = "I_MC"+ Hi; H_gFX = I_MC01._width * Hi; H_gFY = 10; // ************ _root.I_MC01.duplicateMovieClip (H_name01, (201+Hi), {_x:H_gFX ,_y:H_gFY }); H_num = Hi; _root[H_name01].onRelease = function(){ _root.H_TextFieldInfo.text = H_num; } // ************ } ステージ上に I_MC01 というインスタンス名でムービークリップを配置して、上記のようなアクションスクリプトを書きました。for分の_root.I_MC01.duplicateMovieClip でI_MC01を複製し、その複製したムービークリップをクリックすると、テキストに番号が入力されるようにしたつもりなのですが、出来ませんでした。 いくつか思いつくことをやってみたのですが、出来ませんでした。 このようなときムービークリップをクリックすると、個別の番号をテキスト欄に表示させるにはどうしたらよいのでしょうか? ご教授よろしくお願いします。

    • ベストアンサー
    • Flash
  • onRelease文での動作について・・・。

    ムービークリップをボタンにして、その階層の最初のフレームに this.onRollOver = function() { this.onEnterFrame = this.nextFrame; }; onRelease=function(){ var num:Number=0 onEnterFrame=function(){ trace("LOOP num ="+num) num ++ if(num>30){ delete onEnterFrame } } } stop() 最後のフレームに this.onRollOut = function() { this.onEnterFrame = function() { if (this._currentframe > 1) { this.prevFrame(); } }; }; とした場合について質問です。 ボタン上にカーソルがある場合は30までカウントされます。 しかし、クリック直後にカーソルがボタン上から離れるとカウントが停止します。 ボタンから離れてもカウントを続けるにはどうすればよいでしょうか?? ちなみに、このスクリプトは簡単に流れが分かるように作ったものなのでfor文などではなくonEnterFrame~での対処法を教えて下さい。 実際にはonEnterFrame以下はもっと長くなっているので・・・。 どうかお願いしますっ!!! m(_ _)m

    • ベストアンサー
    • Flash
  • <Flash>ムービークリップにアクションスクリプトを記述できない。

    <ムービークリップ>インスタンスにアクションスクリプトを 記述するために、スクリプトペインを開くと、 「現在の選択範囲にアクションを割り当てることはできません」 と表示されます。 きちんとムービークリップ化していますし、 インスタンスも選択しています。 でもフラッシュを勉強して間もないので、 おそらく根本的ななにかに気づいてないのだと思います。 書籍に書いてある通りに作業を進めているのですが、 うまくいきません・・・。 書籍に付属しているサンプルデーターでは、 きちんとムービークリップにスクリプトが記述されています。 バカな質問になっているかもしれませんが、 宜しくお願いいたします。

  • for文で配置した物の個別取得【AS3.0】

    こちらにはいつもお世話になっております。 FLASHに関して詰まってしまったため、質問させてください。 前提: AS3.0、ライブラリにアイテムを一つ、クラスに”test”でリンケージ AS2.0を多少触り、3.0を勉強中です。 やりたい事: ムービークリップを3つ配置し、ロールオーバーでそれぞれの番号を出力したい。 やってみた事: for (var i:uint=1; i<4; i++) { var test_list:test = new test(); test_list.x = i * 50; test_list.num = i; this.addChild(test_list); test_list.addEventListener(MouseEvent.MOUSE_OVER,test_func); function test_func(e:MouseEvent) { trace(test_list.num); } } 結果: 現状ではどれをロールオーバーしても3を返してきます。 自分でも色々調べ、試してみたのですが、どうも上手くいきません。 当初は、ロールオーバーで拡大の様な動きをつけるつもりだったのですが、それ以前で詰まってしまいました。 これがうまくいった後に、個々にアクションを足すつもりです。 何卒よろしくお願い致します。

    • ベストアンサー
    • Flash

専門家に質問してみよう