AS3.0環境で連番のインスタンス名をつけたMCをドラッグ&ドロップする方法についてのエラー

このQ&Aのポイント
  • Adobe Flash CS3、AS3.0の環境で、連番のインスタンス名をつけたMCをドラッグ&ドロップする方法について以下のように記述したところ、「TypeError: Error #1010: 条件は未定義であり、プロパティがありません。」のエラーが出てしまいます。
  • マウス操作があったときの動作を単なるtrace等にすると問題なく動作するため、this["btn"+i]の記述が問題だと分かっているが、正しい記述方法がわかりません。どのように修正すれば良いでしょうか?
  • 問題切り分けのためにマウス操作をtraceするなどしてみると、問題なく動作することから、function~部分の記述が問題であると分かっています。しかし、ここでの正しい記述方法がわからず、行き詰まっています。教えていただけないでしょうか?
回答を見る
  • ベストアンサー

連番のインスタンス名をつけた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] の記述が問題だというのはわかるのですが、ここの正しい記述方法がわからず、行き詰まっております。ご教示いただけませんでしょうか。

noname#200528
noname#200528
  • Flash
  • 回答数1
  • ありがとう数4

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

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

まず書かれていらっしゃるスクリプトの for文 を引用します。  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);  } 変数 i の初期値は 1 で, その i が 1 ずつ加算されながらループします。 ここを, 超スローモーションで考えると何を書かれていらしゃるのかがわかると思います。 for文に入る→  変数 i は 1 → for文内が実行される → i は i++ で 2 になる  変数 i は 2 → for文内が実行される → i は i++ で 3 になる  変数 i は 3 → for文内が実行される → i は i++ で 4 になる  変数 i は 4 → for文内が実行される → i は i++ で 5 になる  変数 i は 5 → for文内が実行される → i は i++ で 6 になる  変数 i は 6 → for文内が実行される → i は i++ で 7 になる  変数 i は 7 → for文内が実行される → i は i++ で 8 になる  変数 i は 8 → for文内が実行される → i は i++ で 9 になる  変数 i は 9 → for文内が実行される → i は i++ で 10 になる  変数 i は 10 → for文内が実行される → i は i++ で 11 になる → for文を抜ける 結局 i は 11 となって for 文を抜けます。 ここまではよろしいでしょうか? そして,次のスクリプトに入ります。  function down(eventObject:MouseEvent):void {    this["btn"+i].startDrag();  }  function up(evnetObject:MouseEvent):void {    this["btn"+i].stopDrag();  } 変数 i の値は 11 なので, つまりこのスクリプトは  function down(eventObject:MouseEvent):void {    this.btn11.startDrag();  }  function up(evnetObject:MouseEvent):void {    this.btn11.stopDrag();  } と書いたのと同じ意味になります。 何が間違っているかおわかりになりましたか? > 「TypeError: Error #1010: 条件は未定義であり、プロパティがありません。」のエラーが出ます。 「btn11」が存在しないからそのエラーが出るのです。 ムービークリップ「btn11」を作成すればエラーは出ないと思います。 しかし, ムービークリップ「btn11」を作成しても問題は解決しませんよね。 問題を解決するには, すごく単純に普通に次のようにスクリプトを修正すれば良いと思います。 ------------------------------------------- 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 { eventObject.target.startDrag(); } function up(evnetObject:MouseEvent):void { evnetObject.target.stopDrag(); } ------------------------------------------- 修正したのは this["btn"+i].startDrag();→eventObject.target.startDrag(); と this["btn"+i].stopDrag();→evnetObject.target.stopDrag(); の2行だけです。 「何のために引数に MouseEvent が入るようになっているか」 です。 ここを理解して「単純に普通に」コーディングすれば良いだけです。 なお, この修正版は修正を最小限に留めています。 間違いではありませんが, down(eventObject:MouseEvent) の部分と up(evnetObject:MouseEvent) の部分の引数名がずれていますよ。 ※ eventObject ≠ evnetObject ココの部分は何でも良いので決して間違いではありません。 しかし妙なところでミスをして引っ掛かることがあるので注意してください。 (回答に際して修正&検証するとき,  私がまんまと引っ掛かってしまって  「おや!?」と一瞬アセってしまっただけなのですが ( ̄_ ̄ i)..。)

noname#200528
質問者

お礼

ありがとうございました!細かい部分までご指摘いただき、感謝です。 event部分のスペル打ち間違いはお恥ずかしい限りです。 考え方の点についても、アドバイスいただきありがとうございました。 無事に動作させることができました!

