• 締切済み

表示オブジェクトの参照

下記のxTestから表示リストコンテナに追加された「bm」をdisposeするスクリプトを書こうと思って躓いています。 「bm」はローカル変数なので他の関数からアクセスできないと思いますので、getChildAt(0)のようにメインタイムラインから辿って参照できないかと考えています。 この方法をどなたか教えていただけないでしょうか。 また別の参照方法があればそちらでもOkです。 どうぞよろしくお願いいたします。 メインタイムライン → bm → bmd var bmdX:uint = 500; var bmdY:uint = 320; var bmX:uint = 0; var bmY:uint = 0; var loadImg = new Loader(); loadImg.load(new URLRequest("0.jpg")); loadImg.contentLoaderInfo.addEventListener(Event.COMPLETE,xLoader); function xLoader(evt:Event):void { var bmd:BitmapData = new BitmapData(bmdX,bmdY); bmd.draw(loadImg); var bm:Bitmap = new Bitmap(bmd); this.addChild(bm); bm.x = bmX; bm.y = bmY; } _btn.addEventListener(MouseEvent.CLICK,xTest); function xTest(evt:MouseEvent):void { //▼「bm」にここからアクセスしてdispose()したい! }

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

みんなの回答

  • chika_008
  • ベストアンサー率80% (20/25)
回答No.3

resecさんが回答してくれたように、 要はas BitmapとすることでこれはBitmapですと教えているようなものです。 このasの部分を省くとgetChildAt(0)の部分がなんなのかわからずにエラー になると思われます。 なので~を静的オブジェクト~で参照しようとしていますとか エラーがでるのですがこれはasを使いキャストしてあげると治る事が多いです。

noname#86988
noname#86988
回答No.2

as演算子について 指定したオブジェクトが特定の型であるかどうかを評価する演算子です。 asの前に、「変換したいインスタンス」、後に「変換したい型」で記述します。 最初のオペランドで指定された式が、2 番目のオペランドで指定されたデータ型のメンバーであるかどうかを評価します。 最初のオペランドがそのデータ型のメンバーである場合、結果は最初のオペランドになります。 それ以外の場合、結果の値は null です。 var Bm2:Bitmap = this.getChildAt(0) as Bitmap ではthis.getChildAt(0)がbitmapならばthis.getChildAt(0)をBm2に代入します。bitmapでなければnullになります。 なお、キャストではなくtrueかfalseの結果がほしい場合は、is演算子を使います。

southlion8
質問者

お礼

ありがとうございます。 キャストも含め意味が理解できました。

  • chika_008
  • ベストアンサー率80% (20/25)
回答No.1

この場合ですと、 thisでaddChildしているので function xTest(evt:MouseEvent):void { var Bm2:Bitmap = this.getChildAt(0) as Bitmap; } これでいくと思われます。 どうでしょうか。

southlion8
質問者

補足

chika_008さん ご返信有難うございます。 一つ教えていただけますか? var Bm2:Bitmap = this.getChildAt(0) as Bitmap; 上記のasはどういう役目をもっているのでしょうか? 使ったことのない演算子で、解説書を読んでも良く分かりません。 教えていただけますか?

関連するQ&A

  • 下記コードですが、なぜtrace出来ないか、わかりますか?

    下記コードですが、なぜtrace出来ないか、わかりますか? ----------------------------------------------------------------------- var bmpData:BitmapData = new BitmapData(100,100,true,0xff000000); var bmp:Bitmap = new Bitmap(bmpData,PixelSnapping.AUTO,true); addChild(bmp); bmp.addEventListener(MouseEvent.CLICK,hoge); function hoge(e){ trace('なぜか無反応!'); } ----------------------------------------------------------------------- よろしくお願いします。

    • ベストアンサー
    • Flash
  • as3 ムービークリップにビットマップデータを挿入するクラスがうまくい

    as3 ムービークリップにビットマップデータを挿入するクラスがうまくいかない 上記のとおりなんですが、 前提として ■ライブラリにjpgを一枚読み込んで、Photoというクラス名でリンケージしてあります。 ■ステージにmcというムービークリップを配置しています。 mcにビットマップ化したjpgをaddchildしたかったので、 メインフレームに下記を書きました。 -------------------------------------------------------- var name_str:String = "Photo"; var myClass:Class = Class(getDefinitionByName(name_str)); var bmd:BitmapData = new myClass(0, 0); var bm:Bitmap = new Bitmap(bmd); bm.pixelSnapping = PixelSnapping.ALWAYS; bm.smoothing = true; mc.addChild(bm); -------------------------------------------------------- ※今後動的に生成するのでクラス名は変数にしています。 これは問題なく行きました。 上記を外部クラス化したかったので、 下記のようにしました。 ■PhotoClass ---------------------------------------------------------------------- package { import flash.display.MovieClip; import flash.events.Event; import flash.display.Bitmap; import flash.display.BitmapData; import flash.utils.getDefinitionByName; import flash.display.PixelSnapping; public class PhotoClass extends Bitmap { private var myClass:Class;//クラス名 private var bmd:BitmapData; private var bm:Bitmap; //コンストラクタ public function PhotoClass(_name:String) { myClass = Class(getDefinitionByName(_name)); bmd = new myClass(0, 0); bm = new Bitmap(bmd); bm.pixelSnapping = PixelSnapping.ALWAYS; bm.smoothing = true; init(); } public function init():Bitmap { return bm; } } } ---------------------------------------------------------------------- ■メインフレーム var photoAdd:Bitmap = new PhotoClass("Photo"); mc.addChild(photoAdd); これがうまくいきません。 エラーはないのですが、ちゃんとmcに画像が読み込まれません。。。。 ご教授いただければと思います!

    • ベストアンサー
    • Flash
  • テキストフィールドかの色情報からムービークリップの色が変わるようにした

    テキストフィールドかの色情報からムービークリップの色が変わるようにしたいです。ActionScript3.0です。 ●colBox2というテキストフィールドがあり、bmpData(BitmapData型)という場所で取得したRGB色情報が表示されるようになっています。(例えば赤ならFF0000というように)。 var colBox2:TextField = new TextField(); colBox.x = 450; addChild(colBox2); ●bmpData上でマウスを上げたらその場所の色情報がcolBox2上に表示されて、colBox2上のテキストを読み取って、boardというムービークリップの色が変わるようにしたいのですが、エラーこそ出ないですが、boardの色は変わらないです。どうずれば変更できるのでしょうか?宜しくお願いします。 var colorTrans:ColorTransform = new ColorTransform(); var trans:Transform = new Transform(board); trans.colorTransform = colorTrans; copy.addEventListener(MouseEvent.MOUSE_UP,mouseUp) function mouseUp(evt:MouseEvent){ var pixelValue:uint = bmpData.getPixel(evt.stageX,evt.stageY); colBox2.text = pixelValue.toString(16);//取得したカラーを代入 colorTrans.color = "0x" + colBox2.text as uint; trans.colorTransform = colorTrans; }

    • ベストアンサー
    • Flash
  • actionscript3.0 オブジェクトの動的生成

    actionscript3.0についての質問です。 イラストレーターのテキストツールのように 任意の文字オブジェクトを複数生成し、生成された任意の文字オブジェクト をドラッグで移動する処理をactionScriptで実行したいと考えています。 現在actionscript3.0で行いたいと考えている一連の流れは以下の通りです。 1.ステージに配置したテキストフィールに任意の文字列を入力 2.入力された文字列を参照してムービークリップ内のダイナミックテキストに出力。 3.ステージにボタンを配置し、それを押すことでステージに1.2の手順によって作成されたムービークリップが生成。 4.生成されたムービークリップをドラッグすると動かすことができる。 1から3までの内容を下記のようなスクリプトで行いました。 //ダイナミックテキストを内包するためのムービークリップを定義 //埋め込みアセットクラスmcからインスタンスを生成 var word_mc:MovieClip = new mc( ); //ボタンクリックイベントを登録 create_btn.addEventListener( MouseEvent.Click, creClick ); //ボタンクリック時の処理 function creClick( evt:MouseEvent ):void { //テキストフィールドinputWordに入力されたテキストを変数inputに格納 var input:String = inputWord.text; //word_mc内に配置したダイナミックテキストoutputWordに入力テキスト内容を出力 word_mc.outputword.text = input; //word_mcを画面に表示 addChild( word_mc ); } //word_mcをドラッグで移動させるためのスクリプト word_mc.addEventListener( MouseEvent.MOUSE_OVER, wordMO ); function wordMO( evt:MouseEvent ):void { word_mc.addEventListener( MouseEvent.MOUSE_DOWN, wordMD ); word_mc.addEventListener( MouseEvent.MOUSE_UP, wordMU ); } function wordMD( evt:MouseEvent ):void { word_mc.startDrag( ); } function wordMU( evt:MouseEvent ):void { word_mc.stopDrag( ); } ひとつのオブジェクトを生成するだけならこれで問題ないのですが、 このスクリプトでは、、"車"、"自転車"、"飛行機"という文字列をそれぞれ内包した変数名もしくはクラス名の違うオブジェクトを生成することが できません。 埋め込みアセットクラスをあらかじめ複数作っておいて、クラス名を 連番で名づけ、クラス名から動的にオブジェクトを生成すれば 内容の異なるオブジェクトを生成することは可能ですが、 単語を追加するたびに埋め込みアセットクラスを作成しなければ ならない上、変数名は同じなため、個々のオブジェクトをマウスドラッグすることができません。 イラストレーターのテキストツールのように 任意の文字列を生成した後、個々にマウスドラッグできようにするには どうしたら良いのでしょうか。 どうかご指導のほど、よろしくお願い致します。

    • ベストアンサー
    • Flash
  • 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
  • 循環参照とメモリリークに関して

    次のスクリプトはメモリリークを起こしているでしょうか。 function process(listener){ return function(evt){ listener.call(evt.target,evt); }; } function addEvent(element,type,listener,useCapture){ element.addEventListener(element,type,process(listener),useCapture); } var div=document.getElementsByTagName('div')[0]; //存在するものとして addEvent(div,'click',function(){;},false); //いかにも起こしそう div.parentNode.removeChild(div); //親も存在するものとして 工夫してみたものの、やはりメモリリークするんでしょうか。 実際にaddEventListenerのlistener引数に渡されるのは、element変数を参照しない function(evt){ listener.call(evt.target,evt); }; ですが、listener変数は参照します。 そして、そのlistener変数はdiv変数(DOM)を参照するので、ここで循環するのでしょうか。 そして、以下の場合はどうなのでしょうか。。 var elements=[document.getElementsByTagName('div')[0]]; elements[0].addEventListener('click',function(){;},false); elements[0].parentNode.removeChild(elements[0]);

  • アクションスクリプト3.0での存在している予定のインスタンスの参照方法

    abcというムービークリップにマウスオーバーするとxyz(クラス名はaru)という ムービークリップを表示するプログラム(アクションスクリプト3.0)を作りました。 abc.addEventListener(MouseEvent.MOUSE_OVER , mover); function mover(e:MouseEvent):void{ var xyz:aru = new aru(); xyz.x = 380; xyz.y = 100; addChild(xyz); } ここまでは問題なく機能しました。 ここで、abcのマウスオーバーがなくなった状態(つまりマウスアウト) になったら、xyzを非表示にしたいと思い以下のようにしました。 abc.addEventListener(MouseEvent.MOUSE_OVER , mover); abc.addEventListener(MouseEvent.MOUSE_OUT , mout); function mover(e:MouseEvent):void{ var xyz:aru = new aru(); xyz.x = 380; xyz.y = 100; addChild(xyz); } function mout(e:MouseEvent):void{ removeChild(xyz); } こうすると、removeChild(xyz)が未定義のプロパティxyzへのアクセスです。となりエラーとなってしまいます。 mout関数内でxyzが定義されていないからでるエラーなのでしょうか? もしそうだとすると、期待動作を実現するにはどのようにプログラムすればよろしいのでしょうか? 以上何とぞよろしくお願いいたします!

    • ベストアンサー
    • Flash
  • actionscript 3.0 の外部リンク

    初めて質問させていただきます。 Flash CS3 のactionscript3.0にて、サイト内リンクのボタンを作成したのですが、 フラッシュを読み込んだ時点で、インスタンスthe URL4がポップアップで開いてきてしまいます。 そのような記述をしていないのでどうしたら良いか分からず… 何かお知恵をお貸しいただけると幸いです。 よろしくお願い致します。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ↓実際に書いたacitonscriptです。URLはダミーです。 //theURL1という変数に代入し、URLRequestのインスタンスを生成 var theURL1:URLRequest = new URLRequest("http://www.111/A.html"); var theURL2:URLRequest = new URLRequest("http://www.222/B.html"); var theURL3:URLRequest = new URLRequest("http://www.333/C.html"); var theURL4:URLRequest = new URLRequest("http://www.444/D.html"); navigateToURL(theURL1); navigateToURL(theURL2); navigateToURL(theURL3); navigateToURL(theURL4); // イベントリスナーの登録 A_btn.addEventListener(MouseEvent.CLICK,gotoURL1); B_btn.addEventListener(MouseEvent.CLICK,gotoURL2); C_btn.addEventListener(MouseEvent.CLICK,gotoURL3); D_btn.addEventListener(MouseEvent.CLICK,gotoURL4); // URL1へジャンプする function gotoURL1(event:MouseEvent):void { var theURL1:URLRequest = new URLRequest("http://www.111/A.html"); navigateToURL(theURL1,"_self"); } // URL2へジャンプする function gotoURL2(event:MouseEvent):void { var theURL2:URLRequest = new URLRequest("http://www.222/B.html"); navigateToURL(theURL2,"_self"); } // URL3へジャンプする function gotoURL3(event:MouseEvent):void { var theURL3:URLRequest = new URLRequest("http://www.333/C.html"); navigateToURL(theURL3,"_self"); } // URL4へジャンプする function gotoURL4(event:MouseEvent):void { var theURL4:URLRequest = new URLRequest("http://www.444/D.html"); navigateToURL(theURL4,"_self"); }

  • マウスクリックで値を送る(AS3.0)

    Flash Pro CS5 AS3.0 で記述しています。 ステージにtest_txt1とtest_txt2を配置し, クリックされたらどちらも同じ関数(testFunc)を呼び出すようになっています。 コードは stop(); test_txt1.addEventListener(MouseEvent.CLICK, testFunc); test_txt2.addEventListener(MouseEvent.CLICK, testFunc); function testFunc(evt:MouseEvent):void{ trace("呼び出された"); } ここで、どちらのテキストをクリックして呼び出されたのかを判断できるようにしたいのですが どのように記述して関数に値を渡すのでしょうか? 試しに以下のように記述したのですができませんでした。 test_txt1.addEventListener(MouseEvent.CLICK, testFunc, 1); test_txt2.addEventListener(MouseEvent.CLICK, testFunc, 2); function testFunc(evt:MouseEvent, val:int):void{ trace("val"); } よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 外部から読み込んだ画像にリンクをつけたい

    ActionScript3.0についての質問です。 ボタンをクリックした時に外部から画像を読み込んで、 読み込んだ画像にそれぞれに外部リンクをつけたいのですが、 リンクのつけ方が分かりません。 ボタンをクリックして外部から画像を読み込むところまではできたのですが、 その画像にリンクをつけるところで困っています。 超初心者ですので、できるだけ現状のプログラムを生かして変更したいのですが… どなたか分かる方がいらっしゃいましたら、教えていただきたいです。 よろしくお願いいたします。 【Main.as】 package { import flash.display.Sprite; import flash.display.MovieClip; import flash.events.Event; import flash.events.MouseEvent; import flash.display.Loader; import flash.display.LoaderInfo; import flash.net.URLRequest; import flash.display.SimpleButton; public class Main extends Sprite { private var contentMC:MovieClip; private var contentLoader:Loader; //コンストラクタ public function Main(){ //外部ファイルを配置するムービークリップの生成 contentMC = new MovieClip(); contentMC.x=0; contentMC.y=0; addChild(contentMC); //Loaderオブジェクトを生成 contentLoader = new Loader(); contentMC.addChild(contentLoader); //ボタン処理 my1_btn.addEventListener(MouseEvent.CLICK,my1Handler); my2_btn.addEventListener(MouseEvent.CLICK,my2Handler); my3_btn.addEventListener(MouseEvent.CLICK,my3Handler); } //各ボタンをクリックしたときに外部ファイルを読み込む private function my1Handler(evt:MouseEvent):void{ var url="img/flashimg01.jpg"; loadContent(url); } private function my2Handler(evt:MouseEvent):void{ var url="img/flashimg02.jpg"; loadContent(url); } private function my3Handler(evt:MouseEvent):void{ var url="img/flashimg03.jpg"; loadContent(url); } //外部ファイル読込 private function loadContent(url){ var req:URLRequest = new URLRequest(url); contentLoader.load(req); } } }

    • ベストアンサー
    • Flash