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

お世話になります。
上記の件について、ご質問させて頂きます。

作成したムービーは以下の通りです。
aaa.swf←ムービー1
bbb.swf←ムービー2
main.swf←aaa.swfとbbb.swfを順番にロードして表示

今回、main.swf上でaaa.swf及びbbb.swfの再生状況(時間)を表示させ、先へ進んだり、前に戻ったり等を管理する
スライドバーを作成したいと思っています。

Flash初心者なので、やり方について調べてみてもわかりませんでした。。
教えてください。よろしくお願いします。

A 回答 (1件)

シークバーですね



まずはmain.swfとかbbb.swfのことは忘れて
aaa.swfにシークバーをつけてみます。

_root上にseek_mc、box_mcというインスタンス名のmcを配置します。

   
図にすると
   
| ̄■■ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
■■ が seek_mc (■が2つありますが2つで一つのmcと見てください)
その周りにあるのが box_mc です。


seek_mc : シークバーのつまみの部分(以下シークバーと書きます)
 シンボル化するときの基準点は
   □■□
   □□□
   □□□  真ん中の上
box_mc : シークバーの枠線
 基準点は
   ■□□
   □□□
   □□□  左上

//以下を_rootのフレームに記述-----------------------

//ドラッグしたときにシークバーの動く範囲
var left = this.box_mc._x+this.seek_mc._width/2;
var top = this.box_mc._y;
var right = left+this.box_mc._width-this.seek_mc._width;
var bottom = this.box_mc._y;

this.seek_mc._x = this.box_mc._x;
this.seek_mc._y = this.box_mc._y;

//シークバーを摘んだとき---------------------
this.seek_mc.onPress = function() {
// this は seek_mc を指す
_root.stop();
//割り当てた関数を削除する
delete _root.onEnterFrame;
this.startDrag(false, _root.left, _root.top, _root.right, _root.bottom);
//シークバーを移動させたとき
this.onMouseMove = MoveFrame;
};

//シークバーを離したとき---------------------
this.seek_mc.onRelease = function() {
this.stopDrag();
// 下でちょっと説明あり ---------------------------(1) 
var p = (this._x-_root.box_mc._x)/(_root.box_mc._width-this._width);
_root.gotoAndPlay(Math.floor(_root._totalframes*p));
_root.onEnterFrame = _root.MoveSeek;
//割り当てた関数を削除する
delete this.onMouseMove;
};

//onMouseMove(マウスを動かしたとき)に実行する関数
// (シークバーをドラッグ中)
function MoveFrame() {
// this は seek_mc を指す
var p = (this._x-_root.box_mc._x)/(_root.box_mc._width-this._width);
_root.gotoAndStop(Math.floor(_root._totalframes*p));
}

//フレームが再生されているときに実行する関数
// (シークバーがドラッグされていないとき)
function MoveSeek() {
// this は _root を指す
p = _root._currentframe/_root._totalframes;
this.seek_mc._x = _root.left+(this.box_mc._width-this.seek_mc._width)*p;
}
//
_root.onEnterFrame = MoveSeek;

//--------------------------------------------------

まとめると、

・ムービーが再生されているときシークバーが動く
 onEnterFrameで
  現在のフレームを取得
  全体のフレームの何%の位置にあるかを求める
  シークバーのx座標をその%位置に移動させる

・シークバーを動かしたときにムービーの再生位置を移動させる
  シークバーを動かすたびにx座標を取得
  box_mc内の何%の位置にあるかを求める
  フレーム位置をその%位置に移動させる

・シークバーを離したときにムービーの再生位置を移動させる
  離したときにシークバーのx座標を取得
  box_mc内の何%の位置にあるかを求める
  フレーム位置をその%位置に移動させる

・seek_mc._x の値 (1)の補足説明
  seek_mcの水平方向の基準点は中心なので中心位置のx座標が返ってきます。
  なのでx座標の範囲は
  
  |■■ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄■■|
   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
   |←────────────→ |  この範囲になる
   
  ですのでシークバーの位置(%)は
   [seek_mcのx座標 - box_mcのx座標 (左側の余白)]
      / box_mcの幅 - seek_mcの幅の半分 * 2
  
  =(this._x-_root.box_mc._x)/(_root.box_mc._width-this._width/2 * 2)
  =(this._x-_root.box_mc._x)/(_root.box_mc._width-this._width)
  
  という具合で求めています。
  
  
main.swfに読み込んだaaa.swfやbbb.swfの操作
 main.swfで読み込み用のmc(例えばload_mc)を用意してそこにaaa.swfを読み込みます。
 読み込み後、aaa.swfの_rootはmain.swfから見ると_root.load_mcとなります。


シークバーの動作範囲がおかしいとき(枠線をはみ出したり)は
シンボルの基準点を確認してください。

もしも動かないときは以下の点を確認してください。

・インスタンス名をつけたかどうか
  インスタンス名はシンボルをステージに配置したときに付ける名前です。
  シンボル名(ライブラリに表示される)とは違います。
  ステージにあるシンボルを選択してプロパティからつけてください。
  
・_rootのフレームが複数あるか
  _rootにシークバーを配置したので_rootが1フレームしかないと
  当然ですが動きません。
    • good
    • 0
この回答へのお礼

シークバーと言うのですね。
丁寧なご回答、感謝しています。
おかげで私にも作成することができました。
本当にありがとうございました!

お礼日時:2006/07/27 20:31

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