Flash AS3.0初心者の疑問:ムービークリップからテキストボックスの座標を取得する方法

このQ&Aのポイント
  • AS3.0を勉強中の初心者が、ムービークリップからテキストボックスの座標を取得する方法について質問しています。
  • ローカルテストでは正常に動作しているが、ムービークリップからの参照方法がわからず、エラーが発生しています。
  • AS2.0までは_rootや_parentを使用してパスが通ったが、AS3.0では使えないようです。どのようにすればよいでしょうか?
回答を見る
  • ベストアンサー

Flash AS3.0 初歩的な質問

現在AS3.0を勉強中です。 基本中の基本だと思いますがパスが上手く通っていないようなので ご教授願いたく。 1.ステージ上にテキストボックス(ダイナミックテキスト)を配置しインスタンス名を「hako」としています。 2.rootに以下のスクリプトを記述 ------------------------------------------------- addEventListener(Event.ENTER_FRAME,syori); function syori(eventObject:Event):void { hako.text=String(stage.mouseX); } ------------------------------------------------- ここまでは問題なく動作しています。 2をrootでは無く任意のムービークリップから処理させるべく・・・ 3.「abc」というインスタンス名のムービークリックを作成しステージに配置。この1フレーム目に以下のスクリプトを記述 ------------------------------------------------- addEventListener(Event.ENTER_FRAME,syori); function syori(eventObject:Event):void { parent.hako.text=String(stage.mouseX); } ------------------------------------------------- ※この際、2でrootに記述したスクリプトは消しています。 これで動くと思ったのですがエラーがでます。(ToT;) 「parent.hako.text」の部分を「root.hako.text」としてもエラーがでます。「_parent」も「_root」も駄目です。(「_」付はAS2.0までですよね?) 今回はダイナミックテキストは使った例ですが、 単純にムービークリップをステージに配置して、その座標を指定するような処理でも、 他のムービークリップから別のムービークリップを参照する方法が解りません(汗) どうすればよいでしょうか? AS2.0までは上記のような形でパスが通ったと思うのですが・・・

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

  • ベストアンサー
  • cspl
  • ベストアンサー率83% (55/66)
回答No.1

