D0407101 吸着とボタン移動について
Name みきお
Date 2004年07月10日 (土) 07時17分
Message はじめまして、こんにちは。
こちらで色々と勉強させて頂いていまる「みきお」というものです。
宜しく願いします。

「スクロールフィールドのつまみと上下のボタンの連動」を参考に「左右」にし
「吸着」機能をもたせたものの、左右ボタンとの連動で行き詰まってしまいました。

下のswfを見ていただければわかると思いますが、左右にドラックができ
「1」「2」「3」「4」「5」の中心に吸着するようになっています。

で、私がわからないことは・・・
右端の「5」にある場合、左ボタンを押すと「4→3→2→1」の順番に移動。
左端の「1」にある場合、左ボタンを押すと「2→3→4→5」の順番に移動。
・・・っとしたいのですが、なかなかうまくいかず・・・。

わかりずらい文書で、申し訳ありませんが、宜しく願い致します。



Flash5/win98で作成。(flaもアップした方が良いですか?)
Response 01
2004年07月10日 (土) 23時19分> 憲ちゃん 
みきおさん、はじめまして(*^.^*)

ドラッグで、別のMCを移動させる方法はいろいろやり方があるので、
flaファイルがあると構造がわかって、あと説明しやすいのですが・・・


slider10.fla

とりあえず憲ちゃんは、以下のような構造で上記サンプルを作ってみました。

まず、シーン編集画面(_root)では、



上段の大きいMC(中身は5つの図形等)と「ゲージMC(インスタンス名:gauge)」を配置。
そのゲージMCの中は・・・



ターゲット(吸着の的)となる5つの「的MC」、
その上をドラッグ移動する「ドラッグMC(インスタンス名:btn)」と
今回ご質問の「左右ボタン」を配置しています。
右端の「的MC@」及び「ドラッグMC」の各基準点は、この「ゲージMC」の基準点に配置(X=0)。
「的MCA〜D」は、−30pxずつ等間隔に左に配置しています。
つまり、「的MC」の各座標は、右から左に「0,-30,-60,-90,-120」となります。
ドラッグMCの中は・・・



「ドラッグボタン」と
「ドラッグMC(btn)」の中心線である「ゲージ線MC(インスタンス名:line)」があります。

この「ドラッグMC」は「ゲージMC」の中を「的MC」の右端から左端に水平移動すればよいので、
「ドラッグボタン」のボタンアクションは・・・

 on (press) {
   this.startDrag(false,0,0,-120,0); 水平に0〜−120の範囲
 }
 on (release, dragOut) {
   this.stopDrag();
 }

「ドラッグMC」を「的MC」に吸着させるための衝突判定は、どちらからでもできますが・・
サンプルはそれぞれの「的MC」から、中心線の「line」に衝突しているかどうかを判定しています。
そこで「ゲージMC」の中の各「的MC」に・・・

 onClipEvent (mouseUp) { 押し込まれたマウスボタンが離れた瞬間
   if (this.hitTest(_parent.btn.line)) { 「ドラッグMC」の中の「line:線」と衝突なら
     _parent.btn._x = this._x; 「ドラッグMC」を自分のX座標に移動
   }
 }

※「ドラッグボタン」をドラッグして、離す「release」することは、MCのイベントでは「mouseUP」

そして、シーン(_root)にある、上段「MC」の位置は、常時(フレームレートごとに)
この「ゲージMC」の中の「ドラッグMC」のX座標と連動して、自分のX座標を決めますから、

 onClipEvent (enterFrame) {
   this._x = -(_root.gauge.btn._x * 3)+430; ←※サンプルの場合の関係式
 }

関係式は、「MC」の大きさや動かす方向によって異なってきます。
以上が、ドラッグボタンと上段図形との移動・吸着の、サンプルのしくみです。

「左右ボタン」は、クリックするたびに「的MC」の間隔だけ「ドラッグMC(btn)」を移動すれば
よいのですから・・・そのボタンアクションは

左ボタン

 on (release) {
   if (btn._x > -120) { 「ドラッグMC」が左端(X=-120)に寄っていないなら
     btn._x -= 30; ←「ドラッグMC」を30px左に移動
   }
 }

右ボタン

 on (release) {
   if (btn._x < 0) { 「ドラッグMC」が右端(X=0)に寄っていないなら
     btn._x += 30; ←「ドラッグMC」を30px右に移動
   }
 }

「ドラッグボタン」の最初の位置を右端にすると、マイナス方向への移動になるので、
式を考えるとき、プラスマイナスがややこしいですね(笑)
Response 02
2004年07月11日 (日) 06時43分> みきお 
憲ちゃんさん、お答え頂き有難う御座います。

やはりflaがあった方がよかったのですね・・・すみません。
遅いかもしれませんが、アップしましたので覗いて見てください。
そのfla

早速、おしえて頂いた方法を研究してみます。
研究がまとまり次第、報告しますね。

