БлогNot. Another one bite the snow :)

Another one bite the snow :)

Весь день мечтал набросать какие-нить глупые снежинки, но видел только безумные программки, из тех, что студенты списывают друг у друга.

Но вот настал вечер, наверное, по-простому можно так (размер канвы произволен, легко поменять в исходнике):

<style>
 .snow {
  margin: 0; padding: 0; background: #000000;
 }
</style>
<div align="center">
 <canvas id="snow" class="snow" width="600" height="600"></canvas>
</div>
<script>
 var canvas = document.getElementById('snow');
 var ctx = canvas.getContext('2d');
 var w = canvas.width;
 var h = canvas.height;
 var n = 250; //количество снежинок
 var flakes = [];
 
 function Flake (x,y) {
  var maxSize = 4; //максимальный размер
  var maxSpeed = 2.718; //максимальная скорость
  this.x = x; this.y = y;
  this.r = rnd(0,1);
  this.a = rnd(51,Math.PI);
  this.step = 0.01;
  this.size = rnd (1,maxSize);
  this.alpha = this.size / maxSize;
  this.speed = (this.size / maxSize) * maxSpeed;
  this.rc = rnd(102,255,true);
  this.gc = rnd(102,255,true);
  this.bc = rnd(244,255,true);

  this.update = function () {
   this.x += Math.cos(this.a)*this.r;
   this.y += this.speed;
   this.a += this.step;
  }
 }
 
 function initFlakes() {
  var cnt = n, flake, x, y;
  while (cnt--) {
   x = rnd (0,w,true);
   y = rnd (0,h,true);
   flake = new Flake (x,y);
   flakes.push(flake);
  }
  loop();
 }
 
 function loop () {
  var cnt = flakes.length, fA;
  //очистка канвы:
  ctx.save();
  ctx.setTransform(1,0,0,1,0,0);
  ctx.clearRect (0,0,w,h);
  ctx.restore();
  while (cnt--) {
   fA = flakes[cnt]; fA.update();
   ctx.beginPath();
   ctx.arc(fA.x,fA.y,fA.size,0,2*Math.PI,false);
   ctx.fillStyle = 'rgba('+fA.rc+','+fA.gc+','+fA.bc+','+fA.alpha+')';
   ctx.fill();
   if (fA.y >= h) fA.y = - fA.size; //снова сверху :)
  }
  requestAnimationFrame(loop);
 }
 
 function rnd (min,max,round=false) {
  var n = min + Math.random() * (max - min + 1);
  if (round) n = Math.floor(n);
  return n;
 }
 
 function dist (v1,v2) {
  var dx = v1.x - v2.x, dy = v1.y - v2.y;
  return Math.sqrt(dx*dx-dy*dy);
 }
 
 initFlakes();
</script>
<noscript>You need Javascript to run it</noscript>

Для простоты однажды сгененированные снежинки не удаляются из массива flakes, а просто меняют координату с низа на верх канвы:

   if (fA.y >= h) fA.y = - fA.size; //снова сверху :)

Ну и ещё много что там можно поменять или усовершенствовать.

Так что, с Рождеством, кафолики :)

25.12.2018, 19:52 [1637 просмотров]


теги: javascript графика random

К этой статье пока нет комментариев, Ваш будет первым