まず最初に、AS3ではムービークリップごとにそれぞれのフレームに記述する方法はお勧めできません。どうしても使用したい場合も、addEventListenerなどを使用して、parentなどの他のムービークリップにアクセスするような記述は極力避けるように書かなければAS3で書くメリットはあまりないです。 それを前提とした上で、parentへは以下のようにアクセスします。 ------------------------------------------------- function syori(eventObject:Event):void { //parentを一旦変数に入れる。 var p = parent; p.hako.text=String(stage.mouseX); } ------------------------------------------------- あるいは下記のようにしてもOKです。 ------------------------------------------------- function syori(eventObject:Event):void { var m = this; m.parent.hako.text=String(stage.mouseX); } ------------------------------------------------- とはいえ、AS3ではフレームごとに記述する方法はデメリットが多いので、卒業された方が良いと思います。本格的に勉強されるということでしたら、できればクラスを使った記述方法を身につけましょう。熟練した人はほとんど他のMCへ干渉する記述やparentなどの記述は書きません。それがAS3(というより一般的なオブジェクト指向のプログラム言語)の一般的な記述方式であり、身につけておかなければならない知識だと考えてください。

pory_bekk
質問者

お礼

>csplさん ご回答、そしてアドバイスありがとうございます。 おっしゃる通り、parentへのアクセスは AS3によって記述方法がちょっと変わっただけで 今までAS2/1でやってた事と変わってないなと感じていました。 >AS3ではムービークリップごとにそれぞれのフレームに記述する方法はお勧めできません これも薄々と感じていました。orz とすれば、スクリプトを記述する場所というのは基本的にメインのタイムライン(フレーム)上のみという事になるのでしょうか? また、それぞれのMCが独立して、それ単独で処理が完結するような場合も ムービークリップごとにそれぞれのフレームに記述するのはよくないと考えるべきでしょうか? 例:MC1=アナログ時計、MC2=マウスポインタ座標表示 MC1,MC2共にそれぞれのムービークリップ内の第一フレームにスクリプトを記述しており単独で全て完結。 新規で作ったflaファイル等(例えばnew.fla)に MC1,MC2を配置するだけでそれぞれの機能を果たす。 ここで言いたいのは、new.flaのメインのタイムライン上に MC1とMC2の処理を記述した方が良いのか?という事です。 今までの自分なら、マウスポインタの座標がx=500になったら アナログ時計を一旦12時にリセットする等といった処理を MC2の中に書いていました。まさにparentを参照する書き方ですね。(涙)

その他の回答 (1)

  • cspl
  • ベストアンサー率83% (55/66)
回答No.2

>とすれば、スクリプトを記述する場所というのは基本的にメインのタイム >ライン(フレーム)上のみという事になるのでしょうか? あくまでケースバイケースですが、申し上げたのはクラスを使用して書く場合によるルールです。できればメインタイムラインにひとまとめできれば好ましいですが、それでは冗長になる場合がありますよね。 >また、それぞれのMCが独立して、それ単独で処理が完結するような場合も >ムービークリップごとにそれぞれのフレームに記述するのはよくないと考 >えるべきでしょうか? 一般的に言うのであれば、フレーム自体に書くことが好ましいと言えないです。 この「単独で処理が完結する」ムービークリップごとのフレーム上に書く、ということ自体はムービークリップにつきそれぞれクラスを用意して結びつけることと、考え方はほとんど変わりありません。 ですが、AS3を使用した実際の仕事ではほとんどの人はクラスを使用します。クラスを使用すればそれだけ享受できるメリットがあるからです。 具体的な記述方法についてはここでは言及しませんが、もしこの先も「自分一人で作るのだから動けばいい」というスタンスでやるのであれば、AS2でもAS3でもタイムラインに記述する方法でまったく構いません。が、もしも将来的なことを見据えて勉強されているのであれば、クラスを使用した記述やオブジェクト指向の書き方も覚えておかなければならないということです。 タイムラインに書くのに慣れた方にとっては覚えることが多くて大変ですが、そもそもAS3を勉強するというのは、他の人が書いたものを理解できるようになる、ということが前提ですので、がんばってみてください。

pory_bekk
質問者

お礼

>csplさん ご回答ありがとうございます。 AS3に対する考え方など非常に勉強になります。 Flash4末期の頃からコンテンツ制作に携わっており 業務でも、それなりの数作ってきましたが全て独学でなんとかやってきたので、常に「これでいいのか?」的な疑問がまとまわりついている状態です。 長年この業界にいるのですが自分の周りで自分よりFlash(あるいはAS)に詳しい人物に会った事が無いので、 解らないことや疑問点などが頻繁に出てくるのに対して 「これはこうだ!」と明確に答えてくれる人、あるいは 私はこういう考え方に基づいてこういうやり方をしている。 等、はっきりした回答をしてくれる人が周りにいなくていつもwebでの質問頼りで困り果てています。 でもcsplさんの回答を読んで、また少しやる気が出ました。 ありがとうございます。

関連するQ&A

  • 【AS3】ムービークリップからステージへアクセスできません

    はじめまして。FlashでAction Script3.0を勉強し始めたばかりの初心者です。 実は、AS3でどうしても不明な部分があり この度問い合わせさせていただいております。 AS2では_rootでステージにあるムービークリップにアクセスできたかと思うのですがAS3では代わりのものはあるのでしょうか。 現在ステージ上にいくつかムービークリップを置いて、 それぞれのムービークリップ最後のタイムラインに、 「root.gotoandPlay("scene1")」というように記述して、 ステージにもどり、そのフレーム名から始めたいのですが(この場合、scene1というステージ上のフレームから再生させたい) 「未定義である可能性のgotoAndPlayメソッドを静的型flash.display:DisplayObjectContainerの参照を使用して呼び出しました」というエラーになってしまいます。 外部クラスなどは使用しておらず、 ライブラリに格納してあるムービークリップをステージに配置し、 初めのムービークリップを再生したら、次のムービークリップを再生、、というふうに順々に表示させていきたいのですが・・ アドバイスをいただけると大変助かります!! よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • AS3:ルートの変数とムービークリップ内の変数について

    AS3:ルートの変数とムービークリップ内の変数について ルートのタイムラインで設定した変数var RootVarがあるとして、これをあるムービークリップMCからMovieClip(root).RootVarで読み取って、MC内で何か処理をしたときMovieClip(root).RootVar++;とやってもルートのRootVarの値は変わりません。 例えば、 ■ルートのタイムライン1フレームに記述 var RootVar:uint; if(RootVar>=3){ trace("できた!!"); } ■ステージにあるムービークリップMCのタイムライン1フレームに記述 MovieClip(root).RootVar=0; var AddTimer:Timer = new Timer(1000,3); AddTimer.addEventListener(TimerEvent.TIMER,AddNum); AddTimer.start(); function AddNum(eventObject:TimerEvent):void { MovieClip(root).RootVar++; } ルートからムービークリップ、ムービークリップからルートへ変数に値を渡したり受け取ったりはできなのでしょうか? 変数の扱い方が問題なのでしょうか?よろしくお願いします。 環境:AS3、Flash CS4

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

  • flashcs4 as3.0のエラーについて

    フレーム1にボタンを配置して ボタン(myb)を押すと、ボタンが消えると同時にマウスがmc表示に変わり mcをドラッグしてmc1に当たると、フレーム2の画面が表示するようにしたいのですが ムービープレビューして試してみると、フレーム2の画面(TツールでCLEARを書いているだけ)は表示するのですが、次のエラーが表示されてしまいます。 「TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。」 どのように回避したらよいのでしょうか。よろしくお願いいたします。 stop(); mc.visible=false; myb.stage.addEventListener(MouseEvent.CLICK, mystart); function mystart(event){ myb.visible=false; Mouse.hide(); mc.visible=true; mymouse(event); } mc.stage.addEventListener(MouseEvent.MOUSE_MOVE,mymouse); function mymouse(event):void{ mc.x = stage.mouseX; mc.y = stage.mouseY; event.updateAfterEvent(); } mc.stage.addEventListener(Event.ENTER_FRAME,mymc); function mymc(e:Event):void{    if(mc1.hitTestObject(mc)){ gotoAndStop(2); } }

    • ベストアンサー
    • Flash
  • パスの書き方 AS3

    シーン1にムービークリップ(インスタンス名mcop)を配置し、mcopの1フレームにムービークリップ(mc)とobject1(グラフィック)を配置、mcの1フレーム目にアクションスクリプト(ActionScript3)を配置します。 アクションスクリプトからobject1を非表示にする指示を出したいのですがうまくできません。 パスの書き方をアドバイスください。(同階層ではうまく非表示に出来ます。) root.mcop.object1.visible = false;  こんな感じでやってみましたがだめでした。

    • ベストアンサー
    • Flash
  • flashcs4 as3.0のエラーについて

    TypeError: Error #1010: 条件は未定義であり、プロパティがありません。 at 2mouse_03_fla09_as3_fla::MainTimeline/mymouse() 以下のスクリプトを実行すると上記のエラーが発生してしまいます。 ネットで調べてもわかりませんでした。AS3.0を学習していることろです。 よろしくお願いいたします。 ---------------------------------------------------------- やっていることは、マウスをMC(mc)に変換して、mc1との当たり判定をしたいだけです。 実行すると、実行画面でマウスを動かすと同時に上記のエラー出てしまいます。 ----------------------------------------------------------- stop(); mc.visible=false; myb.stage.addEventListener(MouseEvent.CLICK, mystart); function mystart(event){ myb.visible=false; Mouse.hide(); mc.visible=true; mymouse(event); } mc.stage.addEventListener(MouseEvent.MOUSE_MOVE,mymouse); function mymouse(event):void{ mc.x = stage.mouseX; mc.y = stage.mouseY; mc.event.updateAfterEvent(); } mc.stage.addEventListener(Event.ENTER_FRAME,mymc); function mymc(event){ if(mc1.hitTestObject(mc)){ mc.stage.removeEventListener(Event.ENTER_FRAME,mymouse); mc.visible=false; } }

    • ベストアンサー
    • Flash
  • Flash フレームを指定してムービークリップ再生

    ActionScript超初心者です。 よろしくお願いします。 ステージ上にボタン「A」「B」「C」を配置、 ボタン脇のスペースにムービークリップを配置、各ボタンで切り替え再生させたいと思っています。 2フレーム目に簡単なアニメーションのムービークリップ「animA」を、 3フレーム目に同様の「animB」4フレーム目に「animC」を配置し、 各ボタンon (release)で各ムービークリップの再生をしたいのですが うまくいきません。 どこにどのようなスクリプトを書けば良いか教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • AS3でステージのサイズ変えた時にムービークリップが減速して中央に移動

    AS3でステージのサイズ変えた時にムービークリップが減速して中央に移動するFlashの作り方で悩んでいます。 参考にしてるものはこれなんですが↓ http://hfm-kenchan.com/Lesson/sample/centermovie11/top.htm これをActionScript3で作ろうと今現在このようにコーディングをしています。 ※my_mc:ステージ中央にあるムービークリップ stage.align=StageAlign.TOP_LEFT; stage.scaleMode=StageScaleMode.NO_SCALE; stage.addEventListener(Event.RESIZE, resize_control); function resize_control(eventObject:Event):void { my_mc.x = (stage.stageWidth - my_mc.width)/2; my_mc.y = (stage.stageHeight - my_mc.height)/2; const spd:Number=1/5; my_mc.addEventListener(Event.ENTER_FRAME, center_movie); function center_movie(event:Event):void { my_mc.x += ((stage.stageWidth - my_mc.width)/2 - my_mc.x)*spd; my_mc.y += ((stage.stageHeight - my_mc.height)/2 - my_mc.y)*spd; } } 現在はリサイズするとmy_mcはステージ中央にいるのですが参考にしてるものみたいに減速して中央に移動するというものが作れません。 どうしたらいいのかどなたかアドバイスしていただけませんか? よろしくお願いします。

    • ベストアンサー
    • Flash
  • Flash リンケージ

    ステージ上に空のムービークリップを配置して、そこにjpg画像を読み込む実験をしています。 loadMovieを使えば、外部のjpg画像を読み込めるのですが、 今やりたいのはflash内に画像を読み込んで、ライブラリ内にあるビットマップ画像(jpg)に対して、識別子を付けてスクリプト処理で表示させるというものです。 1.ステージに空のムービークリップ「mc」(←インスタンス名)を配置しています。 2.ライブラリ内のビットマップ画像には「p1」という識別子を付けています。 「p1」の識別子を使った表示方法が解らなかったので、とりあえず今はビットマップ画像を一旦新しいムービークリップで包んでそのムービークリップの識別子を「c1」として、 ルート上に mc.attachMovie("c1,"mc2",1); というように書いて、表示させています。 が、これではやりたい事と違います。 ライブラリ内のビットマップ画像に付けた識別子「p1」を利用して、 その該当するjpg画像をステージ上に配置(表示)させるにはどうすればよいでしょうか? FlashのバージョンはMXもしくは8 ASは1.0もしくは2.0です。

  • AS3:ステージリサイズするとムービークリップをすべて削除して何秒か後

    AS3:ステージリサイズするとムービークリップをすべて削除して何秒か後にまた、ムービークリップを設置。 ステージ横一杯にムービークリップ(以下MC)を縦2列で並べてステージをリサイズするたび、 MCをすべて削除してまた横一杯にMCを2列で並べるというものを作成中なのですが、リサイズの仕方によってはMCが何個か残ってしまいMCを再配置できないという現象がおきます。 以下のようにコーディングしているのですがどこが問題なのでしょう? 環境:AS3、Flash CS4、MC:W:80xH:100 Set(); stage.align=StageAlign.TOP_LEFT; stage.scaleMode=StageScaleMode.NO_SCALE; stage.addEventListener(Event.RESIZE,AddMC); function AddMC(eventObject:Event):void { var delate:uint=mc.numChildren; for (var k:uint=0; k<delate; k++) { mc.removeChildAt(k); } if (delate<=0) { var SetTimer:Timer=new Timer(500,1); SetTimer.addEventListener(TimerEvent.TIMER,ReAdd); SetTimer.start(); function ReAdd(eventObject:TimerEvent):void { Set(); } } } // function Set():void { var yoko:uint=Math.ceil(stage.stageWidth/80); for (var i:uint=0; i<yoko; i++) { for (var j:uint=0; j<2; j++) { var BX:MovieClip=new box(); mc.addChild(BX); BX.x=40+80*i; BX.y=50+100*j; } } } よろしくお願いします。

    • ベストアンサー
    • Flash

専門家に質問してみよう