ActionScript2.0でドラッグ可能なムービークリップを作成する方法とは?

このQ&Aのポイント
  • 初心者のためのActionScript2.0でドラッグ可能なムービークリップを作成する方法について解説します。
  • ドラッグ可能なムービークリップを作成する際、ボタンとの連携に問題が発生することがあります。本記事では、ムービークリップのドラッグを可能にしながらもボタンを正常に動作させるための方法を紹介します。
  • ムービークリップのドラッグとボタンの連携において、適切なスクリプトを組むことがポイントです。具体的な実装方法として、ムービークリップにドラッグ開始と終了のイベントを設定し、ボタンには別のスクリプトを組むことで、両方の機能を同時に実現することが可能です。
回答を見る
  • ベストアンサー

ActionScript2.0

actionscript2.0で作成をしている初心者です 今、ドラッグが可能なムービークリップを作成し、 その下の階層にボタンを作成しています。 onClipEvent (enterFrame){ this.onPress = function(){ドラッグ開始} this.onRelease = function(){ドラッグ終了} this.button1.onPress = function(){ボタン押した処理} [現状] ムービークリップをドラッグ不可能にすれば、ボタンを押すことは可能なのですが、ドラッグ可能にするとボタンが押せなくなります。 ムービークリップのドラッグが可能で、かつムービークリップ階層下のボタンを有効にするためにはどうしたらよいでしょうか。 宜しくお願いします

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

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

その現象云々の前に, スクリプトがよろしくないのでそこの部分を訂正して, その訂正したスクリプトを元に方法を書いて行きます。 onClipEvent (enterFrame){} の {} 内は 1フレーム進む時間毎に毎回実行されます。 仮に フレームレートを 12fps に設定していたとするなら, 1秒間に12回も動作します。 1秒間に12回も同じ onPress や onRelease や onPress イベントハンドラメソッドを定義する必要はありません。 例えば num=5; を定義したい場合に, num=5; num=5; num=5; num=5; num=5; num=5; num=5; num=5; num=5; num=5; num=5; num=5; num=5; num=5; num=5; num=5; num=5; num=5; … のように決まりきったことを,毎フレーム書き続けるのと同じことです。 CPU の無駄づかいになることは当然のことで, 思わぬ不具合を招くおそれもあります。 例えば,  ボタンで,  on(relesase){    num=10;  }  を実行したのに num は 5 にしかならない! というような不具合です。 その形(Flash 5 形式 の onClipEvent)を使うのでしたら, onClipEvent (load){} を使うべきでしょう。 その他色々場合でも, onClipEvent (enterFrame) {} や ○○.onEnterFrame = function() {}; は,  ・その意味を理解した上で  ・それが本当に必要だという場合に  ・それを使っているということを常に意識しながら 使うべきスクリプトです。 ===回避策1(1)=== ご質問の状態を回避するには, 根本的には Flash など全く関係なく, ごく普通に 【下の図】↓ のようなものを考えれば簡単です。 【下の図】↓のように, ボタン(button1)の下レイヤーに,透明なボタン(button0)でも用意して, スクリプトを次のようにすれば変更すれば良いだけです。 --------------------------------- onClipEvent (load) { this.button0.onPress = function() { //ドラッグ開始 this._parent.startDrag(); }; this.button0.onRelease = function() { //ドラッグ終了 this._parent.stopDrag(); }; this.button1.onPress = function() { //ボタン押した処理 trace("button1 が押されました"); }; } --------------------------------- ===回避策1(2)=== button1 を押したときもドラッグを開始させたいのでしたら, 上の回避策1(1)の状態のまま, スクリプトだけを次のように変えれば良いです。 --------------------------------- onClipEvent (load) { this.button0.onPress = function() { //ドラッグ開始 this._parent.startDrag(); }; this.button0.onRelease = function() { //ドラッグ終了 this._parent.stopDrag(); }; this.button1.onPress = function() { //ドラッグ開始 this._parent.startDrag(); //ボタン押した処理 trace("button1 が押されました"); }; this.button1.onRelease = function() { //ドラッグ終了 this._parent.stopDrag(); }; } --------------------------------- 回避策1(1) または 回避策1(2) の方法を使えばたいてい問題ないと思います。 透明ボタンが嫌(上にあるのでじゃま)でしたら, 別に 「ムービークリップのベースになるもの」 の下に(下レイヤーに) 不透明ボタンを作っても良いわけですし。 とにかくボタン(button1)の下に別のボタンを作成すれば良いというだけのことですから, その辺は適当にすれば良いと思います。 ===回避策2=== 以下の方法は普通に考えるだけでは出てこない方法かもしれませんが, Googleなどで調べると比較的すぐに出てきます。 上の回避策1のようなことを 「あえてしない(したくない)」 とか, 「そうしても回避できないことが残る」 とか, 「そうできない状況にある」 という場合は, MovieClip.hitTest(当たり判定) を使うのが 定石(お決まり) の手段となっています。 hitTest(当たり判定) は, ムービークリップ内のものに対して使っても ムービークリップ自体に使ってもどちらでも良いのですが, ご質問の場合は ムービークリップ内のもの が Buttonインスタンス なので使いにくいため, ムービークリップ自体とマウスとの当たりを判定するスクリプトにします。 回避策1 のように透明なボタンは "作らず", ムービークリップ内は "元のまま" で, スクリプトのみを次にように変えます。 (Flash 5 形式を使用したままの場合) --------------------------------- onClipEvent (mouseDown) { // もし このムービークリップがマウスの座標にヒットしていれば if (this.hitTest(_root._xmouse, _root._ymouse, true)) { //ドラッグ開始 this.startDrag(); } } onClipEvent (mouseUp) { //ドラッグ終了 this.stopDrag(); } onClipEvent (load) { this.button1.onPress = function() { //ボタン押した処理 trace("button1 が押されました"); }; } --------------------------------- ただし, この 回避策2 の方法(一般的な定石手段)は, 本当に this.button1.onPress も startDrag() も同時にはたらいてしまいます。 つまり 「button1 を押そうとしただけなのに ムービークリップが動いてしまった」 などという現象が起こります。 それを「良し」とするか「悪し」とするかは,場合によるって変わるので私には判断できません。 ※ 後々このページを見る方のため    ---なるべく正確なバージョン情報---  回避策1 のスクリプトも 回避策2 のスクリプトも,  ベースは Flash 5 形式ですが,  onPress などのイベントハンドラメソッド を使っているため  Flash MX 以上で使用可能。  Flash Player 6 以上用 SWF パブリッシュで動作可能。  ActionScript 1.0 。  (ActionScript 2.0 設定でパブリッシュしてもOK。)  

tuuwing
質問者

お礼

詳細な解決方法をご教授いただきありがとうございました! 教えていただいた方法で修正したいと思います ありがとうございました!!

関連するQ&A

  • ActionScript2.0のイベントについて

    親ムービークリップに配置した子ムービークリップのイベントが実行されなくて困っています。 親ムービークリップ自体には下記のイベントを設定しています。親ムービークリップはattachMovieで動的に配置しています。 onRollOver・・・onEnterFrameを設定 onRollOut・・・onEnterFrameを削除 子ムービークリップを配置して子ムービークリックにイベントを設定しました。onEnterFrameをは実行されますが、onReleaseが実行されず困っています。 function Parent() { this.onRollOver = function() { this.onEnterFrame = function(){・・・} } this.onRollOut = function(){ delete this.onEnterFrame; } this["child_mc"].onRelease = function() { trace('a') // 実行されない } this["child_mc"].onEnterFrame = function() { trace('b') // 実行される } } ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ _root.attachMovie("Parent", "parent_mc", _root.getNextHighestDepth(), new Parent()); 子ムービークリップはオーサリングで静的にParentに配置し、プロパティでchild_mcと設定しています。 onReleaseは実行できず、そこで止まっています。 なんでも良いので教えてください。

    • ベストアンサー
    • 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(); などと苦し紛れにやってみましたが、すべて同じように怒られます。 どのようにすれば、下の階層から一番上の階層の別フレームに 移動することができますでしょうか? よろしくお願い致します。

  • Flash MX ActionScriptのEnterFrame

    Flash 初心者です。 クリップアクションの、 onClipEvent (enterFrame) { } がいまいちよくわかりません。 フレームが1フレームだけのルートのタイムラインに、 何の動きもないムービークリップオブジェクト(これも1フレームのみ)を1つ置いたとします。 そのムービークリップに、例えば、 onClipEvent (enterFrame) { _rotation+=20; } とアクションをつけたとします。 これを再生すると、回転し続けますよね。 これはルートのタイムラインが1フレームだけでも、 それがループしていると考えると、納得できるのですが、 1フレーム目に、this.stop();を記述しても、 回転し続けます。 enterframeとはどのように解釈すればいいのですか? ルートのタイムラインが再生される度に呼び出されるということでは ないのでしょうか? よろしくお願い致します。

  • actionscript2.0から3.0へ、

    actionscript2.0から3.0へ、 actionscript2.0から3.0へ、 大変申し訳ございませんが、 どなたか書き換えていただけないでしょうか? 情報が足りない場合ご指摘くださいましたら 追記いたします。 flash8にて制作されたFlaをCS4にて修正しています。 3.0がわかるものが出来なくなってしまったので、 こちらに書かせていただきました。 400フレームのものなのですが、1フレームに下記のスクリプトがあります。 btnSkip.onRelease = function() { this._visible = false; gotoAndStop("end"); btnRepeat._visible = true; } 400フレーム目には下記のスクリプトがあります。 stop(); btnRepeat._visible = true; btnSkip._visible = false; btnRepeat.onRelease = function() { gotoAndPlay("start"); this._visible = false; btnSkip._visible = true; } みたところステージには、スキップとリピートのムービークリップがあります。 スキップをクリックすると、400フレーム目に飛んでストップ、リピートを押すと1フレーム目に戻って再生、という動作です。 修正前(2.0)は正常に動作していました。 これを3.0に書き換えていただきたいのです。 大変恐縮なのですが、大至急直さないといけないのです。。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • プルダウンメニューの移動

    ムービークリップ(インスタンス名:menu)を作成し、 その中にムービークリップ(インスタンス名:head)を作成しました。 head をマウスで動かすスクリプトは以下のようになっていて動かすことができます。 onClipEvent(load) { //ドラッグを開始します function dragFunc() { this.startDrag(frame, -400, -300, 400, 300); } //ドラッグを終了します function dropFunc() { this.stopDrag(); } } on(press) { this.dragFunc(); } on(release, releaseOutside) { this.dropFunc(); } しかし、head をドラッグして、menu を動かすことができません。(this を menu、menu.head に変更しても) どのようにしたら、いいでしょうか?

    • ベストアンサー
    • Flash
  • 立体回転運動 新たにボタンを作って一定角度だけ動かす

    お世話になります。 下記のプログラムは3Dのぐるぐる回るプログラムなのですが、 onClipEvent (load) { degree = 0; r = 100; centerx = 150; centery = 100; } onClipEvent (enterFrame) { radian = Math.PI/180*degree; this._x = centerx+r*Math.cos(radian); this._y = centery+r*Math.sin(radian)/2; this._xscale = this._yscale=this._alpha=this._y; degree += 5; } -------------------------------------------------------------------- それで、ここからなのですが、 onClipEvent (enterFrame) {  --省略-- degree += 5;  ↓ のところをまず削除して、新たにボタンを作って、そのボタンを押すと、 押すたびにある一定の角度分だけ円運動するようにしたいのですが、どうしたらいいんでしょうか? 単純にボタンを作って、 そこに on(release) { degree +=5; } と書いてもまともに動きません。 初心者なものなので、よろしくお願いします。 それと、このプログラムはムービークリップに記載されているのですが、出来たらルート画面のレイヤーにactionを作って、そこにスクリプトをまとめて書きたいと思うんですが、どうしたらいいんでしょうか?ムービークリップにインスタント名をつけて、上記のプログラムの前に、 ムービークリップインスタント名.onClipEvent (load) { --省略-- } ムービークリップインスタント名.onClipEvent (enterFrame) { --省略-- } としたら、フィールド名がありませんとエラーが出てしまいます。 長くなってしまいましたが、わかりずらい説明かとは思うのですが、重ねてよろしくお願いします。

  • ActionScript 2.0 再生・停止

    クリックで特定のムービークリップが再生・停止するスクリプトをAS2.0(ActionScript 2.0)で記述したいです。 現在はAS1.0で下記のようにムービークリップに記述しています。 これをAS2.0に直すとどのような記述になるでしょうか。宜しくお願いいたします。 onClipEvent (load) { mode = true; } on (release) { mode = !(mode); if (mode) { this.play(); } else { this.stop(); } }

    • ベストアンサー
    • Flash
  • loadMovieしたムービークリップのボタン化

    ムービークリップにloadMovieで1.jpgをロードし、それをボタンにしたいのですが、下のスクリプトではうまく動作しません。 menu01_mc.loadMovie("1.jpg"); menu01_mc._xscale=10; menu01_mc._yscale=10; menu01_mc.onRelease = function(){ gotoAndStop(5); } 最初のloadMovieの部分をなくし、 menu01_mc.onRelease = function(){ gotoAndStop(5); } とするとちゃんと動作します。 loadMovieしたムービークリップはボタンにできないのでしょうか? FlashCS3、actionscript2.0で作成しています。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • actionscript

    FLASHを作成してますが、actionscriptでつまずいています。 シーンが1~5まであるFLASHで、 添付の画像のようなものです。 シーン2が 左のメニュー一覧はムービークリップになっていて、 その中にボタンがある状態(入れ子?)です。 ボタンをクリックするとシーン1の先頭に飛ぶようにしたくて on (release) { this._parent._parent.gotoAndStop("シーン 1","1"); } と書きましたがうまくいきません。 詳しい方いましたら教えてください

    • ベストアンサー
    • Flash
  • _alphaで消えません。。。。

    質問です。(FLASH8です) メインのタイムラインのムービークリップword_mcの中にactionscript、this.loadVariables("food1.txt");で 同じタイムラインのダイナミックテキストに呼び出しています。 メインのタイムラインにあるムービークリップword_mcに onClipEvent(enterFrame){ this._aplha=0; } と記述したのですが中の文字が消えません。 どなたかよろしければ教えてください。

    • ベストアンサー
    • Flash

専門家に質問してみよう