関連するQ&A

  • 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("ジャム"); } ------------------------------------------------------------- としたのですが、これではどのボタンをクリックしても"ジャム"がトレースされます。(当然ですが・・・) このような時、まとめて記述するにはどうすればよいでしょうか?

  • マウスでドラッグして絵を描くSWFを作っています

    マウスでドラッグして絵を描くSWFを作っています ムービークリップ"masu"を置き、 下のスクリプトで、マウスのボタンを押してしてそのままマウスを動かすと動きに沿って線は引かれ、hの値も正しくトレースされるのですが、ボタンをあげても TypeError: Error #1034: 強制型変換に失敗しました。flash.events::MouseEvent@2ac45ea1 を fl.motion.MotionEvent に変換できません。 というエラーが出力され、 function DEL(eventObject:MotionEvent):void{ removeEventListener(MouseEvent.MOUSE_MOVE,LINE); } が動きません。なぜでしょうか? また、AS1は少しはわかりますがAS3は初心者ですので、もっとよいスクリプトなどありましたら挙げていただけるとうれしいです import fl.motion.MotionEvent; var h = 1; this.masu.addEventListener(MouseEvent.MOUSE_DOWN,MOVE); this.masu.addEventListener(MouseEvent.MOUSE_UP,DEL); function MOVE(eventObject:MouseEvent):void{ this.masu.graphics.moveTo(mouseX,mouseY); this.masu.addEventListener(MouseEvent.MOUSE_MOVE,LINE); } function LINE(eventObject:MouseEvent):void{ h++; trace(h); this.masu.graphics.lineStyle(3,0x000000); this.masu.graphics.lineTo(mouseX,mouseY); } function DEL(eventObject:MotionEvent):void{ removeEventListener(MouseEvent.MOUSE_MOVE,LINE); }

    • ベストアンサー
    • Flash
  • 【AS3】ループ処理で関数名を作成するには?

    ActionScript3.0についてご教授ください。 forなどを使い、ループ処理を使って変数名を作成する要領で 関数名を作ることは可能なのでしょうか? やりたい処理を記述させて頂きますと次の通りです。 ステージにある3つのボタン「btn0」「btn1」「btn2」に対して マウスクリック時の処理を書こうとしている例文です。 もちろん、これではエラーになります。 for( var i:int; i<3; i++ ){   this["btn"+i].addEventListener( MouseEvent.MOUSE_DOWN,"on"+i );   function "on"+i( e:MouseEvent ):void{     trace( e.target.name );   } } こうした処理を実現したい場合、"on"+i 部分をどのように記述すると良いのでしょうか? もしご存知でしたらお知恵をいただけないでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • Flash
  • 【as3】クリックでインスタンスを増やしたい

    Actionscript初心者です。 勉強のため、以下のURLにあるActionscript2.0のFlashをActionscript3.0に書き換えたいと思っています。 http://allabout.co.jp/gm/gc/66814/ 左側にリースのパーツ、右に素のままのリースが配置されています。パーツはそれぞれ、リボン付きベル(インスタンス名「bellBig」)、松ぼっくり (インスタンス名「matu」)、小さいベル(インスタンス名「bellSmall」)と指定してあります。この3つのアイテムをドラッグドロップすることでリースを飾り付けていきます。 インスタンスをドラッグ&ドロップする所まではできたのですが、 松ぼっくりと小さいベルをドラッグした際にインスタンスを複製するところでつまずいています。 あまりにも初歩的な質問で恐縮ですが、ご教授お願いいたします。 /*////////////////////大きいベル/////////////////////*/ // ドラッグ開始 bellBig.addEventListener(MouseEvent.MOUSE_DOWN,mouseDown1); function mouseDown1(event:MouseEvent):void{ bellBig.startDrag(); } // ドラッグ終了 bellBig.addEventListener(MouseEvent.MOUSE_UP,mouseUp1); function mouseUp1(event:MouseEvent):void{ bellBig.stopDrag(); } /*////////////////////まつぼっくり/////////////////////*/ // ドラッグ開始 matu.addEventListener(MouseEvent.MOUSE_DOWN,mouseDown); function mouseDown(event:MouseEvent):void{ matu.startDrag(); } //ドラッグ終了 matu.addEventListener(MouseEvent.MOUSE_UP,mouseUp); function mouseUp(event:MouseEvent):void{ matu.stopDrag(); } /*////////////////////小さいベル/////////////////////*/ // ドラッグ開始 bellSmall.addEventListener(MouseEvent.MOUSE_DOWN,mouseDown2); function mouseDown2(event:MouseEvent):void{ bellSmall.startDrag(); } // ドラッグ終了 bellSmall.addEventListener(MouseEvent.MOUSE_UP,mouseUp2); function mouseUp2(event:MouseEvent):void{ bellSmall.stopDrag(); }

  • actionscript3.0 rotationについて

    actionscript3.0 rotationについて btnを押すごとにmcを時計回りに90度減速させながら回転させたいと思っています。 しかし2回ボタンを押して180度回転させるまではうまくいくのですが 3回目に270度になると、回転がとまりません。 分岐させて、-90度回そうと思うと(当たり前ですが)逆回転してしまいます。 どのように記述すればよいでしょうか? よろしくお願いします。 以下スクリプトです。 var i:int=0; function onEnter(event:Event):void{ mc.rotation += (i-mc.rotation)*0.1; } addEventListener(Event.ENTER_FRAME, onEnter); btn.addEventListener(MouseEvent.MOUSE_DOWN, MouseLDownFunc); function MouseLDownFunc(event:MouseEvent):void{ i+=90; };

    • ベストアンサー
    • Flash
  • FLEX 外部asの関数を実行する方法。

    nl.platipus.RenaultJointDevelopment.controls.GearBox.asというasの中に下記の関数があります。 private function makeLeverInteractive(param1:String) : void { switch(param1) { case "clickable": { lever.buttonMode = true; lever.useHandCursor = true; if (!lever.hasEventListener(MouseEvent.CLICK)) { lever.addEventListener(MouseEvent.CLICK, handleLeverClick, false, 0, true); } if (lever.hasEventListener(MouseEvent.MOUSE_DOWN)) { lever.removeEventListener(MouseEvent.MOUSE_DOWN, handleLeverMouseDown); } if (lever.hasEventListener(MouseEvent.MOUSE_UP)) { lever.removeEventListener(MouseEvent.MOUSE_UP, handleLeverMouseUp); stage.removeEventListener(MouseEvent.MOUSE_UP, handleLeverMouseUp); } break; } case "draggable": { lever.buttonMode = true; lever.useHandCursor = true; if (lever.hasEventListener(MouseEvent.CLICK)) { lever.removeEventListener(MouseEvent.CLICK, handleLeverClick); } if (!lever.hasEventListener(MouseEvent.MOUSE_DOWN)) { lever.addEventListener(MouseEvent.MOUSE_DOWN, handleLeverMouseDown, false, 0, true); } if (!lever.hasEventListener(MouseEvent.MOUSE_UP)) { lever.addEventListener(MouseEvent.MOUSE_UP, handleLeverMouseUp, false, 0, true); stage.addEventListener(MouseEvent.MOUSE_UP, handleLeverMouseUp, false, 0, true); } break; } default: { lever.buttonMode = false; lever.useHandCursor = false; lever.emphasize = false; if (lever.hasEventListener(MouseEvent.CLICK)) { lever.removeEventListener(MouseEvent.CLICK, handleLeverClick); } if (lever.hasEventListener(MouseEvent.MOUSE_DOWN)) { lever.removeEventListener(MouseEvent.MOUSE_DOWN, handleLeverMouseDown); } if (lever.hasEventListener(MouseEvent.MOUSE_UP)) { lever.removeEventListener(MouseEvent.MOUSE_UP, handleLeverMouseUp); stage.removeEventListener(MouseEvent.MOUSE_UP, handleLeverMouseUp); } break; break; } } return; }// end function このmakeLeverInteractiveという関数をnl.platipus.BasicATM.InhibitorSwitchAnimation.InhibitorSwitchAnimation.asの中で、 クリックすると実行するように書きたいのですが、できますでしょうか? もし、できるのであればその方法も教えていただけると助かります。

  • 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
  • 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
  • クラスまたはインタフェイス'MouseEvent'をロードできませんでした。

    「クラスまたはインタフェイス\'MouseEvent\'をロードできませんでした。」 というエラーの解決方法を教えてください。 yes_btn_mcというムービークリップをクリックすると70フレーム目にとばしたいのです。 yes_btn_mc.addEventListener(MouseEvent.CLICK, yesClick); yes_btn_mc.buttonMode=true; function yesClick(evt:MouseEvent):void{ gotoAndstop(70); } 上記のようにアクションパネルに記述しましたが、 「クラスまたはインタフェイス\'MouseEvent\'をロードできませんでした。」 と出て動きませんでした。 どうすれば動くようになるかわかる方、教えてください。

  • 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