ActionScript3.0でムービークリップを入れ子にしてストップさせる方法

このQ&Aのポイント
  • ActionScript3.0を使用して、ムービークリップ(town1)の中にムービークリップ(park)を作成し、マウスオーバー時にtown1を停止させる方法を教えてください。
  • 試しにtown1.park.addEventListener(MouseEvent.MOUSE_OVER,rolloverHandler);と書いてみましたが、うまく動作しません。
  • アクションスクリプトのコードをご確認いただき、問題点を教えていただけますか?
回答を見る
  • ベストアンサー

ActionScript3.0について質問です。

ActionScript3.0について質問です。 ムービークリップ(town1)の中にムービークリップ(park)を作成して、その入れ子にしたムービークリップをマウスオーバーしたときにストップをかけたいのですが反応しません。 下のように、parkをクリックしたときにtown1を停止させたく書いてみたのですが、どこが間違っているのか分からずどなたかお力を貸してください! package{ import flash.display.MovieClip; import flash.display.Sprite; import flash.events.MouseEvent; import flash.events.Event; public class komoTown extends Sprite{ public function komoTown(){ town1.park.addEventListener(MouseEvent.MOUSE_OVER,rolloverHandler); } function rolloverHandler(event):void{ town1.stop(); } } } 分かりづらい説明ですみません! よろしくお願いします!!

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

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

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

#1&2 です 返事が大変遅れてしまいすみません。 > 「town1」はムービークリップに変換し、 > モーショントゥイーンで動かしています。 ということは root(メインのタイムライン)のフレームを使って 「town1」というインスタンス名のムービークリップを移動させている。 ということになるのではないかと思います。 もしそうであれば 「rootのタイムラインを止める必要がある」 ということになります。 したがってその場合は ご質問で書かれていらっしゃる次の文↓を function rolloverHandler(event):void{ town1.stop(); } 次のような感じ↓に変える必要があります。 function rolloverHandler(event):void{ MovieClip(root).stop(); } しかし。。。 もしそうであると, ムービー自体は Spriteクラス を継承したものではなくて MovieClip を継承したクラスになると思います。 そうである場合は ご質問で書かれていらっしゃる次の文↓を public class komoTown extends Sprite{ 次のように↓に変える必要があると思います。 public class komoTown extends MovieClip{ これに限らず, ドキュメントクラスのクラスファイルは だいたいどの場合も extends MovieClip にしておくのが無難だと思います。 Flash 自体は=Flashのメインタイムラインは ムービークリップの一種ですから。

nekoze-man
質問者

お礼

お返事ありがとうございます!! お返事来る間色々と試していたのですがやっぱり出来ませんでしたが、BlurFiltan様の言う通りやると出来ました!! ありがとうございます!!! 説明もとても分かりやすかったので大変勉強になりました!! まだまだお聞きしたい事はあるのですが、また調べてどうしても分からない事が出てきましたら、また質問を投稿するかもしれませんが、その時はよろしくお願いします!!! 有り難うございました!!!

その他の回答 (2)

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

#1です。 > 「街」は真横から見た景色になってまして、 > 左から右へスクロールしていまして、 > 無限にループさせている状態にしています。 それは 「見た目」 の問題で 「どのようにしてそう動かしているのか」 が全くわかりませんが, 私の 「単なる主観(フィーリング)」 で見たところ #1で私が書いた > 「town1」内は,少なくとも2フレーム以上のフレームからできていて, > 再生されている状態 にはなっていないのではないかと思います。 もちろん, > 「town1」内は,少なくとも2フレーム以上のフレームからできていて, > 再生されている状態 にしてもそのようなことはできますが, そうではなく なんとんなく 『「town1」 "自体" を何らかの形で動かしている』 ように思えます。 私の主観では 『「town1」 "内" のタイムラインを再生させて町を動かしている』 のではなく 『「town1」 "自体" を何らかの形で動かしている』 と思えるということです。 もしそうである場合は 「town1.stop();」 では止まりません。 「town1.stop();」 は 『「town1」 "内" のタイムラインを再生を止める』 という意味で 『「town1」 "自体" を何らかの形で動かしているのを止める』 という意味ではないからです。 『「town1」 "自体" を何らかの形で動かしている』 のでしたら その動かしている原動力を止めてください。 どうやって 「town1」 "自体" を動かしているのかわからないため それ以上答えようがありません。

nekoze-man
質問者

補足

