• ベストアンサー

外部SWFファイルを再生バーでコントロールしたい

お世話になります。 上記の件について、ご質問させて頂きます。 作成したムービーは以下の通りです。 aaa.swf←ムービー1 bbb.swf←ムービー2 main.swf←aaa.swfとbbb.swfを順番にロードして表示 今回、main.swf上でaaa.swf及びbbb.swfの再生状況(時間)を表示させ、先へ進んだり、前に戻ったり等を管理する スライドバーを作成したいと思っています。 Flash初心者なので、やり方について調べてみてもわかりませんでした。。 教えてください。よろしくお願いします。

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

  • ベストアンサー
  • perse
  • ベストアンサー率74% (113/152)
回答No.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フレームしかないと   当然ですが動きません。

kyawami
質問者

お礼

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

関連するQ&A