D0707032 不規則な波線(ランダム・サインカーブ)
Name Kou
Date 2007年07月03日 (火) 16時15分
Message お久しぶりです、こんにちは…kouです。

前回、色々と教えてもらったため、何とか狙い通りのFLASHが
作れました。今度はコレを上手く発展させようと思いまして、
(今は等間隔で動く波を)なんとか不規則(ランダム)な動きにしようと
思ったのですが、案の定やり方が分からないので教えていただけませんでしょうか?

完全ランダムな動きとかでなくてもいいのです。例えば今振れ幅の設定(wide)が
4になっている所を、4→2→1→2→4と一定の振れるリズムを刻んでいったりとか・・

ご教授お願いします
Home or Link http://rakugakidan.hp.infoseek.co.jp/wave.swf
Response 01
2007年07月04日 (水) 15時52分> 憲ちゃん 
こんにちは、Kouさん。

周期のほか振幅もランダムにしてみました。


sincurve3.fla ※MX仕様 **CPUの負荷大**

このサンプルでは、空のMCに各々次のようなクリップアクションを記述してます。
前段の「load」イベント内は、ほぼKouさんの内容と同じはずです。

 onClipEvent (load) {
   wide = wm = 3; ←周期と目標周期を定義(すぐにランダム設定するので値は適当)
   spd = 5; ←回転速度(左右の移動速度:大きいほど速い、+は左、−右方向)
   R = Rm = 50; ←振幅と目標振幅値を定義(すぐにランダム設定するので値は適当)
   hosei = 0; ←補正角度の初期値(適当)
   this.createEmptyMovieClip("sin", 0); ←描画用キャンバスの作成
   function Move() {
     hosei += spd;
     sin.clear();
     sin.lineStyle(2,0x00FFFF); ←線の太さと色の設定
     for (i = 0; i <= 500; i += 1) { サインカーブ描画の実行
       y = yData(wide*i+hosei); ←角度から以下のsin方程式で描画y座標の決定
       if (i == 0) {
         sin.moveTo(i,y);    ※線の描画
       } else {
         sin.lineTo(i,y);
       }
     }
   }
   function yData(kakudoD) { sin方程式※■サインカーブ・グラフの並行移動
     rad = kakudoD*Math.PI/180;
     return Math.sin(rad)*R; 
   }
 }
 onClipEvent (enterFrame) {
   if (Math.floor(Math.random()*30) < 1) { 30分の1の確率で
     wm = Math.random()*4; ←目標周期をランダムに決定(0〜3.99999)
   }
   if (Math.floor(Math.random()*10) < 1) { 10分の1の確率で
     Rm = Math.random()*100; ←目標振幅値をランダムに決定(0〜99.9999)
   }
   wide += (wm-wide)/30; ←周期を目標周期に向かって徐々に変化
   R += (Rm-R)/30; ←振幅を目標振幅に向かって徐々に変化
   Move();
 }

要点は、「enterFrame」内のランダム計算のやり方です。
いきなり毎フレームごとに、

 wide = Math.random()*4;
 R = Math.random()*100;

周期と振幅をランダムに設定すると、
毎フレームごとに、連続性のない波形がめまぐるしく展開してしまいます。
これはこれで違った意味の面白さもあるのですが・・・
現在の値からランダムな値に連続してスムーズに移行させるテクニックとして、
ランダム計算を一定の確率で行い、計算しない間その値に向かって「目標接近スクリプト」で
徐々に値を変化させています。
各確率やランダムの値の幅、目標接近の速度調整値を適当に変えてみてください。

<その他のサインカーブ描画関係の参考記事>
■サインカーブを描く
■ナビが波打つような動き

このページの先頭へ