as3 textfieldが残ってしまいます

このQ&Aのポイント
  • as3 textfieldが残ってしまう問題について解決方法を教えてください。
  • ボタンを押すとtextfieldのインスタンスがない場合に動きが止まる問題について解決策を教えてください。
  • as3のtextfieldを削除する際に注意すべき点を教えてください。
回答を見る
  • ベストアンサー

as3 textfieldが残ってしまいます

homeBtn.removeEventListener(MouseEvent.CLICK, go3); function go3(event:MouseEvent):void { if(text_field1.parent) text_field1.parent.removeChild(text_field1); if(text_field2.parent) text_field2.parent.removeChild(text_field2); if(text_field3.parent) text_field3.parent.removeChild(text_field3); if(text_field4.parent) text_field4.parent.removeChild(text_field4); if(text_field5.parent) text_field5.parent.removeChild(text_field5); if(text_field6.parent) text_field6.parent.removeChild(text_field6); if(text_field7.parent) text_field7.parent.removeChild(text_field7); MovieClip(root).gotoAndStop("1"); } としますと確かに消えますがtextfieldのインスタンスがないときにボタンを押すと動きが止まってしまいます。 これはどのように解決したらよいのでしょうか? 宜しくお願い致します。

  • Flash
  • 回答数1
  • ありがとう数2

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

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

元々 http://okwave.jp/qa/q8960833.html この↑ご質問で書かれていらっしゃった内容に関して以下の回答をします。 (今回では省略されている テキストフィールドを addChild する場所などが重要なので。) === === === === === === === === 元々書いていらした上記のご質問で, > としても全く違うものが削除されます。 > テキストフィールドが削除されません。 > ボタンなどが削除されます。 と書かれていらっしゃる「としても」の部分が 具体的に「どのようにしても」なのかわかりません (中身が空の関数 sakujyo2 がその上に書いてあっただけです)。 また,text_field1,text_field2,text_field3,… も どこまで存在する可能性があるのかがわかりません (text_field7 までの7個でしょうか?)。 その他も良くわからない部分がありますが, 仮に関数 go1 を修正するのであれば 次のようにすれば良いのではないかと思います。 backBtn.addEventListener(MouseEvent.CLICK, go1); function go1(event:MouseEvent):void { //変数 i に1から7まで1ずつ加算した値を代入しながらループ for(var i = 1; i <= 7; i++) { //変数 text_field○ が存在した上で なおかつ //その変数の参照インスタンスが stage の表示リストに存在すれば if(this["text_field" + i] != null && stage.contains(this["text_field" + i])) { //そのインスタンスを stage の表示リストから削除する stage.removeChild(this["text_field" + i]); //念のためその変数の参照を切っておく this["text_field" + i] = null; } } } === === === === ご質問では, var text_field1:TextField = new TextField(); のようにして 変数自体はそのタイムライン(root)階層に配置されていますが その変数が参照するテキストフィールドインスタンス本体は stage.addChild(text_field1); のようにして stage 階層に直接配置されています。 (変数が存在する階層とテキストフィールドが存在する階層とがズレています。) (stage 階層は メインタイムライン(root) 階層の親階層です。) したがって 少々ややこしい話になるわけですが, 変数へのパスは this (またはパス無し) になり, removeChild を実行させる対象オブジェクトは stage になるわけです。 stage.removeChild(this["text_field" + i]); ^^^^^^ ややこしいので 階層を別にする理由が特になければ, 配置する階層を揃えた方が良いと思います (「stage」ではなく「この階層」に)。 「F-site [AS3] MovieClipインスタンスとインスタンス名」 http://f-site.org/articles/2008/04/19014939.html それと上のスクリプト中の this["text_field" + i] で使っている [ ] を「配列アクセス演算子」と言います。 「FN1107002-ドット演算子と配列アクセス演算子-Flashテクニカルノート」 http://www.fumiononaka.com/TechNotes/Flash/FN1107002.html === === === === なお実際は, 「フレーム移動させる関数」と 「テキストフィールドを消す関数」とは別にしておいて 「フレーム移動させる関数」から「テキストフィールドを消す関数」を実行させるようにした方が汎用的なスクリプトになるように思います。 (これは使われ方によって変わるので何とも言えませんが。) また テキストフィールドの参照も タイムライン変数を用意してそこに代入するのではなく 配列の要素に代入した方が使い勝手が良くなる気がします。 (これも使われ方によって変わるので何とも言えませんが。)

