• 締切済み

雪を降らせるみたいな、ゆらゆらと落下するアルゴリズムを!

個人的なページに雪を降らせたいのですが、左右に滑らかにゆれる アルゴリズムには、どんなものがあるのでしょう? 雪を多めに降らせたいと思っているので速度も重要です 自分が思いつくものとしては、sin関数です。しかし速度が・・・

みんなの回答

  • Gizensha
  • ベストアンサー率34% (207/608)
回答No.2

# コードは詳しく読んでません。ずばりのコードを書く気もありません。あくまで考え方のみです。あしからず。 Nフレーム後の雪の座標をあらかじめテーブルに持っておくのも一つの手ですね。 この場合全部が同じ動きになってしまうとつまらないので、適度に乱数で揺らぎを与えてみることになるかと思います。

noname#84373
質問者

補足

「乱数で揺らぎ」を考えてました。 Y軸方向もステップ量を変化させることで、考えて リサージュー曲線を思い出しました まぁ~これで充分かな~と・・・。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <title>TEST</title> <style type="text/css"> body{ background-color:black; overflow:hidden; } </style> <body> <script type="text/javascript"> //@cc_on var i,snow =30; var sin =[]; for( i=0; i<361; i++) sin[i]=Math.sin(i*3.14159/180); for( i=0; i<snow; i++) new bringSnow(); function bringSnow(){ this.go = function(){ this.y += this.z/2 +2; this.p+=2; if( this.y > document.documentElement.clientHeight-60) this.init(); this.e.style.top = this.y + (sin[this.p%360]*6*this.z|0) +'px'; this.e.style.left = this.x + (sin[this.p*2%360]*6*this.z|0) +'px'; } this.init = function(n){ this.p =0; this.y = Math.random() * document.documentElement.clientHeight * ( n != undefined ) |0; this.x = (Math.random() * document.documentElement.clientWidth |0)-60; this.z = (Math.random() * 5 |0) + 1; var op = (Math.random() * 80 |0) + 21; this.e.style.fontSize = this.z * 7 + 'px'; this.e.style./*@if(1) filter = 'alpha(opacity='+ op+ ')'; @else @*/ MozOpacity = this.e.style.opacity = op / 100;/*@end@*/ } var ne = document.createElement('div'); ne.appendChild( document.createTextNode( '*' ) ); ne.style.color = 'white'; ne.style.position = 'absolute'; this.e = document.body.appendChild( ne ); this.init(1); setInterval((function(f_){ return function(){ f_.go.call(f_);}})(this), (Math.random() * 30 |0) +16) } </script>

  • Gizensha
  • ベストアンサー率34% (207/608)
回答No.1

関数のオーバーヘッドのみが問題なら、あらかじめ配列に用意してしまうのも一つの手ですよ。 昔は速度を稼ぐために128倍整数化したサインテーブルをxsin[0..359]のような配列に確保するなどしたものです。

noname#84373
質問者

お礼

ご回答ありがとうございます。 雪の描くラインをアルファベットの「J]のようにしてみたいのです。 落ちては左右どちらかにカーブして、せり上がるまではいかなくても よいのですが、そこで落下速度が落ち、また下に落ちるような・・・

noname#84373
質問者

補足

こんな感じでしょうか? <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <title>TEST</title> <style type="text/css">  body { background-color:black; overflow:hidden; } </style> <script type="text/javascript"> //@cc_on var i,snow =50; var sin =[]; for( i=0; i<361; i++) sin[i]=Math.sin(i*3.14159/180); for( i=0; i<snow; i++) new bringSnow(); function bringSnow(){  this.go = function(){   this.y += this.z ;   if( this.y > document.documentElement.clientHeight-60) this.init();   this.e.style.top = this.y +'px';   this.e.style.left = (this.x + sin[this.y%360|0]*this.z*10) +'px';  }  this.init = function(n){   this.p =0;   this.y = Math.random() * document.documentElement.clientHeight * ( n != undefined ) |0;   this.x = (Math.random() * document.documentElement.clientWidth |0)-60;   this.z = (Math.random() * 5 |0) + 1;   var op = (Math.random() * 80 |0) + 21;   this.e.style.fontSize = this.z * 7 + 'px';   this.e.style./*@if(1) filter = 'alpha(opacity='+ op+ ')'; @else @*/    MozOpacity = this.e.style.opacity = op / 100;/*@end@*/  }  var ne = document.createElement('div');  ne.appendChild( document.createTextNode( '*' ) );  ne.style.color = 'white';  ne.style.position = 'absolute';  this.e = document.body.appendChild( ne );  this.init(1);  setInterval((function(f_){ return function(){ f_.go.call(f_);}})(this), (Math.random() * 30 |0) +16) } </script>

関連するQ&A