ActionScriptでの繰り返し記述をスッキリまとめる方法

このQ&Aのポイント
  • ActionScriptで繰り返し同じような記述をする場合、for文を使用することでコードをスッキリまとめることができます。
  • プログラムの内容は複数のインスタンスを表示してクリックで順次消えるというもので、インスタンスに記述ではなくフレームに記述しています。
  • この場合、for文を使ってインスタンスの配列を作成し、クリック時の処理を繰り返すことで、繰り返し記述をスッキリまとめることができます。
回答を見る
  • ベストアンサー

ActionScriptでの繰り返し記述をすっきりまとめたい

FLASHのActionScriptを勉強中です。 繰り返し同じ様なものを記述する場合、for文か何かを使うと思うのですが、以下の場合はどうすればいいのでしょうか? *プログラムの内容は複数のインスタンスを表示してクリックで順次消えるというものです。インスタンスに記述ではなく、フレームに記述しています。(イベントハンドラメソッド) this.b1.onRelease = function(){ _root.b1._visible = false; }; this.b2.onRelease = function(){ _root.b2._visible = false; }; this.b3.onRelease = function(){ _root.b3._visible = false; };      以下繰り返し… お詳しい方、よろしくお願いいたします。

  • Flash
  • 回答数3
  • ありがとう数4

質問者が選んだベストアンサー

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

for(i=1; i<○; i++) { } というfor文内に function があると、その function 内に 変数 i が到達しません。 したがって、例えば b1 の場合 this.b1.onRelease = function(){ _root["b"+i]._visible = false; }; と定義さます。 逆に、このように定義されないと、 (つまり変数 i が function内まで到達してしまうと、) ["b"+i] などを使った function が定義できなくなるので、使いにくくなると思います。 //--- 回避策1 ----------- // 各 b1 ~ bn に自分のインスタンス名を取得させ、 // _root 上の同名のインスタンスの // _visible プロパティを false にする。 for (i=1; i<=3; i++) { this["b"+i].onRelease = function() { _root[this._name]._visible = false; }; } // --- 回避策2 ----------- // 各 b1 ~ bn 内の任意の変数(例:j) に i を代入しておき、 // その変数の値を使って _root 上の["b"+this.j]インスタンスの // _visible プロパティを false にする。 for (i=1; i<=3; i++) { this["b"+i].onRelease = function() { _root["b"+this.j]._visible = false; }; this["b"+i].j = i; }

ikataro
質問者

お礼

できました!! 6時間もこの問題で悩んでいただけに感激もひとしおです。ありがとうございました。

ikataro
質問者

補足

<追加> いろいろ試してみた結果、 「b1、b2、b3 を押して x1、x2、x3 を消す」 などという場合は回避策1は使えず、回避策2になるようですね。 ちなみに、 this["b"+i].j = i; の意味ですが、「b1 のなかにある j は 1 、 b2 のなかにある j は 2 …」との定義と考えていいのでしょうか。 また、this["b"+i].j = i; はfor文の直後に書いてもいいのですよね?

その他の回答 (2)

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

#2で回答した者です。 > this["b"+i].j = i; > の意味ですが、 > 「b1 のなかにある j は 1 、 b2 のなかにある j は 2 …」 > との定義と考えていいのでしょうか。 そうです。 雰囲気からすれば、 b1 内に作った j というプロパティを 1 にする。 b2 内に作った j というプロパティを 2 にする。  …… というような感じです。 > this["b"+i].j = i; はfor文の直後に書いてもいいのですよね? 直後? 直後というのは、for文の後 と言う意味ではなく、 for文内の1行目 という意味でしたらそれで良いと思います。 私も書いてからそれに気付きました。 普通は変数は先に決めておいて、後から function を定義しますから、 書かれていらっしゃる通り、for文内の1行目に this["b"+i].j = i; がある方が自然だと思います。

ikataro
質問者

お礼

たびたびありがとうございます。 直後の意味はおっしゃるとおりです。 jがプロパティだったのは今気づきました。プロパティって自分で自由に作れるのですね。 勉強になりました!

  • is_may
  • ベストアンサー率65% (58/89)
