こんにちは、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;
周期と振幅をランダムに設定すると、
毎フレームごとに、連続性のない波形がめまぐるしく展開してしまいます。
これはこれで違った意味の面白さもあるのですが・・・
現在の値からランダムな値に連続してスムーズに移行させるテクニックとして、
ランダム計算を一定の確率で行い、計算しない間その値に向かって「目標接近スクリプト」で
徐々に値を変化させています。
各確率やランダムの値の幅、目標接近の速度調整値を適当に変えてみてください。
<その他のサインカーブ描画関係の参考記事>
■サインカーブを描く
■ナビが波打つような動き
|