• ベストアンサー

配列に入れたムービークリップのマウスイベントについて

こんにちは。 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; }); } お手数では御座いますが、ご教授いただけると幸いです。 宜しくお願い申し上げます。

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

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

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.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)
回答No.2

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);//検証用 } //ここまで

回答No.1

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で対象をとるようにすれば問題なくいけるみたいです

関連するQ&A

  • AS3.0 二次元配列でムービークリップが出来ない

    Actionscript3.0 超初心者です。 二度目の質問です。  40x80のマス目をエクセルマクロが使えない人のためにFlashで表示させようとしています。 ライブラリーのMC mark_mcを二次元配列で並べようとしていますが、うまく行きません。 試しに一次元配列だと下記のコードでエラーが出なくうまく表示されます。 var mc_array:Array = new Array(); mc_array[3]=new mark_mc(); addChild(mc_array[3]); mc_array[3].scaleX = 0.5; mc_array[3].scaleY = 0.5; mc_array[3].x = 300; mc_array[3].y = 200; 二次元にして var mc_array:Array = new Array(); mc_array[3][2]=new mark_mc(); addChild(mc_array[3][2]); mc_array[3][2].scaleX = 0.5; mc_array[3][2].scaleY = 0.5; mc_array[3][2].x = 300; mc_array[3][2].y = 200; こうすると、TypeError: 「Error #1010: 条件は未定義であり、プロパティがありません。」が出てしまいます。 [3][2]の部分はfor文でデータをマス目に作ろうとしています。 基本的に間違っているのでしょうか?

    • ベストアンサー
    • Flash
  • 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
  • フラッシュのマウスイベント

    フラッシュのマウスイベントがうまくいかないので教えてください。 ボタンはい列(5個)をしてそれぞれにインスタンスを付けました。 ロールオーバーで背景画像の入れ替えクリックで特定のURLへ飛びたいのですが 飛ぶことはできてもロールオーバーの記述がうまくいきません どう書けばいいのか教えてください 素人で説明見ながらなのでイフ とかエルスの使い方もよくわかりません。 ちなみに下記はクリックしたら出てきた記述で思い通りに動いています。 できたら出てくる画像がフェードインにしたいです 同じタイムラインに画像を配置してそれぞれMC-1とか名前も付けましたが 記述を探しても全くわかりません よろしくお願いします URL1.addEventListener(MouseEvent.CLICK,fl_ClickToGoToWebPage_5); function fl_ClickToGoToWebPage_5(event:MouseEvent):void { navigateToURL(new URLRequest("http://www.○○"), "_blank"); } /* クリックして Web ページに移動 */ URL2.addEventListener(MouseEvent.CLICK,fl_ClickToGoToWebPage_6); function fl_ClickToGoToWebPage_6(event:MouseEvent):void { navigateToURL(new URLRequest("http://www.○○"), "_blank"); } /* クリックして Web ページに移動 */ URL3.addEventListener(MouseEvent.CLICK, fl_ClickToGoToWebPage_7); function fl_ClickToGoToWebPage_7(event:MouseEvent):void { navigateToURL(new URLRequest("http://www.○○"), "_blank"); } /* クリックして Web ページに移動 */ URL4.addEventListener(MouseEvent.CLICK, fl_ClickToGoToWebPage_8); function fl_ClickToGoToWebPage_8(event:MouseEvent):void { navigateToURL(new URLRequest("http://www.○○"), "_blank"); } /* クリックして Web ページに移動 */ URL5.addEventListener(MouseEvent.CLICK, fl_ClickToGoToWebPage_9); function fl_ClickToGoToWebPage_9(event:MouseEvent):void { navigateToURL(new URLRequest("http://www.○○"), "_blank"); }

  • マウスアウトで非表示にする

    シーン1に、mc(ムービークリップ)とcomment1(ムービークリップ)を配置 mcにマウスオーバーするとcomment1が表示される。 mcよりマウスアウトするとcommen1が非表示になる。 という感じにしたいのですが、マウスアウトしても非表示に出来ないで困っています。 //----------------------------------- MovieClip(root).comment1.visible = false; var pointX:Number=70; var pointY:Number=50; mc.addEventListener(MouseEvent.MOUSE_OVER, fl_MouseOver); function fl_MouseOver(event:MouseEvent):void { stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveFunc); function mouseMoveFunc(e:MouseEvent):void { MovieClip(root).comment1.visible = true; MovieClip(root).comment1.x=stage.mouseX+pointX; MovieClip(root).comment1.y=stage.mouseY+pointY; } } mc.addEventListener(MouseEvent.MOUSE_OUT, fl_MouseOver2); function fl_MouseOver2(event:MouseEvent):void { mc.removeEventListener(MouseEvent.MOUSE_OVER, fl_MouseOver); MovieClip(root).comment1.visible = false; } //-----------------------------------

    • ベストアンサー
    • Flash
  • フレームに配置したムービークリップを配列に格納

    ActionScript3.0を使っています。よろしくお願いします。 動的にインスタンスを生成して配列に格納する方法は すでに取得しているのですが、 フレームに配置したインスタンスを配列に格納する方法がわかりません。 配置したインスタンス名は連番になっており、 数が多いため下記のようにループさせて配列に格納したいと思います。 現在のコードは下記のとおりです。 var mapBtMcArr:Array = new Array(); for(var i:int=1; i<9; i++) { var mapBtStr:String = "r_machi01_"+ i; var mapBt:MovieClip = mapBtStr; mapBtMcArr.push(mapBt); trace(mapBtMcArr); } これだと、型Stringの値が関連しない型…というエラーが表示されてしまいます。 スクリプトを書く上での基本だと思いますが、 ご伝授いただければ幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 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
  • イベントに独自引数を渡したい。

    ACTIONSCRIPT3.0で、外部ファイルを読み込ませる処理を行っているのですが、読み込み完了時の関数に独自の引数を渡すことは不可能なのでしょうか? var j:int = 100; var myArray:Array; for(var i=0;i<j;i++){  myArray[i] = new Loader();  myArray[i].load(new URLRequest(別の配列に入っている文字列のURL))  myArray[i].contentLoaderInfo.addEventListener(Event.INIT,myfunc); } function myfunc(e){イベント発生時の処理} のように、多数のイベント処理を書くときに配列のインデックスによって処理を分けたいのですが、上の例だとイベント発生時の関数であるmyfuncの引数は規定オブジェクトなので独自のものが渡せません。 いまは別にグローバルな配列を作成して処理をしているのですが、メモリ常駐になることや、オブジェクト指向として気に入らない状態です。 イベントが発生したオブジェクトの名前をキーにすることも考えましたが、どの道スマートではない。なにか方法はないものでしょうか? また、言語仕様的にやむをえないのでしょうか?

    • ベストアンサー
    • Flash
  • ActionScript3.0の修正に関して

    下記スクリプトは、A_btnをマウスオーバーすると、mcを表示し、 A_btnをマウスアウトすると、mcを非表示にするというスクリプトです。 これのマウスオーバー、マウスアウトを クリックしたら表示し、もう一度クリックしたら非表示にするというものに 変更したいのですが、 単にMouseEvent.CLICKにすると動作しなかったので どなたか教えていただけないでしょうか? よろしくお願いします。 ---------------------- 環境 action script3.0 Mac OSX Flash CS4 ---------------------- var mc:Fukidashi = new Fukidashi(); A_btn.addEventListener(MouseEvent.MOUSE_OVER,xMouseOver); function xMouseOver(evt){ mc.alpha = 0; addChild(mc); mc.x = 0; mc.y = 0; mc.addEventListener(Event.ENTER_FRAME,imgAlpha); function imgAlpha(event:Event){ mc.alpha += 0.05; if (mc.alpha > 1){ mc.removeEventListener(Event.ENTER_FRAME,imgAlpha); } } } A_btn.addEventListener(MouseEvent.MOUSE_OUT,xMouseOut); function xMouseOut(evt){ removeChild(mc); mc.alpha = 0; }

    • ベストアンサー
    • Flash
  • どのボタンがクリックされたのかを判別させたい。

    FlashのActionScript3.0を使って、システムを構築中です。 ステージには下記の処理にて9個のボタンが配置されています。 var machiBtArr:Array = new Array(); for(var b:int=1; b<10; b++) { var machiBt_str:String = "machi"+ b; var machiBtClass:Class =Class(getDefinitionByName(machiBt_str)); var machiBt:MovieClip = new machiBtClass(); addChild(machiBt); machiBtArr.push(machiBt); } ここまではうまくいったのですが、 たとえば、machiBtArr[3]のボタンがクリックされたら、 imgPhoArr[3]の画像を表示させる。。。という処理をしたいと思います。 ※配列imgPhoArrには、あらかじめムービークリックを登録済みです。 ネットでいろいろ調べ、予め識別できるidなどプロパティを 追加しておけばいいらしいということを知り、 下記のようにコードを追加しました。 for(var i:int=0; i<machiBtArr.length; i++) { // 識別id追加 machiBtArr[i]._id = i; // マウスイベント登録 machiBtArr[i].addEventListener(MouseEvent.CLICK, machiClick); } function machiClick(e:MouseEvent):void { imgPhoArr[i].visible = true; } ただ、この方法だと、どのボタンをクリックしても 必ずimgPhoArr[8]の画像が表示されてしまいます。 machiBtArr[0].addEventListener(MouseEvent.CLICK, machiClick00); machiBtArr[1].addEventListener(MouseEvent.CLICK, machiClick01);… と処理をひとつづつ記述していけばうまくゆくのですが、 それだとソースが膨大になってしまい、何とか短縮させたいと思っています。 ActionScript3.0に精通された、技術者の方々、 良い方法があればご伝授していただけないでしょうか? どうぞ、よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • Flash(ActionScript3.0)

    Flash(ActionScript3.0)でゲーム制作を行っています。 ActionScriptもFlashも最近初めて触れた初心者で、分からないことがたくさん湧いてきて困っています。 よろしければご回答お願い致します。 インスタンスをドラッグすることができる、という要素と、 インスタンスをクリックすると45度回転する、という要素を同時に入れたいのですが、 同時にプログラムを組むとドラッグだけをすることができず、 どうしてもドラッグ後に45度回転してしまいます。 (プログラムのソースはネットから拾ってきたものです)。 どうすればドラッグと回転を分けることができるのでしょうか。 プログラム自体は以下のように組みました。 ご回答いただければ嬉しいです。 よろしくお願い致します。 //インスタンスの回転プログラム mc1.addEventListener(MouseEvent.CLICK, kaiten); function kaiten(event:MouseEvent) { mc1.rotation += 45; } //インスタンスのドラッグプログラム //インスタンスの0点からのマウス座標用変数 var mc1X:int; var mc1Y:int; //マウスがインスタンスを押したらsec1開始 mc1.addEventListener(MouseEvent.MOUSE_DOWN,sec1); //sec1 マウスダウン座標確認、sec2開始 function sec1(event:MouseEvent):void { mc1X = event.localX; mc1Y = event.localY; addEventListener(MouseEvent.MOUSE_MOVE,sec2); } //sec2 インスタンス移動 function sec2(event):void { mc1.x = mouseX-mc1X; mc1.y = mouseY-mc1Y; //低FPSマウス移動スムーズ対応 event.updateAfterEvent(); } //マウスが離れたらsec3開始 stage.addEventListener(MouseEvent.MOUSE_UP,sec3); mc1.addEventListener(MouseEvent.MOUSE_OUT,sec3); //sec3 sec2停止 function sec3(event):void { removeEventListener(MouseEvent.MOUSE_MOVE,sec2); }