回答No.1

私もあまり詳しくありませんがたしか for(i=1;i<10;i++){ this["b"+i].onRelease = function(){ _root["b"+i]._visible = false; } } でいけると思います。あまり力になれなくて申し訳ないm(_ _)m

ikataro
質問者

お礼

だめでした~。 (Tc_T`)

関連するQ&A

  • actionscript2.0から3.0へ、

    actionscript2.0から3.0へ、 actionscript2.0から3.0へ、 大変申し訳ございませんが、 どなたか書き換えていただけないでしょうか? 情報が足りない場合ご指摘くださいましたら 追記いたします。 flash8にて制作されたFlaをCS4にて修正しています。 3.0がわかるものが出来なくなってしまったので、 こちらに書かせていただきました。 400フレームのものなのですが、1フレームに下記のスクリプトがあります。 btnSkip.onRelease = function() { this._visible = false; gotoAndStop("end"); btnRepeat._visible = true; } 400フレーム目には下記のスクリプトがあります。 stop(); btnRepeat._visible = true; btnSkip._visible = false; btnRepeat.onRelease = function() { gotoAndPlay("start"); this._visible = false; btnSkip._visible = true; } みたところステージには、スキップとリピートのムービークリップがあります。 スキップをクリックすると、400フレーム目に飛んでストップ、リピートを押すと1フレーム目に戻って再生、という動作です。 修正前(2.0)は正常に動作していました。 これを3.0に書き換えていただきたいのです。 大変恐縮なのですが、大至急直さないといけないのです。。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • ActionScriptで対象外の音まで止まる・・・。

    フレームに以下のような記述をしたのですが動作が変です。初期段階で「oto1」が鳴っており、インスタンス「b1」をクリックで止まります。これは想定どおりの動作なのですが、「b2」をクリックしても止まるのです。これは理解できません。 何が誤りなのか教えていただけませんでしょうか? よろしくお願いいたします。 (インスタンス名は正しくつけています) oto1 = new Sound(); oto2 = new Sound(); _root.oto1.attachSound("s1"); _root.oto2.attachSound("s2"); _root.oto1.start(0, 99); this.b1.onRelease = function(){ _root.oto1.stop(); }; this.b2.onRelease = function(){ _root.oto2.stop(); };

    • ベストアンサー
    • Flash
  • 【ActionScript】この繰り返し記述は一般的でしょうか…?(for文)

    _root.box1._visible = false; _root.box2._visible = false; _root.box3._visible = false; ・・・ という記述を現状、 for(i=1; i<=10; i++){ _root["box" + i ]._visible = false; } というfor文で処理しています。 これ自体問題なく動作するのですが、この _root[ ] を使うあたりが「一般的な方法」なんだろうか?とふと思いました。 もしさらに一般的な方法があるのなら知っておきたいと思います。 お詳しい方、よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • ActionScriptで release と releaseOutside の合体記述

    FLASHのActionScriptにおいて、 on(release){… と on(releaseOutside){… を合体させると、 on(release, releaseOutside){… ですが、 this.hoge.onRelease = function(){… と this.hoge.onReleaseOutside = function(){… を合体させるとどうなるんでしょうか? かなり初歩的かもしれませんがお詳しい方、よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • ActionScript 孫のパス

    こんにちは。 今Flashを編集しているのですが、(初心者です) ┏━━━━━━━┓ ┃┌─────┐┃ ┃│ mc1_1    │┃ ┃└─────┘┃ ┃           ┃ ┗━━mc1━━━┛ mc~はムービークリップのインスタンス名です。 上のようにmc1の中にさらにmc1_1というムービークリップがある、という形です。 「_root.mc1.mc1_1.onRollOver~」のように指定したイベントが動きません。 (onReleaseも同様) 「_root.mc1.onRollOver~」は正常に動きました。 ただし、 「_root.mc1.mc1_1._visible = ~」のように書くと、ちゃんと動作していました。 この場合どういった原因が思い当たりますか? パスが間違っているんでしょうか… ちなみにCS3、ActionScript2.0です。 よろしくお願いします。

  • こんにちは。

    こんにちは。 flash初心者なのですが、actionscript2.0でわからないことがあります。 ステージ上のインスタンスをクリックしたとき、そのインスタンスの名前を取得する方法はあるのでしょうか。 やりたいこととしては、a,b,c・・・などの名前がついたインスタンスがステージに配置されているとき、aをクリックするとシーンaにジャンプし、bをクリックするとシーンbにジャンプする(以下同様)というスクリプトを書きたいと思っています。 a.onRelease = function(){ gotoAndPlay(a,1); } b.onRelease = function(){ gotoAndPlay(b,1); } などのように一つひとつ記述すればよいのですが、それぞれ構文は全く同じため、 「ひとまとめにして記述できれば短くできるなあ。クリックしたインスタンスの名前が取得できれば、それを変数に格納して、その後の処理に使えるかも!?」 と思った次第です。 素人考えかもしれませんが、ヒントをいただけるとありがたいです。

    • ベストアンサー
    • 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
  • インスタンス名の変更mcどうしのhittest

    お世話になります。Flash,actionscriptの初心者です。 現在actionscript2.0でちょっとしたFlashコンテンツを作っているのですが、解決できない ことがあり、ぜひお知恵を拝借できればと思います。 詳しくは添付図をご覧いただきたいのですが、 A1_mcとB1_mcのムービークリップをhittestで衝突判定させ、 B1_mcは見えないようにし、 A1_mcはgotoAndPlay(2)で2フレーム目にします(☆の絵)。 同時にthis._name="C1_mc"でインスタンス名を変更しました。 (ここまでは大丈夫で、trace(this._name)でも変更が確認できる。) 同じようにA2、B2、C2も設定しました。 そして、姿(○⇒☆)とインスタンス名(A⇒C)と変わった C1_mcとC2_mcをhittestで衝突判定させてD_mc(■)を見えるようにしたいのですが、 何も起きず、hittestが発動していないのではと思ってしまいます。 説明がわかりにくいと思うのですが、インスタンス名を変更した物どうしのhittestを うまく発動させるにはどうしたらよいか、教えていただきたいのです。 にわか知識のためFlashやactionscriptの根本的な問題を理解できてなさそうです・・・。 ちなみに何がやりたいかというと、○と○、○と☆ではお互いに反応しないが、 ○と◇が合体して☆になったもの同士(☆と☆)が接触すると、反応して■が出現する・・・ そんなFlashを作りたいのです。 自分の現状のやり方以外でこれが実現できるのなら、それでも大歓迎です。 長文になりましたが、ぜひともよろしくお願いいたします。 <参考・・自分の組んだAS> A1_mc.onEnterFrame = function() { if (this.hitTest(_root.B1_mc))     { _root.B1_mc.gotoAndPlay(2); //2フレーム目(空のキーフレーム)にとび、B1を消す this.gotoAndPlay(2);  //○⇒☆(2フレーム目)に姿を変える this._name="C1_mc"; //インスタンス名をA1_mcからC1_mcに変える     trace(this._name); //インスタンス名の変更を確認する。 delete this.onEnterFrame;     } else{ } }; A2_mc.onEnterFrame = function() { if (this.hitTest(_root.B2_mc))     { _root.B2_mc.gotoAndPlay(2); //2フレーム目(空のキーフレーム)にとび、B1を消す this.gotoAndPlay(2);  //○⇒☆(2フレーム目)に姿を変える this._name="C2_mc"; //インスタンス名をA2_mcからC2_mcに変える     trace(this._name); //インスタンス名の変更を確認する。 delete this.onEnterFrame;     } else{ } }; C1_mc.onEnterFrame = function() { if (this.hitTest(_root.C2_mc))     {     this.visible = false ; //姿を消す _root.C1_mc.visible = false; _root.D_mc.gotoAndPlay(2); //D_mcの出現(D_mcの1フレーム目は透明で見えなくしている。2フレーム目からアニメーションさせたいのでvisibleは使わない)     delete this.onEnterFrame; }   else{ } };

    • ベストアンサー
    • Flash
  • actionscriptで、変数に変数を使いたい場合

    お世話になります、actionscript初心者です phpでは以下のようにすれば変数に変数の使用が出来ますが --- function test ($num){ $pops{$num} = "aaa"; print ($pops15); } test("15"); // aaaと表示される actionscriptで変数に変数を使いたい場合 どのように記述すれば良いのでしょうか? 以下のようなsampleを組みましたが出来ませんでした --- function test (Num){ var Pops[Num] = "aaa"; trace(Pops[15]); } play_button.onRelease = function (){ test(15); // シンタックスエラーになってしまう } 変数に変数を使用 actionscript など、もろもろで検索したり 人が制作したactionscriptを参照しましたが、ほしい情報は出てきませんでした。 actionscriptにはphpのような変数に変数を使用できる便利な記述方法はないのでしょうか? 分かる方、お手数ですがご教授よろしくお願い致します。

    • ベストアンサー
    • Flash
  • actionscript3.0について教えてください。

    actionscript3.0について教えてください。 Flash CS4で、マウスオーバーすると画像が表示するものを制作しました。 (全レイヤー、1フレーム目のみで制作していました) そして最近その以前制作したものの直前に別のムービーを入れることになり、 画像のように1フレーム目から4フレーム目まであけました。 そしてもともとあったフレームをすべて5フレーム目に移動しました。 すると、エラーが出るようになりました。 5フレーム目に移動するとエラーが出るようになってしまったので、 試しに2フレーム目、3フレーム目など試しましたが同じくエラーが出ました。 エラーの内容は TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。 at test_fla::MainTimeline/frame5() です。 下記のスクリプトを上から二つ目のレイヤーに記述しています。 一番上のレイヤーには、stop();と記述しています。 超初心者のため説明不十分かもしれませんが、宜しくお願いいたします。 /*ボタン1 */ nav1txt_mc.visible = false; nav1_btn.addEventListener(MouseEvent.MOUSE_OVER,onMouseover); function onMouseover(e:MouseEvent):void{ nav1txt_mc.visible = true; nav1txt_mc.gotoAndPlay("nav1txt_mc"); } nav1_btn.addEventListener(MouseEvent.MOUSE_OUT,nondisplay); function nondisplay(e:MouseEvent):void{ nav1txt_mc.visible = false; } /*ボタン2*/ nav2txt_mc.visible = false; nav2_btn.addEventListener(MouseEvent.MOUSE_OVER,onMouseover2); function onMouseover2(e:MouseEvent):void{ nav2txt_mc.visible = true; nav2txt_mc.gotoAndPlay("nav2txt_mc"); } nav2_btn.addEventListener(MouseEvent.MOUSE_OUT,nondisplay2); function nondisplay2(e:MouseEvent):void{ nav2txt_mc.visible = false; } /*ボタン3*/ nav3txt_mc.visible = false; nav3_btn.addEventListener(MouseEvent.MOUSE_OVER,onMouseover3); function onMouseover3(e:MouseEvent):void{ nav3txt_mc.visible = true; nav3txt_mc.gotoAndPlay("nav3txt_mc"); } nav3_btn.addEventListener(MouseEvent.MOUSE_OUT,nondisplay3); function nondisplay3(e:MouseEvent):void{ nav3txt_mc.visible = false; } /*ボタン4*/ nav4txt_mc.visible = false; nav4_btn.addEventListener(MouseEvent.MOUSE_OVER,onMouseover4); function onMouseover4(e:MouseEvent):void{ nav4txt_mc.visible = true; nav4txt_mc.gotoAndPlay("nav4txt_mc"); } nav4_btn.addEventListener(MouseEvent.MOUSE_OUT,nondisplay4); function nondisplay4(e:MouseEvent):void{ nav4txt_mc.visible = false; } 宜しくお願いいたします。

    • ベストアンサー
    • Flash

専門家に質問してみよう