Menu
快讀
  • 旅遊
  • 生活
    • 美食
    • 寵物
    • 養生
    • 親子
  • 娛樂
    • 動漫
  • 時尚
  • 社會
  • 探索
  • 故事
  • 科技
  • 軍事
  • 国际
快讀

140行代碼實現一個逼真的大雪紛飛的效果

2020 年 1 月 12 日 汪子熙的游泳故事

本地新建一個html文件,把下列代碼複制粘貼進去,保存,用浏覽器打開:<html>

<style>

html, body {

margin: 0;

padding: 0;

background: #000;

}

</style>

<script>

// https://codepen.io/pimskie/pen/jEVPNx

function myload(){

var canvas = document.querySelector('.snow'),

ctx = canvas.getContext('2d'),

windowW = window.innerWidth,

windowH = window.innerHeight,

numFlakes = 200,

flakes = [];

function Flake(x, y) {

var maxWeight = 5,

maxSpeed = 3;

this.x = x;

this.y = y;

this.r = randomBetween(0, 1);

this.a = randomBetween(0, Math.PI);

this.aStep = 0.01;

this.weight = randomBetween(2, maxWeight);

this.alpha = (this.weight / maxWeight);

this.speed = (this.weight / maxWeight) * maxSpeed;

this.update = function() {

this.x += Math.cos(this.a) * this.r;

this.a += this.aStep;

this.y += this.speed;

}

}

function init() {

var i = numFlakes,

flake,

x,

y;

while (i–) {

x = randomBetween(0, windowW, true);

y = randomBetween(0, windowH, true);

flake = new Flake(x, y);

flakes.push(flake);

}

scaleCanvas();

loop();

}

function scaleCanvas() {

canvas.width = windowW;

canvas.height = windowH;

}

function loop() {

var i = flakes.length,

z,

dist,

flakeA,

flakeB;

// clear canvas

ctx.save();

ctx.setTransform(1, 0, 0, 1, 0, 0);

ctx.clearRect(0, 0, windowW, windowH);

ctx.restore();

// loop of hell

while (i–) {

flakeA = flakes[i];

flakeA.update();

/*for (z = 0; z < flakes.length; z++) {

flakeB = flakes[z];

if (flakeA !== flakeB && distanceBetween(flakeA, flakeB) < 150) {

ctx.beginPath();

ctx.moveTo(flakeA.x, flakeA.y);

ctx.lineTo(flakeB.x, flakeB.y);

ctx.strokeStyle = '#444444';

ctx.stroke();

ctx.closePath();

}

}*/

ctx.beginPath();

ctx.arc(flakeA.x, flakeA.y, flakeA.weight, 0, 2 * Math.PI, false);

ctx.fillStyle = 'rgba(255, 255, 255, ' + flakeA.alpha + ')';

ctx.fill();

if (flakeA.y >= windowH) {

flakeA.y = -flakeA.weight;

}

}

requestAnimationFrame(loop);

}

function randomBetween(min, max, round) {

var num = Math.random() * (max – min + 1) + min;

if (round) {

return Math.floor(num);

} else {

return num;

}

}

function distanceBetween(vector1, vector2) {

var dx = vector2.x – vector1.x,

dy = vector2.y – vector1.y;

return Math.sqrt(dx*dx + dy*dy);

}

init();

}

</script>

<body onload = "myload()">

<canvas class="snow"></canvas>

</body>

</html>

140行代碼實現一個逼真的大雪紛飛的效果

140行代碼實現一個逼真的大雪紛飛的效果

最後效果如圖,相當酷炫:

140行代碼實現一個逼真的大雪紛飛的效果

相關文章:

  • 她曾是是湖南衛視當家一姐, 卻在5分鍾內就成了一個廢人, 現在的她更讓你無法想象
  • 網友炸了!別讓趙薇跑了!
  • 崔永元又做了一件大事!
  • 別了“範冰冰們”剛剛傳來大消息!
  • 七千多間客房被退訂,經濟損失近千萬,泰國人還想把鍋甩給中國
  • 崔永元再爆料:某女星零花錢竟有2個億!其丈夫曾放話要殺他!
科技

發佈留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

©2025 快讀 | 服務協議 | DMCA | 聯繫我們