abesouri
質問者

お礼

ありがとうございました。 階層の問題がややこしかったです。

関連するQ&A

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

    シーン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フレーム移動について

    お世話になります。 Flash ActionScript3.0で、ボタンをクリックしたら、 階層違いのシーンに移動するという 単純なところでつまずいています。 一番上の階層には、 1フレーム目 フレームラベル "a" 2フレーム目 フレームラベル "b" として、それぞれ this.stop();を書いてあります。 "a""b"には、それぞれムービークリップが配置してあって、 今やりたいことは、"a"に配置してあるムービークリップの 2つ下(中?)の階層にあるボタンをクリックしたら、一番上の階層の"b"に移動して、 "b"に配置してあるムービークリップを表示するようにしたいのです。 "a"のムービークリップのボタンのあるフレームには、 this.stop(); button01.addEventListener(MouseEvent.CLICK,jumpB); function jumpB(event:MouseEvent):void { MovieClip(parent.parent).gotoAndStop("b"); } と書いてみましたが、 [TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。] と怒られます。 試しに MovieClip(stage).gotoAndStop("b"); とか、"b"に配置してあるムービークリップにインスタンス名"b_mc"を与えて MovieClip(parent.parent).b_mc.play(); などと苦し紛れにやってみましたが、すべて同じように怒られます。 どのようにすれば、下の階層から一番上の階層の別フレームに 移動することができますでしょうか? よろしくお願い致します。

  • AS3の拡大と縮小について

    下記の外部ASで試しているのですが比率を維持して拡大されます。 予想では横は100%で縦に300%伸びて表示されるはずなのですがなぜ比率が 維持されるのでしょうか? また、縦だけとこ横だけ拡大や縮小するにはどう書けばいいのでしょうか? package { import flash.display.*; import flash.events.*; import flash.text.*; public class Main extends MovieClip { private var mc:MovieClip; private var text:TextField; public function Main():void { mc = new MovieClip(); addChild(mc); text = new TextField(); text.text = "テスト"; text.scaleX = 1; text.scaleY = 3; mc.addChild(text); } } }

    • ベストアンサー
    • 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の中で、 クリックすると実行するように書きたいのですが、できますでしょうか? もし、できるのであればその方法も教えていただけると助かります。

  • actionscript3.0で親階層にあるインスタンスの中のものを操

    actionscript3.0で親階層にあるインスタンスの中のものを操作したいのですが、うまくいきません。 具体的には、ボタンをクリックすると、ひとつ上の階層にある「aa_mc」の100フレームへgotoAndPlayするとしたいのですが、 スクリプトは以下の通りです。 //////////////////////////////////////////////////////// btn_mc.addEventListener(MouseEvent.CLICK, onClick); function onClick (eventObject:MouseEvent) :void { MovieClip(parent).aa_mc.gotoAndPlay(100); } //////////////////////////////////////////////////////// どなたかご教授お願いいたします。

  • AS3のコードをシンプルに

    AS3のコードについてご教授お願いします。 下記のようなコードがあるとします。 btnA_mc.addEventListener(MouseEvent.CLICK,aClick); btnB_mc.addEventListener(MouseEvent.CLICK,bClick); btnC_mc.addEventListener(MouseEvent.CLICK,cClick); function aClick(e:MouseEvent):void { this.gotoAndPlay("A"); // trace("Aclick"); btnB_mc.addEventListener(MouseEvent.CLICK,bClick); btnC_mc.addEventListener(MouseEvent.CLICK,cClick); btnA_mc.removeEventListener(MouseEvent.CLICK,aClick); } function bClick(e:MouseEvent):void { this.gotoAndPlay("B"); // trace("Bclick"); btnA_mc.addEventListener(MouseEvent.CLICK,aClick); btnC_mc.addEventListener(MouseEvent.CLICK,cClick); btnB_mc.removeEventListener(MouseEvent.CLICK,bClick); } function cClick(e:MouseEvent):void { this.gotoAndPlay("C"); // trace("Cclick"); btnA_mc.addEventListener(MouseEvent.CLICK,aClick); btnB_mc.addEventListener(MouseEvent.CLICK,bClick); btnC_mc.removeEventListener(MouseEvent.CLICK,cClick); } btnA_mc.buttonMode = true; btnB_mc.buttonMode = true; btnC_mc.buttonMode = true; この中の、 btnA_mc.addEventListener(MouseEvent.CLICK,aClick); btnB_mc.addEventListener(MouseEvent.CLICK,bClick); btnC_mc.removeEventListener(MouseEvent.CLICK,cClick); のような、重複する部分を、配列か何かでまとめたいのですが、いまいち方法が分かりません。 ボタンAをクリックで、ボタンAは効かなくなる。ボタンBorCをクリックでボタンAが復活みたいな感じです。 宜しくお願いします。 flashCS3 ASはver3.0でお願いします。

    • ベストアンサー
    • 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でMovieClipのタイムラインからシーンの頭出し

    現在Actionscript3で行き詰っています… シーンの中に配置したMovieClipのタイムラインが最後まで来たら、シーンの頭に戻したいと考えています。 そこでMovieClipの最後のフレームに gotoAndStop(MovieClip(parent)); と記載しましたがうまくシーンに移動せず、そのMovieClipのタイムラインをループしています。 ほかにも gotoAndStop(MovieClip(root)); とか、シーンにラベルをつけて gotoAndStop("ラベル名"); も試してみましたが、うまくいきません.. 初歩的なことだったらすみません… わかる方がいらっしゃいましたら、ご教授いただければと思います。

  • as3 addEventListenerの動的な生成について

    addEventListenerを動的に生成したいのですが、 下記のコードは動いてくれません。(エラーはないです。) //2つのインスタンスは適当な座標においてあります for(var num=0; num < 2; num++){ var mc = "test"+num+"_mc"; mc = new MovieClip(); mc.addEventListener(MouseEvent.CLICK, move); } function move(event:Event):void{ event.currentTarget.x = 0; } 上記のような場合は、 どのようにすればよいのでしょうか。 ご教授お願いいたします。

    • ベストアンサー
    • Flash
  • as3でボタンにリンクをはる方法!

    質問ばかりで申し訳ないですが、お世話になります。 flashCS4&Actionscript3を使っているものです。 「ボタンにリンクをはる方法を探しています。 (どうしても 1093のシンタックスエラーになってしまい、困っています。)」 現在作成しているものは、以下のような構造です。 ************************************************************* ステージ ↓ムービークリップ【インスタンス名(menu_mc)】 ________________________________________ ・ボタン【インスタンス名(btn1_btn)】 ・ボタン【インスタンス名(btn2_btn)】 ・ボタン【インスタンス名(btn3_btn)】 ________________________________________ *************************************************** menu_mcの中で、以下のように記述しました。 btn1_btn.addEventListener(MouseEvent.CLICK,gotowebpage1); function gotowebpage1(event : MouseEvent) :void { navigateToURL(new URLRequest("​http://www.yahoo.co.jp"));​ } btn2_btn.addEventListener(MouseEvent.CLICK,gotowebpage2); function gotowebpage2(event : MouseEvent) :void { navigateToURL(new URLRequest("​http://www.yahoo.co.jp"));​ } btn3_btn.addEventListener(MouseEvent.CLICK,gotowebpage3); function gotowebpage3(event : MouseEvent) :void { navigateToURL(new URLRequest("http://www.yahoo.co.jp")); } すると、1093のシンタックスエラーになってしまいます。 うまく動作させる為には、他にどんな作業を行ったらいいのでしょうか、 よろしくお願いします!!!

    • ベストアンサー
    • Flash

専門家に質問してみよう