あと、私の勘違いでしたら良いのですがアップして頂いた「slider10.fla」なんですが、Flash5では開けませんでした。
なんでだろう?
Response 03
2004年07月11日 (日) 10時32分> 憲ちゃん 
すみません、flaファイルをFLASH6のまま保存していましたm(_ _)m(^^;
「5」で保存しなおしてアップしましたので、今度は大丈夫です♪

flaファイル拝見しました。
憲ちゃんのサンプルのように、大きな「MC」以外の主な部品を「ゲージMC」の中に
まとめるかどうかの違いだけで、基本的には同じでしたね♪

したがって、左右ボタンのアクションも同じように考えます。
大きな「MC」は、自らの位置を「スライド」の位置によって自動的に決めているので、
「左右ボタン」がコントロールするのも、「スライド」の位置でよいわけです。

みさおさんのサンプルでいえば・・・

左ボタン

 on (release) {
   if (slide._x > 123) { 左端の判定mcのX座標(X=123)より右にあるときだけ
     slide._x -= 63;  判定mcの間隔(63px)分、「スライド」を左へ移動
   }
 }

右ボタン

 on (release) {
   if (slide._x < 375) { 右端の判定mcのX座標(X=375)より左にあるときだけ
     slide._x += 63;  判定mcの間隔(63px)分、「スライド」を右へ移動
   }
 }

動かす関連部品をまとめて、ムービークリップにすることと、
それぞれをシーンに配置することの違いは・・・別のムービークリップにまとめることで、
座標計算が楽、というか扱いが簡単になります。
動かす部品の各座標は、それをくるんだMCの基準点ですから、
仮にそのMC(憲ちゃんのサンプルでは「ゲージMC」)ごと、
シーン編集画面のどこに配置しても関係式に変化がない、
つまりボタンやスライダーをあとで位置を移動しても問題ないということです(*^.^*)
Response 04
2004年07月12日 (月) 19時57分> みきお 
早速、作ってみました。



>動かす関連部品をまとめて、ムービークリップにすることと、
>それぞれをシーンに配置することの違いは・・・別のムービークリップにまとめることで、
>座標計算が楽、というか扱いが簡単になります。

確かにムービークリップでまとめてステージに配置した方が楽ですね\(^o^)/
本当に有難う御座いました。

んで、しばらく弄くっていたら「スライド移動にスムーズさを!」っという
欲にかられ作ってみましたが、・・・うまくきません。
もう少し、試作してみますが、出来ましたらヒントを頂けないでしょうか?
宜しくお願い致します。

そのswf
そのfla
Response 05
2004年07月13日 (火) 10時12分> 憲ちゃん 
”slider”MCに、「目標値接近の方程式」を適用して・・・

 onClipEvent (enterFrame) {
   this._x = (this._x + X)/2;
 }

変数X がこれから向かう目標値ということで、左右ボタンでその値を代入。
したがって、左右ボタンをクリックするとスムーズに目標位置に向かい成功ということですね♪

ところが”slider”をドラッグしても元の番号の枠から移動してくれない?(笑)
それは・・・
目標値の変数X が左右ボタンからしか変更できないことが理由のひとつ!
ドラッグして吸着させるときの座標は各”的mc”で行っていますので、そこのところでも

 onClipEvent (mouseUp) {
   if (this.hitTest(_parent.slider.line)) {
     _parent.slider.X = this._x;
   }
 }

該当の”的mc”のX座標を、直接”slider”のX座標”_parent.slider._x”に代入するのではなく、
このように、目標値である変数X に代入しなければいけません。
さらに、ドラッグボタンをドラッグしているあいだも常に”slider”MCに記載した、
「目標値接近の方程式」が働き続け、その時の目標値に向かって戻ろうとしますので、
元の番号枠から出られません(^^)
そこで・・・
ドラッグを行っている間は「目標値接近の方程式」が働かないようにする工夫が必要です。
例えば、”slider”MCに変数sw(スイッチのつもり)というのを新しく設けて・・・

 onClipEvent (load) { ”slider”MCが読み込まれた最初に
   sw = 0;   ←変数sw を定義して「0」を代入
 }
 onClipEvent (enterFrame) { フレームレートごとに以下を繰り返す
   if (sw == 0) { 変数sw が「0」のときだけ
     this._x = (this._x + X)/2; ←「目標値接近の方程式」を稼動
   }
 }

とし・・
ドラッグボタンのボタンアクションで・・・

 on (press) { マウスボタンが押し込まれたら
   sw = 1; ←変数sw に「1」を代入して(上記「目標値接近の方程式」を無効にして)
   this.startDrag(false,0,0,-305,0); ←ドラッグ開始
 }
 on (release, dragOut) { (押し込まれたボタンが)離れた瞬間又は外に出た瞬間
   sw = 0; ←変数sw に「0」を代入して(上記「目標値接近の方程式」を有効にして)
   this.stopDrag();  ←ドラッグ停止
 }

このようにして、
ドラッグボタンが押し込まれている間だけ「目標値接近の方程式」が働かないようにします(^^g/~~

このページの先頭へ