• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:多次元配列のデータがうまく吸い出せません。)

多次元配列のデータの吸い出し方法について

このQ&Aのポイント
  • 多次元配列のデータがうまく吸い出せません。アクションスクリプトの簡素化を進めていますが、最終局面で行き詰っています。
  • ムービークリップと3つのボタンを配置し、ボタンをクリックしたらムービークリップの色が変わるプログラムを作成していますが、全てのボタンで同じ色に変化してしまいます。
  • 配列に色データを詰め込んで各ボタンに適用する処理を簡素化したいのですが、エラーになっています。どうすれば正常に動作させることができるでしょうか?

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

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

おそらく new ColorTransform( ) の ( )内に入れる引数を 勝手に配列だと決めていらっしゃるところが間違いなんだと思います。 colorTransDic[this["my_btn" + i]] = new ColorTransform(colors[i - 1]); これだと 「new ColorTransform( ) の 第1引数に colors[i - 1] 全部を入れて 第2引数~第8引数には何も入れない。」 ということになってしまいます。  ↓↓↓ new ColorTransform(colors[i - 1], , , , , , , ) つまり new ColorTransform( ) の 「第1引数には想定外の変なものを入れて, 第2引数~第8引数引数はデフォルトのまま。」 ということになりますから, 実際に次のような値が入ります。  ↓↓↓ new ColorTransform(NaN, 1, 1, 1, 0, 0, 0, 0) 動作的には次のように動きます。  ↓↓↓ new ColorTransform(0, 1, 1, 1, 0, 0, 0, 0) したがってどのボタンをクリックしても myMovieClip は new ColorTransform(0, 1, 1, 1, 0, 0, 0, 0) の色(赤が飛んだ色)にしかならないのです。       というわけで対処法です。 ◎ 対処法1 ご質問のスクリプトの次の部分を colorTransDic[this["my_btn" + i]] = new ColorTransform(colors[i - 1]); 次のように変えるのも1つの方法だと思います。 colorTransDic[this["my_btn" + i]] = new ColorTransform(colors[i - 1][0],colors[i - 1][1],colors[i - 1][2],colors[i - 1][3],colors[i - 1][4],colors[i - 1][5],colors[i - 1][6],colors[i - 1][7]); (↑改行無しの長い1行です。) ◎ 対処法2 ご質問のスクリプトの次の部分を //------------------------- var colors:Array = [[1,1,1,1,255,255,255,0],[1,1,1,1,122,122,122,0],[1,1,1,1,0,0,0,0]]; for (var i:int = 1; i<=3; i++) { colorTransDic[this["my_btn" + i]] = new ColorTransform(colors[i - 1]); this["my_btn" + i].addEventListener ( MouseEvent.CLICK , onClick ); } //------------------------- 次のように変えるのも1つの方法でしょう。 //------------------------- var colors:Array = [new ColorTransform(1,1,1,1,255,255,255,0),new ColorTransform(1,1,1,1,122,122,122,0), new ColorTransform(1,1,1,1,0,0,0,0)]; for (var i:int = 1; i<=3; i++) { colorTransDic[this["my_btn" + i]] = colors[i - 1]; this["my_btn" + i].addEventListener ( MouseEvent.CLICK , onClick ); } //------------------------- ◎ 対処法3 またはご質問のスクリプト全体を 次のように変えるのも1つの方法でしょう。 //------------------------- import flash.geom.ColorTransform; import flash.geom.Transform; var trans:Transform = new Transform(myMovieClip); var colorDic:Dictionary = new Dictionary(); var colors:Array = [[1,1,1,1,255,255,255,0],[1,1,1,1,122,122,122,0],[1,1,1,1,0,0,0,0]]; //ColorTransformのプロパティ名を配列に登録 var colorProp:Array = ["redMultiplier","greenMultiplier","blueMultiplier","alphaMultiplier","redOffset","greenOffset","blueOffset","alphaOffset"]; for (var i:int = 1; i<=3; i++) { colorDic[this["my_btn" + i]] = colors[i - 1]; this["my_btn" + i].addEventListener ( MouseEvent.CLICK , onClick ); } function onClick ( event:MouseEvent ) { var colorTrans:ColorTransform = new ColorTransform(); for (var i:int = 0; i < colorProp.length; i++) { colorTrans[colorProp[i]] = colorDic[event.currentTarget][i]; } trans.colorTransform = colorTrans; } //-------------------------   ActionScript ではありませんが 関連している内容の質問だと思われるURLです。 「JavaScriptでインスタンスを生成するときに、引数を配列の内容にするにはどうした... - Yahoo!知恵袋」 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1064279940

