- ベストアンサー
多次元配列のデータの吸い出し方法について
- 多次元配列のデータがうまく吸い出せません。アクションスクリプトの簡素化を進めていますが、最終局面で行き詰っています。
- ムービークリップと3つのボタンを配置し、ボタンをクリックしたらムービークリップの色が変わるプログラムを作成していますが、全てのボタンで同じ色に変化してしまいます。
- 配列に色データを詰め込んで各ボタンに適用する処理を簡素化したいのですが、エラーになっています。どうすれば正常に動作させることができるでしょうか?
- みんなの回答 (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
お礼
早々のご指導感謝します。完璧なご指摘でどこが間違っていたか完全に理解出来ました。また丁寧に複数の対処法まで考えていただき本当に嬉しかったです。対処法2で進めることとさせていただきました。これから作業を進めていきますがまた行き詰った時は宜しくお願いします。この度はありがとうございました。