D0402051 内接する回転円の定点軌跡(2)
Name 憲ちゃん
Date 2004年02月05日 (木) 02時47分
Message 前頁にこのレスを書くと、PCの動作が重くなりましたので、新規投稿します(^^;
swfファイル自体は軽くても、複雑な演算や描画はマシン負荷が大きいのです。
それを1ページに2つ同時に再生するとちょっときついようですネ!!


kaiten05.fla

それぞれのMCの階層は以下のような構造になっています。
ただし、各MCのインスタンス名は前頁のサンプルで必要ですが、
このサンプルの場合必要ありません(^^)



最終的に描画は、この定点MCが移動する座標値を元にするわけですが・・・
ここで得られるXY座標値は、それが配置されているMCの中の座標値になります。
つまりMC編集画面の情報パネルで表示される値のことでローカル座標のことです。
サンプルは「小円・定点MC」のX=75,Y=0 に配置していますが、
回転しているのは「小円回転MC」と「小円・定点MC」で、定点MC自身は回転していないので、
参照しても座標値はX=75,Y=0のまま変化しません。
これをムービードキュメントの左上を「0,0」とする絶対座標に置き換えるメソッドが。。。
「localToGlobal」で、ムービーを再生したときの見たとおりの座標値に変換してくれます。
使い方は・・・

 構造体名={x:座標値,y:座標値 };
 MCインスタンス名.localToGlobal(構造体名);


※「構造体」とは何か?などとむつかしく考えないで使ってください(笑)
右辺にある各座標値は、その下のメソッドで指定したMCインスタンスの基準点(0,0)を中心にして
どの位置の座標値を絶対座標に変換するかということを尋ねています。
ややこしい言い方ですが(笑)
今回は、定点MCの基準点(0,0)そのものを絶対座標にしてもらえばいいので、
仮に構造体名(任意の名称で可)を「theRoot」としたとすれば・・・

 theRoot = { x:0,y:0 }; とし、

これを定点MC自身に書くことにしますので、インスタンス名は自分自身「this」。

 this.localToGlobal( theRoot );と記載します。

これで、自分自身の基準点を絶対座標に変換してください、という意味になります。
そしてその絶対座標の値を取り出すときは・・・

 変数=構造体名.x;  変数=構造体名.y

としますので、この場合は・・・

 変数=theRoot.x;
 変数=theRoot.y;となります(^^g/~~

そして、この絶対座標を使って、「_root」に描画しますので・・・。

 _root.lineStyle(3,0xFF0000 );
 _root.moveTo( theRoot.x,theRoot.y );

と描画のライン設定と始点を決め、その後の値の変化に従って・・・

 _root.lineTo( theRoot.x,theRoot.y );

を繰り返していけばよいことになります(*^.^*)
このラインの書き始めのきっかけをシーンに配置した「LINE」ボタンにさせています。
シーン編集画面の1フレームに、sw = 0;ととりあえずコントロール用の変数を定義し、
「LINE」ボタンに・・・

 on (release){
   sw = 1;
 }

そして、定点MCのクリップアクションで・・・

 on ClipEvent (enterFrame) { フレームレートごとに以下のことを繰り返す
   theRoot = { x:0,y:0 };   ←現在の自分の座標を絶対座標に変換
   this.localToGlobal( theRoot );
   _root.textX = Math.floor( theRoot.x );←左下のテキストボックスにその値を表示
   _root.textY = Math.floor( theRoot.y );
   if ( _root.sw == 1 ){  変数sw が1なら
     _root.sw = 2;     ←変数sw に2を代入※
     with( _root ){ _rootにある以下のことを処理
       lineStyle( 3,0xFF0000 ); ←ラインの初期設定
       moveTo( theRoot.x,theRoot.y ); ←絶対座標で始点を設定
     }
   }else if ( sw == 2 ){ 変数sw が1でなくて、2なら※
     _root.lineTo( theRoot.x,theRoot.y ); ←絶対座標で線を描く
 }

変数sw が0のときは、絶対座標をテキストボックスに表示することだけをし、
変数sw が1になると、まず変数sw を2にして次回からここへは来られないようにし、
ラインの初期設定と始点の設定をしてループをでます。
次の繰り返し以降は、変数sw は常に2なので、次々変化する絶対座標で線を引き続けます。
「CLS」ボタンで・・・

 on (release){
  this.clear(); ←描いた線をすべて消去
  sw = 0;    ←勝手に描かないよう変数sw に0を代入
 }

以上です(^^;

これらの一連のスクリプトは、別にどこに書いても構いません。
定点MCにスクリプトを記載することの意味は・・・
月を周回するロケットの中で静止している宇宙飛行士が、自分の位置を地球座標に変えて、
宇宙飛行士自らが筆を持ち、自分の目で地球上の旗の合図をみて、
地球キャンバスに線を描いたり消したりしているというイメージです(*^.^*)
やり取りは、自分(this)と地球(_root)との間だけですから、
自分や途中のMCにインスタンス名を必要としないのです♪

それから・・・banさんがおっしゃっておられた、
小円をドラッグして、定点ラインを引く方法はやってみるとわかりますが、
ドラッグのブレがそのままラインに反映されますのでギザギザになります(笑)
Response 01
2004年02月05日 (木) 14時28分> ban 
憲ちゃん,丁寧な解説ありがとうございます。
構造体…,難しそうですが勉強していくつもりです。
早速憲ちゃんの解説をもとに自分なりに作ってみたのですが,軌跡の曲線が小円の後ろに描かれてしまいました。憲ちゃんのサンプルとどこが違うのかじっくり比較してみます。
ところで,この曲線はどのレイヤーに描かれているのでしょうか。初歩的な質問で申し訳ありません。
Response 02
2004年02月05日 (木) 14時37分> ban 
失礼しました。自己レスです。
憲ちゃんのサンプルでは小円のアルファ値を落としていたのですね。気づきませんでした。アルファ値を落としたらうまくいきました。
Response 03
2004年02月05日 (木) 19時17分> 憲ちゃん   
はい!そういうことです(^^g/~~
そして、
>この曲線はどのレイヤーに描かれているのでしょうか。
編集画面で、ステージに線や塗り図形を描いたものは、描かれたレイヤーの重ね順によって
上下の見え方を調整できます。
ところが、アクションスクリプトには、
「連載ACTIONSCRIPT講座」第3回”301””320”後段で注釈しているように・・・
そもそもレイヤーという概念がなく、アクションスクリプトを使って描画したときは、
描画したムービークリップの最背面(いわばレイヤーの底)に描かれることになっています。
どうしても、元の図形の前面に描画したい場合は・・・
アクションスクリプトで別途「空のムービークリップ」を作成してそこに描画します。

>構造体…,難しそうですが勉強していくつもりです。
是非、ほどほどにお願いします(笑)
参考図書などを読まれると、ときどき難解な単語にぶち当たりますが、
それにあまりこだわって追求することは、理解するうえで結果として遠回りになります(-.-;
単語の概念が理解できなくても「このように使えば、このようになる」ことだけを
知っていれば、十分作品の制作目的を達成することができます♪
心配しなくても、使っているうちに理屈はあとから自然に分かってきますので、
まずは実践あるのみです(*^.^*)
Response 04
2004年02月05日 (木) 22時16分> ban 
憲ちゃん,いろいろありがとうございました。

>「連載ACTIONSCRIPT講座」第3回”301””320”後段で注釈しているように・・・
すいません。まだActionScript講座,熟読していませんでした。反省

>まずは実践あるのみです(*^.^*)
FlashについてもActionScriptについても,何冊か本を買って勉強しているのですが,なかなか頭に入ってきません。やはり,作りたいものを試行錯誤で作ってみるのが一番なのかもしれませんね。今回いろいろ教えていただいたことで,ActionScriptのことが(本なんかよりもずっと)分かってきたような感じです。(いろいろ質問してしまい,憲ちゃんにはご迷惑をおかけしているとは思いますが…)
「実践あるのみ」このことが実感できました。
今後ともよろしくお願いします。

このページの先頭へ