- ベストアンサー
配列に入れたムービークリップのマウスイベントについて
こんにちは。 actionscript3.0にて制作をしております。 FLASH CS4上にテキストフィールドが入ったムービークリップが予め作成してあり、 それを「box_mc」という名前でライブラリに登録しております。 box_mcを配列に格納し、それぞれにマウスイベントで横に10移動する処理を割り当てたく 下記の様な文法で作成しましたが、ランタイムエラー「#1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。」とエラーが表示されてしまいます。 それぞれの配列に正しくマウスイベントを割り当てるにはどうしたら良いでしょうか? var boxArray:Array = new Array(); for (var i:int = 0; i < 3; i++) { boxArray[i] = new box_mc(); // ボックス // マウスオーバーイベント boxArray[i].addEventListener(MouseEvent.MOUSE_OVER, function (event:MouseEvent):void { boxArray[i].x = 10; }); } お手数では御座いますが、ご教授いただけると幸いです。 宜しくお願い申し上げます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1の方と同じような内容ですが, こんな感じで良いのではないでしょうか (コピペ可↓)。 -------------------------------- var boxArray:Array = new Array(); for (var i:int = 0; i < 3; i++) { boxArray[i] = new box_mc(); addChild(boxArray[i]); boxArray[i].y = 20*i; boxArray[i].addEventListener(MouseEvent.MOUSE_OVER, function (event:MouseEvent):void { // ★↓ここを変更 event.currentTarget.x += 10; }); } // ★↓こうして確認してみれば? trace("「i」の値は?→" + i); -------------------------------- 「制御」→「ムービープレビュー」で動作確認します。 ↑これでどこが原因かわかりますか? for文 を抜けた後, 変数「i」の値は 3 になるのです。 for文 によって boxArray の中の要素(box_mc参照変数)は, boxArray[0],boxArray[1],boxArray[2] の 3つしかできませんよね? つまり boxArray[i] つまり boxArray[3] など存在ません。 各ムービークリップに人間がロールオーバーする頃など, for文 などとっくに抜けきっていて,「i = 3」 で止まっています。 したがって書かれていらっしゃる > boxArray[i].x = 10; だと,どのムービークリップにロールオーバーしようとも, boxArray[3] を 10px に移動させようとします。 だから 「null のオブジェクトを参照してます(そんなものありませんで!)。」 というエラーが出るのです。
その他の回答 (2)
- joy_28
- ベストアンサー率84% (45/53)
John12345さん、 それぞれのインスタンスを独立して動かしたいということなので、こういうことかと思います。 //ここから var boxArray:Array = new Array(); var nTarget:Number=stage.stageWidth/2;//ステージ中央値 for (var i:int = 0; i < 3; i++) { var flag:Boolean=false;//動かすかどうかの制御変数定義 boxArray.push(flag);//配列に、flagを格納し、 var mc:Box_mc=new Box_mc();// ボックスのインスタンを生成 addChild(mc);//表示し、 mc.id=i;//iをmcに動的に作ったプロパティ idに格納しておく mc.mouseChildren=false;//mcに入れ子になった、ダイナミックテキスト _txtをマウスに反応させないようにしておく mc._txt.text=String(i);//_txtにiを記載 mc.y=i*80;//mcのY軸方向の配置、適当です mc.addEventListener(MouseEvent.MOUSE_OVER,xMove,false,0,true); mc.addEventListener(Event.ENTER_FRAME,xEnterframe,false,0,true); } function xMove(e:MouseEvent):void { boxArray[e.target.id]=true;//それぞれのe.target.id番目のflagをtrueとする e.target.nextFrame();//第二フレームに移動して、色を変化させる→box_mcを2フレームで作っておき、第一フレームには、this.stop();と記載 } function xEnterframe(e:Event):void { if (boxArray[e.target.id]) {//e.target.idで配列からflagを取り出し、それが、trueなら、 e.target.x+=(nTarget-e.target.x)/10;//ステージ中央に向かって、目標接近スクリプトで動かす } if (e.target.x>(nTarget-1)) {//ステージ中央から1pxl以内に突入したなら、(永遠に、中央値にはならないので) e.target.removeEventListener(Event.ENTER_FRAME,xEnterframe);//削除 } trace(e.target.x);//検証用 } //ここまで
- H240S18B73
- ベストアンサー率65% (190/288)
var boxArray:Array = new Array(); for (var i:int = 0; i < 3; i++) { boxArray[i] = new box_mc(); // ボックス // マウスオーバーイベント boxArray[i].addEventListener(MouseEvent.MOUSE_OVER, function (event:MouseEvent):void { event.target.x = 10; }); } 僕も初めてわかったんですが、イベントリスナーの引数の関数のなかは 名前空間が別になっているみたいですね ということでevent.targetで対象をとるようにすれば問題なくいけるみたいです