dポイントプレゼントキャンペーン実施中!

ボタンにロールーバーしたら、別のムービーが指定位置にやってくる、みたいなものを作成したいのですが、どうしたらいいのでしょうか?

A 回答 (2件)

#1です。


普段はカーソルとともに移動していて、ボタンにカーソルが重なった時に指定の位置に移動する・・・といったもので、よろしいでしょうか?


まず、ムービークリップの移動に関しては、enterFrame イベントを利用して、ムービークリップの座標を常にカーソルの座標に合わせる、といった方法でいかがでしょうか。マウスが動いた時に発生する mouseMove イベントでもいいと思います。
ボタンにカーソルが重なった時の処理は、#1と同様にボタンの rollOver イベントでできます。
ただし、特に enterFrame イベントでムービークリップを移動させている時は、rollOver イベントが発生して指定の位置に移動しても、その次の瞬間に、カーソルの位置に戻ってきてしまうことになります。mouseMove を利用する場合でも似たようなもので、マウスを動かすまでは指定の位置に留まっていますが、マウスが動いた瞬間にカーソルの位置に移動してしまいます。
ボタンを利用する場合は、1度移動したら2度と動かないようにする処理が必要になるかと思います。

1度指定の位置に移動したら動かないようにするには、”指定の位置に移動した”という情報をどこかに残しておき、ムービークリップの移動処理の前に、移動済みかどうかを判断するといいでしょう。
例えば、ムービークリップ clip に、fix という変数(このような使い方をする変数は、フラグとも呼ばれます)を用意するとします。
fix には、最初は false を入れておきます。
移動処理の前に if 文で fix の値を判断し、false の時だけ、clip をカーソルの位置に移動するようにします。
ボタンにカーソルが重なり、指定の位置に移動したときは、fix の値を true に書き換えます。
すると、if 文の条件は不成立になって移動処理が行われなくなりますので、clip は移動しなくなります。

スクリプトにしますと、次のようになります。


 ・clipに設定するスクリプト

  onClipEvent(load)
  {
   //フラグの初期化:trueの時は移動禁止
   fix = false;
  }

  onClipEvent(enterFrame)
  {
   //指定位置に移動していない場合のみ、カーソルの位置に移動
   if( ! fix )
   {
    this._x = _root._xmouse;
    this._y = _root._ymouse;
   }
  }


 ・ボタンに設定するスクリプト

  on(rollOver)
  {
   //ムービークリップを指定の位置に移動
   clip._x = 100;
   clip._y = 100;

   //ムービークリップの移動を禁止する
   clip.fix = true;
  }


( 100 , 100 ) といった特定の座標ではなく、ムービークリップの座標や変数の値を指定することもできます。
ただし、#1にも書いた通り、Flash 5 ではボタンインスタンスの座標を ActionScript で操作することができません。
例えばボタンの位置に移動させたい場合は、もちろん、ボタンの座標を直接指定すればいいのですが、ボタンの配置を変えるたびにスクリプトも変更しなければならず、あまり効率的ではありません。
ムービークリップであれば ActionScript で座標を操作できますから、自分自身の座標に移動させることは簡単です。
しかし、ムービークリップでは rollOver イベントが利用できません。そこで、カーソルが重なったかどうかを判断する方法が必要になります。
よく使われる手法は、ムービークリップに透明なボタンを重ねておき、このボタンで rollOver イベントを検出して利用する方法と、ムービークリップと特定の座標との衝突を検出する hitTest メソッドで、ムービークリップとカーソルの座標の衝突判定をとる方法です。
ここでは後者の、カーソルの座標との衝突判定をとる方法をご紹介します。

ボタンの代わりにムービークリップをステージに配置し、インスタンス名を付けます。ここでは仮に、hit_area という名前にします。
hit_area では、enterFrame イベントを利用して、常時、カーソルとの衝突判定をとります。カーソルの座標が自分と接触していれば、カーソルが重なっていると見なすことができます。
この時、clip の座標を自分の座標に書き換えると、clip は hit_area の位置に移動してくるようになります。

hit_area に設定するスクリプトは、次のようになります。clip のスクリプトは、前述のスクリプトと同じです。

 onClipEvent(enterFrame)
 {
  //カーソルが重なっている場合
  if( this.hitTest( _root._xmouse , _root._ymouse , true ) )
  {
   //ムービークリップをこの場所に移動
   _parent.clip._x = this._x;
   _parent.clip._y = this._y;

   //ムービークリップの移動を禁止する
   _parent.clip.fix = true;
  }
 }


clip を吸着させて2度と動かなくするには、先述の方法と同様に、フラグに情報を残しておきます。

 _parent.clip.fix = true;

この部分を削除しますと、hit_area 上にカーソルがある間は clip は hit_area に吸着していますが、hit_area からカーソルが離れると、再びカーソルとともに移動するようになります。


#1にも書きましたように、ムービークリップ同士の場合は階層の指定が違いますので、ご注意ください。
    • good
    • 0

ボタンの rollOver イベントを利用して、ムービークリップの座標を書き換えてはいかがでしょうか。




例えば、ステージに、ムービークリップのインスタンス clip とボタンがあるとします。
ボタンに


 on(rollOver)
 {
  clip._x = 100;
  clip._y = 100;
 }

(↑このスクリプトをコピーして利用する場合は、各行頭の全角のスペースを、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります)

とアクションを設定すると、ボタンにカーソルが重なった時、clip が ( 100 , 100 ) の地点に移動します。

ボタンのアクション on の中で他のムービークリップを操作する時は、階層の指定にご注意ください。
ステージにボタンとムービークリップ clip がある場合は、2つとも同じ親( _root )の子同士、という関係になっています。
しかし、ActionScript でのボタンのインスタンスは1つの階層とは見なされず、ボタンの階層はボタンが存在する階層と同じになります。つまり、ステージにあるボタンの階層は _root となります。
よって、ボタンから _root 階層にある clip を指定する場合、親のタイムラインを参照する _parent は不要です。
なお、ムービークリップ同士であれば、ムービークリップはそれぞれ独立した階層です。あるムービークリップから、自分と同じ親の別の子の階層を参照するには、_parent が必要になります。


階層さえ正しく指定できれば、どのボタンやムービークリップからでも、他のムービークリップを操作できます。
ただし、Flash 5 には、MovieClip オブジェクトのボタン版ともいえる Button という ActionScript のオブジェクト(これは Flash MX から登場します)がありません。
そのため、ボタンインスタンスの位置を ActionScript で操作したり、座標を取得して利用することはできません。これらの操作が必要な場合は、ボタンシンボルではなくムービークリップシンボルを利用してください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

無事任意の位置に出すことはできました。
これを例えば、スタート位置から「動いてきたように」見せるにはどうしたらいいのでしょうか?
イメージとしてはマウスカーソルのところにくっついて動くムービーみたいな感じです。
ちなみに使用しているのはFLASH5です。

お礼日時:2004/11/23 11:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!