• 締切済み

FLASHでロールオーバーで他のムービーを指定位置に

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

みんなの回答

  • DPE
  • ベストアンサー率85% (666/776)
回答No.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にも書きましたように、ムービークリップ同士の場合は階層の指定が違いますので、ご注意ください。

  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

ボタンの 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 で操作したり、座標を取得して利用することはできません。これらの操作が必要な場合は、ボタンシンボルではなくムービークリップシンボルを利用してください。

w-inty
質問者

お礼

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

関連するQ&A

専門家に質問してみよう