• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ActionScript2.0)

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

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

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

  • ベストアンサー
  • 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

専門家に質問してみよう