AS3の配列の中にアクセス

このQ&Aのポイント
  • FlashCS3でAS3を使用している場合、配列の中にアクセスする方法について質問です。
  • 配列に格納したボタン全てに同じマウスアクションを追加したい場合、どのように実現できるか教えてください。
  • 現在の試みでは上手くいっていないようです。別の方法があればお教えください。
回答を見る
  • ベストアンサー

AS3の配列の中にアクセス

FlashCS3でas3を使っています。 配列についての質問なのですが、 下記のコードがあるとします。 var btn_arr:Array=[aboutA_mc,aboutB_mc,aboutC_mc,aboutD_mc]; 配列に格納したボタン全てに、同じマウスアクションをつけたい場合など、 for (var i:int = 0; i<btn_arr.length; i++) { btn_arr[i].addEventListener(MouseEvent.Roll_Over,abcdOver); } function abcdOver(e:MouseEvent):void { btn_arr[i].textColor = #FFFFF; とかで、出来るかなと思ったのですが、上手くいきません。 何か良い方法があれば、ご教授よろしくお願いいたします。

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

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

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

#1 & #2 です。 > 実際には、 > > function abcdOver(e:MouseEvent):void > { > var c:ColorTransform = new ColorTransform(); > c.color = (0xCCCCCC); > e.target.transform.colorTransform = c; > } > > にしたかったのですが、これは駄目でした。 駄目とはどういう状態なのでしょうか? (駄目じゃないとはどういう状態なのでしょうか?) 他のものを除くと スクリプトは次のようにするということですよね? -------------------------------- var btn_arr:Array = [aboutA_mc,aboutB_mc,aboutC_mc,aboutD_mc]; for (var i:int = 0; i<btn_arr.length; i++) { btn_arr[i].buttonMode = true; btn_arr[i].addEventListener(MouseEvent.ROLL_OVER,abcdOver); } function abcdOver(e:MouseEvent):void { var c:ColorTransform = new ColorTransform(); c.color = (0xCCCCCC); e.target.transform.colorTransform = c; } -------------------------------- もっとも c.color = (0xCCCCCC); ではなく c.color = 0xCCCCCC; だとは思いますが この場合は ( ) があっても意味は変わりませんからこのままでも良いです。 うまく行っていると思いますが【添付図】↓     と言いますか,【添付図】の場合は ただ単に var c:ColorTransform = new ColorTransform(); c.color = (0xCCCCCC); aboutB_mc.transform.colorTransform = c; と書いたときと変わらないということです。 (for文 や 配列 などを使おうが使わまいが同じ結果になる。)=(問題ない。)

shin0514
質問者

お礼

ありがとうございます。 上手くいきました!昨日は何か勘違いしてたのかもしれないです。。。 ここ最近、色々回答していただきありがとうございます! 本当に助かってます。 サイトは8割ほど完成しました。 残るはフォトギャラリーのみです。

その他の回答 (2)

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

#1です。 #1の件(スクリプトの意味がわからないの件)とは全く別に btn_arr[i].textColor = #FFFFF; これが何らかの形で仮に動作したとします。 これは ボタンMC クリック時に発生するイベントですよね。 ボタンMC クリック時には i という数値は 4 になって止まっているんです。 ココにも書きましたが。 http://okwave.jp/qa/q6607531.html > for (var i:int = 0; i<3; i++) > > のようにループされることになります。 > つまり > i=0 状態で 1回目ループ > i=1 状態で 2回目ループ > i=2 状態で 3回目ループ > i=3 状態になると 3 未満という条件が成立しないので > ループせずに for文 を抜けます。 今回の場合は > for (var i:int = 0; i<3; i++)  ↓ 「 for (var i:int = 0; i<4; i++)」 ですから 「 i=4 状態になると 4 未満という条件が成立しないので ループせずに for文 を抜けます。」 と書き替えることになりますが。 ですからどのボタンMCをクリックしても btn_arr[4].textColor = #FFFFF; が起こるわけです。 それが起こらないようにするために リスナー関数の引数 「e:MouseEvent」 を使ったり 場合によっては クロージャ を使ったり,MC内に固有の変数を作ってそこに固有の i の値を保存する というようなことをする必要が出てくるのです。

shin0514
質問者

お礼

ご指摘ありがとうございます。 転職するため、今月末には後任者にデータを引継ぎするので、コードは分かり易くまとまっているほうが良かったのです。 今のサイトは前任者から引き継いだもので、HTMLでCSSも使わずに作られたもので、訳が分からなかったので、自分で作ったほうが引き継ぎやすいと思いまして。。。 そもそも、本業は3dcgで、flashは初めてなので、かなりきついです。 とりあえずは、 for (var i:int = 0; i<btn_arr.length; i++) { btn_arr[i].n = i; btn_arr[i].buttonMode=true; btn_arr[i].addEventListener(MouseEvent.CLICK,abcdClick); btn_arr[i].addEventListener(MouseEvent.ROLL_OVER,abcdOver); btn_arr[i].addEventListener(MouseEvent.ROLL_OUT,abcdOut); } function abcdClick(e:MouseEvent):void { this.gotoAndPlay(lbl_arr[e.currentTarget.n]); for (var i:int = 0; i<btn_arr.length; i++) { btn_arr[i].addEventListener(MouseEvent.CLICK,abcdClick); } e.currentTarget.removeEventListener(MouseEvent.CLICK,abcdClick); } function abcdOver(e:MouseEvent):void { e.target.alpha = 0.8; } function abcdOut(e:MouseEvent):void { e.target.alpha = 1; } のように書けば、上手くいきました。 実際には、 function abcdOver(e:MouseEvent):void { var c:ColorTransform = new ColorTransform(); c.color = (0xCCCCCC); e.target.transform.colorTransform = c; } にしたかったのですが、これは駄目でした。 e.target.alpha = 1; や、 e.target.visible=false; はOKなのに、colorTransformは駄目なのには、何か条件があるのでしょうか。。。 引数やクロージャはまだ理解できていないので、もうちょっと頑張ってみます。

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

人間が見ても意味がわかりません。 PCならなおさらです。 for文 とか 配列 とか言う前にそれナシでやってみるべきでしょう? というかそれナシができてから質問すべきでしょう? for文 とか 配列 とか ナシ状態↓ aboutA_mc.textColor = #FFFFF; 何コレ? です。 スクリプトは別にまとまらなくても良いじゃないですか。 そんなことにこだわっているから何にもできないのではないでしょうか?

関連するQ&A

  • for文を使ったボタン

    for文を使ったボタン ボタンが2つあり、そのボタンをロールオーバー、ロールアウトでそれぞれ違うmcを動かしたいのですが、うまくいきません。ボタンを「maru1、maru2」として動かしたいmcを「btn1、btn2」とインスタンス名をつけて以下のスクリプトを書きました。 maru1.addEventListener(MouseEvent.ROLL_OVER,onMouse1); maru1.addEventListener(MouseEvent.ROLL_OUT,outMouse1); maru1.buttonMode = true; maru2.addEventListener(MouseEvent.ROLL_OVER,onMouse2); maru2.addEventListener(MouseEvent.ROLL_OUT,outMouse2); maru2.buttonMode = true; function onMouse1(e:MouseEvent):void{ mc_tween = new Tween(btn1, "scaleX", Elastic.easeOut, 0.7, 1, 1, true); mc_tween.start(); } function outMouse1(e:MouseEvent):void{ mc_tween = new Tween(btn1, "scaleX", Elastic.easeOut, 1, 0.7, 1, true); mc_tween.start(); } function onMouse2(e:MouseEvent):void{ mc_tween = new Tween(btn2, "scaleX", Elastic.easeOut, 0.7, 1, 1, true); mc_tween.start(); } function outMouse2(e:MouseEvent):void{ mc_tween = new Tween(btn2, "scaleX", Elastic.easeOut, 1, 0.7, 1, true); mc_tween.start(); } これでも動くのですが、ボタンが沢山あった場合にfor文を使ってできないかと考え、ttp://www.oro.co.jp/web/creator/flash/actionscript/soft-button.htmlを参考に var mc_tween:Tween; //イベント登録 for(var i:int = 1; i < 3; i++){ this["maru"+i].addEventListener(MouseEvent.ROLL_OVER, rollOverEvent); this["maru"+i].addEventListener(MouseEvent.ROLL_OUT, rollOutEvent); this["maru"+i].buttonMode = true; } function rollOverEvent(event:Event):void{ var btn:MovieClip = event.target as MovieClip; mc_tween = new Tween(btn, "scaleX", Elastic.easeOut, btn.scaleX, 1.5, 1, true); mc_tween = new Tween(btn, "scaleY", Elastic.easeOut, btn.scaleY, 1.5, 1, true); addChildAt(btn, 5); } function rollOutEvent(event:Event):void{ var btn:MovieClip = event.target as MovieClip; mc_tween = new Tween(btn, "scaleX", Elastic.easeOut, btn.scaleX, 1, 1, true); mc_tween = new Tween(btn, "scaleY", Elastic.easeOut, btn.scaleY, 1, 1, true); } と書いたのですが、上手く行きません。<var btn:MovieClip = event.target as MovieClip;>の部分でどのように「btn1、btn2」を参照したらいいのでしょうか。 作業環境はmacOSX flashCS5 actionscript3です。よろしくお願い致します。

    • ベストアンサー
    • Flash
  • AS3.0で、複数のボタンをaddChildを使って配置しマウスイベン

    AS3.0で、複数のボタンをaddChildを使って配置しマウスイベントをfor文でまとめて設定する場合で悩んでおります、現在の以下のようにコーディングしているのですが、 //ボタン数 const Btns:uint=3; //ボタン配置 for (var i:uint=1; i<Btns+1; i++) { var BtnName:String="btn0"+i; ->ボタンにつけたクラスネーム var BtnClass:Class=getDefinitionByName(BtnName) as Class; var btnMC:MovieClip = new BtnClass(); loadmc02.addChild(btnMC); (loadmc2はボタンを配置するMC) btnMC.buttonMode=true; btnMC.x=10*i+140*(i-1); btnMC.y=340; if (i==1) { btnMC.addEventListener(MouseEvent.CLICK, BtnOnClick1); btnMC.addEventListener(MouseEvent.ROLL_OVER, BtnRollOver1); btnMC.addEventListener(MouseEvent.ROLL_OUT, BtnRollOut1); } else if (i==2) { btnMC.addEventListener(MouseEvent.CLICK, BtnOnClick2); btnMC.addEventListener(MouseEvent.ROLL_OVER, BtnRollOver2); btnMC.addEventListener(MouseEvent.ROLL_OUT, BtnRollOut2); } else if (i==3) { btnMC.addEventListener(MouseEvent.CLICK, BtnOnClick3); btnMC.addEventListener(MouseEvent.ROLL_OVER, BtnRollOver3); btnMC.addEventListener(MouseEvent.ROLL_OUT, BtnRollOut3); } } です。BtnOnClick1~3は異なるURLでBtnRollOver1~3、BtnRollOut1~3は function Over(hikisu)、function Out(hikisu)という関数を作って、 function BtnRollOver1(eventObject:MouseEvent):void { Over(1); } function BtnRollOut1(eventObject:MouseEvent):void { Out(1); }てな感じで動かしたい。 2.0とかってが違うので悩んでいます。効率のよいコーディングの仕方を教えてください。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • 【AS3】配列を使って複数のボタンに別々のリンク先を指定するスクリプト

    【AS3】配列を使って複数のボタンに別々のリンク先を指定するスクリプトを教えてください。 配列を使って、btn1、btn2、btn3というインスタンスに それぞれ別のリンク先を設定したいと思っています。 実際には15個以上のリンクボタンを設置したいので、 配列を使ってできるだけ短いスクリプトにしたいです。 ---------------------------------------------- for (var i:int = 1; i < 4; i++) { this["btn"+i].addEventListener( MouseEvent.CLICK , onClick ); } function onClick( event:MouseEvent ) { var url:Array = new Array(); url[1]="http://www.yahoo.co.jp"; url[2]="http://www.google.co.jp"; url[3]="http://www.goo.ne.jp"; for(var i:int = 1; i < 4; i++){ if (this ["btn"+i]) { var link:URLRequest=new URLRequest(url[i]); var target:String="_self"; navigateToURL(link,target); } } } ---------------------------------------------- 上のように記述してみたのですが、全てのボタンが 配列一番最後のリンク先(url3)になってしまいます。 traceで「i」を出力してみると 1 2 3 と出るので、 for(var i:int = 1; i < 4; i++){}で 全て繰り返してしまっているらしいことはわかりますが どこをどう修正すればいいのかわかりません; 初心者で恐れ入りますが、易しくご教示いただけると幸いです。

    • ベストアンサー
    • Flash
  • AS3 mc0~5をまとめて処理する

    AS3初心者です。 forにてmc0~5をまとめて処理したいのですが、 下記スクリプトで、function内mc0の書き換え方が分かりません。 よろしくお願いします。 ///////////////////////////////////////// import fl.transitions.easing.Regular; import fl.transitions.TweenEvent; var twObj:Tween; for(var i:int=0;i<=5;i++){ this["mc"+i].addEventListener(MouseEvent.ROLL_OVER, hiraku); this["mc"+i].addEventListener(MouseEvent.ROLL_OUT, modoru); } function hiraku(eventObj:MouseEvent):void { //mc0を["mc"+i]としまとめて処理したい twObj=new Tween(mc0,"rotation",Regular.easeInOut,0,30,1,true); } function modoru(eventObj:MouseEvent):void { //mc0を["mc"+i]としまとめて処理したい twObj=new Tween(mc0,"rotation",Regular.easeInOut,30,0,1,true); } //////////////////////////////////////////

    • ベストアンサー
    • Flash
  • AS3のボタンアクションについて

    FlashCS3 ActionScript3.0 ボタンアクションでつまづいています。 http://www.cucinadicasamia.fr/ 上記サイトのように、ボタンをクリックすれば、ダウンの状態を保持、 他のボタンをクリックでダウンの状態を解除。 のようにしたいのですが、上手くいきません。 下記のようにコードを書いたのですが。。。 A_mc.addEventListener(MouseEvent.CLICK,Click); A_mc.addEventListener(MouseEvent.ROLL_OVER,Over); A_mc.addEventListener(MouseEvent.ROLL_OUT,Out); B_mc.addEventListener(MouseEvent.CLICK,Click); B_mc.addEventListener(MouseEvent.ROLL_OVER,Over); B_mc.addEventListener(MouseEvent.ROLL_OUT,Out); function Over(event:MouseEvent):void{ event.target.gotoAndPlay("B"); } function Out(event:MouseEvent):void{ event.target.gotoAndPlay("A"); } function Click(event:MouseEvent):void{ trace("click"); event.target.gotoAndPlay("C"); } A_mc.buttonMode = true; B_mc.buttonMode = true; /////////////////////////////////////////////////////////////////////// function Clickとfunction Overが同時に発生しているので上手くいかないのでしょうか。。。 ご教授お願いいたします。

  • ActionScriptで配列をクリアする方法を教えてください。

    ActionScriptで、オブジェクトを格納した配列をクリアする正しい方法を教えてください。 具体的には、 ・new Array() で配列を生成する。 ・new Object() で生成したオブジェクトを配列に格納する。 ・配列の中身を処理したあと、配列を一度クリアする。 ・配列に別のオブジェクトを格納する。 ような処理をしたいのですが、メモリリークを起こさずに配列をクリアするにはどうしたらいいでしょうか? 例えば、イメージはこんな感じです。(意味のないコードですが) // 配列の生成 var arr = new Array(); // 配列にオブジェクトを格納 for (var i = 0; i < 5; i++) { var obj = new Object(); obj.num = i; } // 配列のクリア arr.length = 0; // クリアした配列に別のオブジェクトを格納 for (var i = 0; i < 5; i++) { var obj = new Object(); obj.num = i * 2; } 上記のコードで、arr.length = 0; で配列をクリアしていますが、これで配列に格納されたオブジェクトが確保したメモリがすべて解放されるでしょうか? あるいは、配列の内容がなくなるまで pop() 等で取り出す等の処理をする必要があるでしょうか? 以上よろしくお願いします。

    • ベストアンサー
    • Flash
  • 配列のlengthの意味

    配列を作って以下のように作りました。 ==================================== var arr:Array = new Array(); arr[0] = "地球"; arr[1] = "太陽"; arr[2] = "月" arr["川"] = "rever"; arr["魚"] = "fish" arr["鳥"] = "bird"; trace(arr[0]);  //結果: 地球 trace(arr["魚"]);  //結果: fish trace(arr.length);  //結果: 3 →なぜ6ではない? ==================================== 連想配列3つと、普通の3つの2種類を arrという配列に入れたのですが、 lengthを調べると 3 と出ます。 連想配列というのは、 length には反映されないのでしょうか。 またその場合、連想配列の個数を調べるときは どのように書けばよいのでしょうか。 連想配列って、配列のどこに格納されているのだろう。。? と不思議に思ってしまいます。 ご存知の方いらっしゃいましたら、 何卒よろしくおねがいいたします。

    • ベストアンサー
    • Flash
  • 連番のインスタンス名をつけたMCの処理 (配列アクセス演算子)

    Adobe Flash CS3、AS3.0の環境で作成しております。 インスタンス名に、btn1~btn10までの連番で名前をつけたMCを、ドラッグ&ドロップできるようにしたいのですが、簡潔に設定を行いたいと思い、配列アクセス演算子を使用すればよいのでは、と思い、下記のように記述したのですが、ドラッグしようとした時点で、「TypeError: Error #1010: 条件は未定義であり、プロパティがありません。」のエラーが出ます。 //--------------------------------------------- for (var i=1; i<=10; i++) { this["btn"+i].buttonMode = true; this["btn"+i].addEventListener(MouseEvent.MOUSE_DOWN, down); this["btn"+i].addEventListener(MouseEvent.MOUSE_UP, up); } function down(eventObject:MouseEvent):void { this["btn"+i].startDrag(); } function up(evnetObject:MouseEvent):void { this["btn"+i].stopDrag(); } //--------------------------------------------- 問題切り分けのために、マウス操作があったときの動作を、単なるtrace等にしてみると問題なく動作するので、function~部分の  this["btn"+i] の記述が問題だというのはわかるのですが、ここの正しい記述方法がわからず、行き詰まっております。ご教示いただけませんでしょうか。

    • ベストアンサー
    • Flash
  • FLASH/一定時間停止後、再生されるscript

    flash CS4/ActionScript3.0にてサイトローテーションバナーを制作しております。 ムービークリップ「btn1_mc」をクリックするとフラッグ「scene1」を再生し、 「btn1_mc」にポインタが乗った時は一定時間停止し、再生されるという動きを作りたいのですが、初心者のため、うまくActionScriptが書けません。 setTimeout関数を使えば良いということはわかったのですが… 下記コードに書き加え、実装する方法を教えていただければ助かります。 よろしくお願いします。 btn1_mc.addEventListener(MouseEvent.CLICK,btn1Click); btn1_mc.addEventListener(MouseEvent.ROLL_OVER,btn1Over); btn1_mc.addEventListener(MouseEvent.ROLL_OUT,btn1Out); btn1_mc.buttonMode=true; function btn1Click(evt:MouseEvent):void{ gotoAndPlay("scene1"); } function btn1Over(evt:MouseEvent):void{ gotoAndStop("scene1"); btn1_mc.gotoAndStop(2); } function btn1Out(evt:MouseEvent):void{ gotoAndPlay("60"); btn1_mc.gotoAndStop(1); }

  • AS3 記述方法

    ボタンが複数存在し、それぞれのボタンの処理をまとめたい時に どうするか考えています。 たとえばステージに3つのボタンインスタンス 「btn1」「btn2」「btn3」があるとします。 クリックすると、それぞれに応じた値を得るために ------------------------------------------------------------- btn1.addEventListener(MouseEvent.CLICK,syori1); function syori1(eventObject:MouseEvent):void{ trace("あんぱん"); } btn2.addEventListener(MouseEvent.CLICK,syori2); function syori2(eventObject:MouseEvent):void{ trace("しょくぱん"); } btn3.addEventListener(MouseEvent.CLICK,syori3); function syori3(eventObject:MouseEvent):void{ trace("カレーぱん"); } ------------------------------------------------------------- としているのですが、 たとえばもしこれが100個のボタンがあれば 100回同じような事を記述しないといけないので あまりよろしくないな・・・と思い、 ------------------------------------------------------------- for(var i=1; i<=3 i++){ this["btn"+i].addEventListener(MouseEvent.CLICK,syori); } function syori(eventObject:MouseEvent):void{ trace("ジャム"); } ------------------------------------------------------------- としたのですが、これではどのボタンをクリックしても"ジャム"がトレースされます。(当然ですが・・・) このような時、まとめて記述するにはどうすればよいでしょうか?

専門家に質問してみよう