kohsuke_goo
質問者

お礼

早々のご指導感謝します。完璧なご指摘でどこが間違っていたか完全に理解出来ました。また丁寧に複数の対処法まで考えていただき本当に嬉しかったです。対処法2で進めることとさせていただきました。これから作業を進めていきますがまた行き詰った時は宜しくお願いします。この度はありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • アクションスクリプトを簡素化したいです。

    myMovieClipというムービークリップのカラーをmy_btn01、my_btn02、my_btn03という3つのボタンで 変化させるシミュレーターを作っています。下に書いたようにすれば動くのですが共通する文言が 多いのですっきりと簡素化したいです。実際はボタンが16個あり、色を変えるパーツも20くらいある のでファイルサイズも考慮して少しでも簡素化したいです。基礎的な質問で申し訳ないですが何卒 ご指導宜しくお願いいたします。 //以下アクションスクリプト タイムラインにべた書きしています(これもクラス?とかにできればと。) import flash.geom.ColorTransform; import flash.geom.Transform; my_btn01.addEventListener( MouseEvent.CLICK , onClick01 ); function onClick01( event:MouseEvent ) { var trans:Transform = new Transform(myMovieClip); var colorTrans:ColorTransform = new ColorTransform(1,1,1,1,0,0,0,0); colorTrans.redOffset = 250; colorTrans.greenOffset = 30; colorTrans.blueOffset = 0; trans.colorTransform = colorTrans; } my_btn02.addEventListener( MouseEvent.CLICK , onClick02 ); function onClick02( event:MouseEvent ) { var trans:Transform = new Transform(myMovieClip); var colorTrans:ColorTransform = new ColorTransform(1.15,1.05,0.85,1,0,0,0,0); colorTrans.redOffset = 244; colorTrans.greenOffset = 60; colorTrans.blueOffset = -178; trans.colorTransform = colorTrans; } my_btn03.addEventListener( MouseEvent.CLICK , onClick03 ); function onClick03( event:MouseEvent ) { var trans:Transform = new Transform(myMovieClip); var colorTrans:ColorTransform = new ColorTransform(1,2,1,1,0,0,0,0); colorTrans.redOffset = 0; colorTrans.greenOffset = 0; colorTrans.blueOffset = 0; trans.colorTransform = colorTrans; }

    • ベストアンサー
    • Flash
  • Flash MCのモーショントウィーン

    Flash CS5 ActionScript 3.0にて制作しています。 ムービークリップに動きをつけて色を変更するスクリプトを書いています。 ・ボタン1を押すとムービークリップの色が変わる ・ボタン2を押すと10フレーム目に飛んでモーショントウィーン それぞれ機能は正常に動くのですが、ボタン1を押した後にボタン2を押すとモーショントウィーンが動きません。 ボタン2を押した後にボタン1を押す場合は動きます。 ムービークリップのインスタンス名はtest として下記のようなスクリプトを書いています。 どなたか、お力をお貸し下さい。 よろしくお願い致します。 btn.addEventListener(MouseEvent.CLICK, black); black(event:MouseEvent):void { var color = new flash.geom.ColorTransform(0, 0, 0, 1); test.transform.colorTransform = color; } btn2.addEventListener(MouseEvent.CLICK, btn2); function btn2(event:MouseEvent):void{ gotoAndPlay("10"); }

    • ベストアンサー
    • Flash
  • Flash ボタンを押すとフォントカラーを変更する

    Flash CS5を使用しています。 action script3.0にてボタンを押すとフォントのカラーを変更できるようにしたいと思っています。 テキストのインスタンス名 text0 にして下記のようなスクリプトを書いたのですが 色が変更されません。 どのようにしたらよいか分かる方、お力を貸していただけないでしょうか? red_btn.addEventListener(MouseEvent.CLICK, fl_MouseClickHandler); function fl_MouseClickHandler(event:MouseEvent):void { var color_mtx = new flash.geom.ColorTransform(0.9, 0, 0, 1, 0, 0, 0, 0); text0.transform.colorTransform = color_mtx; }

    • ベストアンサー
    • 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
  • テキストフィールドかの色情報からムービークリップの色が変わるようにした

    テキストフィールドかの色情報からムービークリップの色が変わるようにしたいです。ActionScript3.0です。 ●colBox2というテキストフィールドがあり、bmpData(BitmapData型)という場所で取得したRGB色情報が表示されるようになっています。(例えば赤ならFF0000というように)。 var colBox2:TextField = new TextField(); colBox.x = 450; addChild(colBox2); ●bmpData上でマウスを上げたらその場所の色情報がcolBox2上に表示されて、colBox2上のテキストを読み取って、boardというムービークリップの色が変わるようにしたいのですが、エラーこそ出ないですが、boardの色は変わらないです。どうずれば変更できるのでしょうか?宜しくお願いします。 var colorTrans:ColorTransform = new ColorTransform(); var trans:Transform = new Transform(board); trans.colorTransform = colorTrans; copy.addEventListener(MouseEvent.MOUSE_UP,mouseUp) function mouseUp(evt:MouseEvent){ var pixelValue:uint = bmpData.getPixel(evt.stageX,evt.stageY); colBox2.text = pixelValue.toString(16);//取得したカラーを代入 colorTrans.color = "0x" + colBox2.text as uint; trans.colorTransform = colorTrans; }

    • ベストアンサー
    • Flash
  • 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
  • アクションスクリプト 

    下記のアクションスクリプトで徐々に目標値へ近づけたいのですが、 うまくいきません。 わかる方よろしくお願いします! btn.onRollOver = function() { clearInterval(myID); for (var i:Number = 1; i<=Max; i++) { if (this.id != i) _root["btn"+i].thumb._y = 0 _root["btn"+i].name_txt._y = 20; _root["btn"+i].frame_mc._y = -2; _root["btn"+i].frame_mc.transform.colorTransform = downColor; } else { this.thumb._y = -5 this.name_txt._y = 15              this.frame_mc._y = -6 } }

    • ベストアンサー
    • 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
  • 外部複数テキスト読み込みのについて

    外部複数テキスト読み込みのについて 写真のサムネイルボタンがあり、それをクリックすると外部の写真と、外部のテキストが読み込まれる物を作成しています。 サムネイルボタンが複数あるので、1つずつ表記するのではなくまとめたいと思って四苦八苦しています。 複数あるボタンは下記の様にまとまった記述にできました。 //ボタンクリックで写真読み込み for (var i_pic:int = 0; i_pic < 10; i_pic++) { this["btn"+i_pic].addEventListener(MouseEvent.CLICK, loadPic); } function loadPic(event:MouseEvent):void { var btn_name:String=event.target.name; this.menuPicture.source="menu/menu"+btn_name.charAt(3)+".jpg"; } しかし外部テキストが色々試しましたがうまくいきません。 for (var i_txt:int = 0; i_txt < 10; i_txt++) { this["btn"+i_txt].addEventListener(MouseEvent.CLICK, TextLoad); } function TextLoad(event:MouseEvent):void { var Ureq:URLRequest=new URLRequest("menu/menu_txt"+btn_name_txt.charAt(3)+".txt"); var loaderTxt:URLLoader = new URLLoader(); loaderTxt.load(Ureq); var btn_name_txt:String=event.target.name; setumei.text=loaderTxt.data; } 適当にやってここまでてきて、コンパイルエラーは出ないものの、いざボタンを押すと TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。 at _fla::Timeline_1/TextLoad() とでます。 どうやったら上手くいくのでしょうか? よろしくお願い致します。

  • 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