怎么用canvas實(shí)現(xiàn)簡(jiǎn)單的下雪效果

這篇文章將為大家詳細(xì)講解有關(guān)怎么用canvas實(shí)現(xiàn)簡(jiǎn)單的下雪效果,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

創(chuàng)新互聯(lián)公司專注于順慶企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),成都商城網(wǎng)站開發(fā)。順慶網(wǎng)站建設(shè)公司,為順慶等地區(qū)提供建站服務(wù)。全流程按需設(shè)計(jì),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

首先新建一個(gè)html文件,將body的背景設(shè)置為天空的那種深藍(lán)色,并創(chuàng)建一個(gè)canvas,canvas的操作邏輯都放在snow.js中:

<!DOCTYPE html>
<head>
  <style>
    body {
      background-color: #102a54;
    }
  </style>
</head>
<body>
  <canvas id='sky'></canvas>
  <script src="snow.js"></script>
</body>

</html>

canvas的操作將在頁(yè)面加載完之后執(zhí)行,首先獲取到canvas的二維context,并將canvas寬高設(shè)置為window的寬高,確保天空背景鋪滿整個(gè)窗口。 snow.js

window.onload = function () {
  var canvas = document.getElementById('sky');
  var ctx = canvas.getContext('2d');

  var W = window.innerWidth;
  var H = window.innerHeight;
  canvas.width = W;
  canvas.height = H;
}

天空背景完成后,我們來(lái)創(chuàng)建雪花,思路比較簡(jiǎn)單,我們讓屏幕上保持一個(gè)額定數(shù)量的雪花,并給每個(gè)雪花一個(gè)隨機(jī)的位置、隨機(jī)的大小以及隨機(jī)的下落速度:

  ...
  
  var flakesCount = 100; // 雪花個(gè)數(shù)
  var flakes = [];

  for (var i = 0; i < flakesCount; i++) {
    flakes.push({
      x: Math.random() * W, // 雪花x軸位置
      y: Math.random() * H, // 雪花y軸位置
      r: Math.random() * 5 + 2, // 雪花的半徑
      d: Math.random() + 1 // 雪花密度,用于控制下落速度
    });
  }

接下來(lái)我們需要將這100個(gè)雪花繪制出來(lái),簡(jiǎn)單起見,我們就用一個(gè)個(gè)白色的小圓表示雪花:

  function drawFlakes() {
    ctx.clearRect(0, 0, W, H);
    ctx.fillStyle = '#fff';
    ctx.beginPath();
    for (var i = 0; i < flakesCount; i++) {
      var flake = flakes[i];
      console.log(flake);
      ctx.moveTo(flake.x, flake.y);
      ctx.arc(flake.x, flake.y, flake.r, 0, Math.PI * 2, true);
    }
    ctx.fill();
    moveFlakes(); // todo: 雪花飄動(dòng)效果
  }

雪花繪制完成后,我們需要讓雪花動(dòng)起來(lái),有飄落的效果。我們思路是設(shè)置一個(gè)定時(shí)器,每隔25ms重新渲染一次canvas,每次渲染每個(gè)雪花往下移動(dòng)一段距離,雪花密度越大下落速度越快。并且通過Math.sin函數(shù)營(yíng)造出雪花左右飄動(dòng)的效果,當(dāng)雪花落到窗口外面后將雪花重新移動(dòng)到窗口上方再次下落,實(shí)現(xiàn)如下:

  var angle = 0;

  function moveFlakes() {
    angle += 0.01;
    for (var i = 0; i < flakesCount; i++) {
      var flake = flakes[i];
      flake.y += Math.pow(flake.d, 2) + 1; // 速度和密度實(shí)際上不是平方的關(guān)系,這么些是為了效果更加錯(cuò)落有致
      flake.x += Math.sin(angle) * 2;

      if (flake.y > H) {
        flakes[i] = { x: Math.random() * W, y: 0, r: flake.r, d: flake.d };
      }
    }
  }

  setInterval(drawFlakes, 25);

完成,我們來(lái)看一下實(shí)際效果:

怎么用canvas實(shí)現(xiàn)簡(jiǎn)單的下雪效果

嗯,還挺像那么回事兒:)

完整代碼:

           <!DOCTYPE html>
<head>
  <style>
    body {
      background-color: #102a54;
    }
  </style>
</head>
<body>
  <canvas id='sky'></canvas>
  <script src="snow.js"></script>
</body>

</html>
window.onload = function () {
  // get the canvas and context
  var canvas = document.getElementById('sky');
  var ctx = canvas.getContext('2d');

  // set canvas dims to window height and width
  var W = window.innerWidth;
  var H = window.innerHeight;
  canvas.width = W;
  canvas.height = H;

  // generate snowflakes and apply attributes
  var flakesCount = 100;
  var flakes = []; // flake instances

  // loop through the empty flakes and apply attributes
  for (var i = 0; i < flakesCount; i++) {
    flakes.push({
      x: Math.random() * W,
      y: Math.random() * H,
      r: Math.random() * 5 + 2, // 2px - 7px
      d: Math.random() + 1
    });
  }

  // draw flakes onto canvas
  function drawFlakes() {
    ctx.clearRect(0, 0, W, H);
    ctx.fillStyle = '#fff';
    ctx.beginPath();
    for (var i = 0; i < flakesCount; i++) {
      var flake = flakes[i];
      ctx.moveTo(flake.x, flake.y);
      ctx.arc(flake.x, flake.y, flake.r, 0, Math.PI * 2, true);
    }
    ctx.fill();
    moveFlakes();
  }

  var angle = 0;

  function moveFlakes() {
    angle += 0.01;
    for (var i = 0; i < flakesCount; i++) {
      var flake = flakes[i];
      flake.y += Math.pow(flake.d, 2) + 1;
      flake.x += Math.sin(angle) * 2;

      if (flake.y > H) {
        flakes[i] = { x: Math.random() * W, y: 0, r: flake.r, d: flake.d };
      }
    }
  }

  setInterval(drawFlakes, 25);
}

關(guān)于怎么用canvas實(shí)現(xiàn)簡(jiǎn)單的下雪效果就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

新聞標(biāo)題:怎么用canvas實(shí)現(xiàn)簡(jiǎn)單的下雪效果
文章鏈接:http://muchs.cn/article26/jsopcg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、外貿(mào)建站、定制網(wǎng)站、虛擬主機(jī)、網(wǎng)站內(nèi)鏈全網(wǎng)營(yíng)銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開發(fā)