ありがとうございます!! >『「town1」 "自体" を何らかの形で動かしている』 ように思えます。 そうです!!「town1」自体を動かしているんです!!! うまく説明が出来てなくて申し訳ありません!! そして「town1」内で動かしているフレームはありません。(すみません#1でも言っておられましたね汗) ただ「town1」内にいくつか「家」や「公園」などのインスタンス(というんでしょうか?)を作っていまして、その「公園」などの建物自体は動いてはいないんです。 動かしているのは「town1」(街全体ごと)”自体”をスクロールさせて動かしています。 「town1」はムービークリップに変換し、モーショントゥイーンで動かしています。 こんな感じなのですが大丈夫でしょうか? ほんと説明ヘタで申し訳ないです! もし解決策あればよろしくお願いします!!

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

実際に「町」やその中に「公園」の絵を描いて 書かれていらっしゃるような構造を作成し(↓下図) 書かれていらっしゃるままのスクリプトで試しましたが 普通に動作しましたよ。 ~~以下 確認です~~ > 下のように、parkをクリックしたときに > town1を停止させたく書いてみたのですが まず 「parkをクリックしたとき」 は 「parkをマウスオーバーしたとき」 の書き間違いですよね? これ↑はどうでも良いのですが 重要なのは 「town1を停止させたく」 の意味です。 スクリプトを見る限り 「town1を停止させたく」=「town1内のタイムラインの動きを停止させたく」 という意味になりますがそれでよろしいですよね? つまり 「town1」内は,少なくとも2フレーム以上のフレームからできていて, 再生されている状態ということになります。 ※私は「town1」内のフレームを100フレームほどにして 「town1」内で赤い玉のグラフィックインスタンスをモーショントゥイーンで動かしました。 そして 「town1」内には「park」というインスタンス名のムービークリップも作成しました。 あと書かれていらっしゃるスクリプトは 「komoTown.as」というファイル名を付けて 作成している Flash の FLAファイル と同じフォルダにちゃんと保存しましたか? それと 作成している Flash の FLAファイルのステージ上の何も無いところを選択して 「プロパティ」の「パブリッシュ」タブより クラスに 「komoTown」 を書きましたか(↓下図)? また, 作成している Flash の FLAファイルのメインタイムラインは フレーム1 のみで そのフレーム1に「town1」があるのですよね(↓下図)? さらに 「town1」のフレーム1に「park」があるのですよね(↓下図)? 以上のようになっていると動作すると思います。 (逆に言えば どこかが以上のようになってないと動作しない可能性があります。)

nekoze-man
質問者

補足

丁寧にご説明ありがとうございます!! それと説明不足&間違いすみません!! 「クリック」ではなくて「マウスオーバー」でした。 「街」は真横から見た景色になってまして、左から右へスクロールしていまして、無限にループさせている状態にしています。ですので、「街」の中に入れ子にしたインスタンス「公園」などをマウスオーバーしたときに、ループしている「街」を止めたいんです。最終的にはそれをクリックすると「公園」の説明が出たりさせたいと思っています。 入れ子にさせているせいなのか、子の「公園」をマウスオーバーしたときに親の「街」をうまく制御させることができないんです。 他、ファイル名、パブリッシュなどは問題ないと思います。 すみませんよろしくお願いします!! また説明不足でしたら言ってください!

関連するQ&A

  • ActionScript3.0についての質問です。

    ActionScript3.0についての質問です。 ムービークリップAの中に入れ子でムービークリップBを作成し、またその中に入れ子でムービークリップCを作成しました。 そしてこのムービークリップCをクリックできるようにしたいのですがうまくいかないんです。 こんなふうに書いてみたのですがどこが間違っているのか指摘してもらえると嬉しいです。 package{ import flash.display.MovieClip; import flash.display.Sprite; import flash.events.MouseEvent; import flash.events.Event; public class komorebi extends MovieClip{ public function komorebi(){ A.B.C.addEventListener(MouseEvent.CLICK, clickHandler); } function clickHandler(ev:Event){ signBoard.gotoAndPlay("parkUp"); } } } >A.B.C.addEventListener(MouseEvent.CLICK, clickHandler); これがちょっと怪しい気がするのですが、A.B.C ←こういった参照のしかたでよろしいんでしょうか? もし説明不足でしたらまた追記しますので言ってください! すみませんがよろしくお願いします!!

    • ベストアンサー
    • Flash
  • ActionScript3.0についての質問です

    はじめまして。 いまFlash ActionScript3.0を勉強中です。 フルスクリーンについてどうしてもわからないことがありまして 質問させていただきました。 フルスクリーン処理をasファイルで制作中で、 fullscreenボタンを押すとnormalボタンに切り替わる処理ができません。 特にエラーも起きなくて混乱中です。 すいませんがよろしくお願いします。 ※質問内容以外省略。 package { //インポート import flash.display.Sprite; import flash.display.SimpleButton; import flash.display.Stage; import flash.display.StageDisplayState; import flash.events.Event; import flash.events.MouseEvent; import flash.events.FullScreenEvent; [SWF(backgroundColor="#000000", width="600", height="400", frameRate="30")] public class Main extends Sprite { //プロパティ private var fullscreenBtn:Sprite; private var fullscreenBtn1:SimpleButton; private var normalBtn1:SimpleButton; // コンストラクタ public function Main() { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; init(); stage.addEventListener(Event.RESIZE, updatePos, false, 0, true); } // メソッド private function init():void { fullscreenBtn = new Sprite(); addChild(fullscreenBtn); fullscreenBtn.y = 6; var fullscreenBtn1 = new FullscreenBtn(); var normalBtn1 = new NormalBtn(); fullscreenBtn.addChild(fullscreenBtn1); fullscreenBtn.addEventListener(MouseEvent.CLICK,btChangeClicHandler); stage.addEventListener(FullScreenEvent.FULL_SCREEN,stageFullScreenHandler); updatePos(null); } //イベント private function updatePos(evt:Event):void { fullscreenBtn.x = stage.stageWidth - 85; } //マウスイベント private function btChangeClicHandler(evt:MouseEvent):void { if (stage.displayState == StageDisplayState.FULL_SCREEN) { stage.displayState = StageDisplayState.NORMAL; } else { stage.displayState = StageDisplayState.FULL_SCREEN; } } //ボタンの切り替え ※この処理がうまくいきません。エラーは起こりません。 private function stageFullScreenHandler(evt:FullScreenEvent):void { if (evt.fullScreen) { fullscreenBtn.removeChild(fullscreenBtn1); fullscreenBtn.addChild(normalBtn1); } else { fullscreenBtn.removeChild(normalBtn1); fullscreenBtn.addChild(fullscreenBtn1); } } } }

    • ベストアンサー
    • Flash
  • actionscript 3.0 勉強中のもです。

    よろしくお願いします。 ある右へ動いていく四角をクリックするとそれ自体のvisibleプロパティに変化(消える)を起こす事を意図して以下のような、プログラムを作りました。しかしながら、横移動の動作を確認しましたが、クリックをしても横移動を続けるだけでした。_mc.addEventListener(Event.ENTER_FRAME,onGo)を抜かした状態で見てみると、しっかり消えることを確認しました。しかし_mc.addEventListener(Event.ENTER_FRAME,onGo) を加えると上記のようになります。2つのイベントリスナーをつなげて書く事は間違った事ではないと思っています。どのように考えて書き直したらしたらよろしいのでしょうか?お心当たりございましたらどうぞよろしくお願いします。 package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; public class Main extends Sprite { var _mc:Sprite = new Sprite; function Main() { _mc.graphics.beginFill(0x334455); _mc.graphics.drawRect(0,0,120,120); _mc.graphics.endFill(); _mc.x= 130; _mc.y= 220; addChild(_mc); _mc.addEventListener(MouseEvent.CLICK,onClick2); _mc.addEventListener(Event.ENTER_FRAME,onGo); } function onClick2(event:MouseEvent):void { trace(event.target.name + "をクリックしました。"); _mc.visible= !(_mc.visible); } function onGo(event:Event):void { if(_mc.visible=true) { _mc.x += 1 } } } }

    • ベストアンサー
    • HTML
  • actionscript初心者です。importに

    友人に教えてもらったプログラムを練習用に解読?しています。 以下のプログラムにおいて、 importを含んだ時 importを含まない時(2つを消してしまった場合)では プレビューにおいては両者とも問題なく動作しますが 以下に、importを加える必要があるのでしょうか? よろしくお願い致します。 import flash.display.Sprite; import flash.events.MouseEvent; var circle1:Sprite = new Sprite(); circle1.graphics.beginFill(0xFFCC00); circle1.graphics.drawCircle(20, 20, 20); circle1.buttonMode = true; circle1.addEventListener(MouseEvent.CLICK, clicked); var circle2:Sprite = new Sprite(); circle2.graphics.beginFill(0xFFCC00); circle2.graphics.drawCircle(120, 40, 40); circle2.buttonMode = false; circle2.addEventListener(MouseEvent.CLICK, clicked); function clicked(event:MouseEvent):void { trace ("OK"); } addChild(circle1); addChild(circle2);

    • ベストアンサー
    • Flash
  • actionscript 3.0 勉強中のもです。

    ある四角の枠状のものを加速をつけて落下させることを意図して入力をしましたが、ただいま以下のプログラミングにおいて「外部からの表示可能な複数の定義は使用できません。」とメッセージを受けました。当方、勉強中にて全くメッセージ内容の見当がつきません。もしご回答、アドバイス等いただけましたら助かります。またプログラムの書き方についても以下でお気づきの点がありましたら、ご指導いただければ幸いです。 よろしくお願い致します。 package{ import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; public class Rakka extends Sprite{ var maru_mc:Sprite = new Sprite; maru_mc.graphic.lineStyle(6,0xee0033) maru_mc.graphic.drawRect(0,0,120,120) var i:int; this.addChild(maru_mc); maru_mc.addEventListener(Event.ENTER_FRAME,goBound); stage.addEventListener(Event.MouseEvent,onEnter); } function onEnter(e:MouseEvent):void{ maru_mc.x = mouseX maru_mc.y = mouseY } function goBound(e:Event){ i = 5; mouse_mc.y = mouse_mc.y +i*y/100 } }

    • ベストアンサー
    • 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
  • ActionScript3.0について質問です

    初めまして、よろしくお願いします。 いまActionScript3.0を勉強中なのですが、どうしても分からないとこがあるので質問させてください。 あるAC3.0の教材で、下のスクリプトが載っていたのですが、そこに書かれてある「mc.x0 = mc.x;」はなにをしているのでしょうか? ムービークリップのxの位置を0に設定しているのかなと思ったのですが、それでしたらmc.x=0; でいいと思ったので、さっぱりわかりません。 どなたかすみませんが、素人の僕にでも分かりやすく説明してもらえると助かります! よろしくお願いします!! package{ import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; public class Maru extends Sprite{ public function Maru(){ //コンストラクタ var mcList:Array = new Array(); mcList.push(A_mc); mcList.push(c_mc); mcList.push(t_mc); mcList.push(i_mc); mcList.push(o_mc); mcList.push(n_mc); mcList.push(S_mc); mcList.push(c2_mc); mcList.push(r_mc); mcList.push(i2_mc); mcList.push(p_mc); mcList.push(t2_mc); for(var i:int = 0; mcList.length; i++){ var mc:MovieClip = mcList[i]; mc.x0 = mc.x; mc.x = 100; mc.addEventListener(Event.ENTER_FRAME, enterFrameHandler); } } function enterFrameHandler(ev:Event):void{ var mc:MovieClip = ev.target as MovieClip; var goalx:Number = mc.x0; moveStr(mc, goalx); } function moveStr(targetmc:MovieClip, goalx:Number):void{ if( goalx - targetmc.x < 0.5 ){ targetmc.x = goalx; targetmc.removeEventListener(Event.ENTER_FRAME,enterFrameHandler); }else{ var easing:Number = 0.15; targetmc.x += (goalx - targetmc.x) * easing; } } } }

    • ベストアンサー
    • Flash
  • AS 3 mouseout & over

    以下のようにMOUSEOUT,MOUSEOVERをつかって、 インスタントにマウスオーバーするとその幅が増えていき、幅200のところで止まる。 インスタントからマウスアウトするとその幅が減っていき、幅60のところで止まる。 という事を意図して、記述しました。 しかしながら、マウスオーバーの内容は意図した通りのいくのですが、 マウスアウトの場合は少し幅が減っただけで、すぐに止まってしまいます。 どのように直せば、意図した通りに行くのでしょうか? お知恵をいただければ幸いです。 package { import flash.events.MouseEvent; import flash.events.Event; import flash.display.Sprite; public class main extends Sprite { var _sikaku:Sprite = new Sprite(); public function main(){ _sikaku.graphics.lineStyle(6,0x330066); _sikaku.graphics.drawRect(0,0,120,120); this.addChild(_sikaku); _sikaku.addEventListener(MouseEvent.MOUSE_OVER,big_off); _sikaku.addEventListener(MouseEvent.MOUSE_OUT,big_on); function big_on(event:Event):void { _sikaku.addEventListener(Event.ENTER_FRAME,tijimi); function tijimi(event:Event):void { if(_sikaku.width==60 ) { _sikaku.removeEventListener(Event.ENTER_FRAME,tijimi); } if(_sikaku.width > 60) { _sikaku.width -= 1} trace("stop!") } } function big_off(event:Event):void { _sikaku.addEventListener(Event.ENTER_FRAME,kakudai); function kakudai(event:Event):void { if(_sikaku.width < 200) { _sikaku.width += 1 trace("stop?") } if(_sikaku.width == 200) { _sikaku.removeEventListener(Event.ENTER_FRAME,kakudai); } } } } } }

  • 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.0 自作ファイルのインポートしてnewができない

    AS3.0 自作ファイルのインポートと、newの仕方 flashCS3でWIndowsXP使用 下は、classA.asファイル package{ import flash.events.MouseEvent; import flash.events.Event; import flash.display.MovieClip; public class Bom{ var stage:MovieClip; public function Bom(stage:MovieClip){ this.stage = stage; } } } これを、あるフラッシュプロジェクトのタイムラインで使用したい。 import classA.as var bom = new Bom(stage); こうすると見て意義である可能性が高いBom()の呼び出しです。 とエラーが出ます。 解決方法を教えてください。 インポートはたぶん成功しています。

専門家に質問してみよう