使用canvas制作夜空流星划过的动画

88 阅读2分钟

"```markdown

使用Canvas制作夜空流星划过的动画

在这篇文章中,我们将使用HTML5的Canvas API来创建一个简单的夜空流星划过的动画。这个动画包含一个黑色背景和多个流星划过的效果。

HTML结构

首先,我们需要设置基本的HTML结构。我们将创建一个包含Canvas元素的HTML文件。

<!DOCTYPE html>
<html lang=\"zh\">
<head>
    <meta charset=\"UTF-8\">
    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">
    <title>夜空流星动画</title>
    <style>
        body {
            margin: 0;
            overflow: hidden;
            background-color: black;
        }
        canvas {
            display: block;
        }
    </style>
</head>
<body>
    <canvas id=\"nightSky\"></canvas>
    <script src=\"script.js\"></script>
</body>
</html>

JavaScript代码

接下来,我们将编写JavaScript代码来处理Canvas的绘制和动画。我们将创建一个Meteor类来表示流星,并在Canvas上绘制它们。

const canvas = document.getElementById('nightSky');
const ctx = canvas.getContext('2d');

canvas.width = window.innerWidth;
canvas.height = window.innerHeight;

class Meteor {
    constructor(x, y, length, angle, speed) {
        this.x = x;
        this.y = y;
        this.length = length;
        this.angle = angle;
        this.speed = speed;
        this.opacity = 1;
    }

    update() {
        this.x += Math.cos(this.angle) * this.speed;
        this.y += Math.sin(this.angle) * this.speed;
        this.opacity -= 0.02; // 渐变消失
    }

    draw() {
        ctx.strokeStyle = `rgba(255, 255, 255, ${this.opacity})`;
        ctx.lineWidth = 2;
        ctx.beginPath();
        ctx.moveTo(this.x, this.y);
        ctx.lineTo(this.x - this.length * Math.cos(this.angle), this.y - this.length * Math.sin(this.angle));
        ctx.stroke();
    }
}

const meteors = [];

function createMeteor() {
    const x = Math.random() * canvas.width;
    const y = Math.random() * canvas.height / 2; // 从上半部分开始
    const length = Math.random() * 20 + 10;
    const angle = Math.random() * Math.PI / 4 + Math.PI; // 从右上角划过
    const speed = Math.random() * 5 + 3;
    meteors.push(new Meteor(x, y, length, angle, speed));
}

function animate() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    
    // 生成新的流星
    if (Math.random() < 0.1) createMeteor();

    // 更新和绘制流星
    meteors.forEach((meteor, index) => {
        meteor.update();
        meteor.draw();
        if (meteor.opacity <= 0) {
            meteors.splice(index, 1); // 移除透明的流星
        }
    });

    requestAnimationFrame(animate);
}

animate();

代码解析

  1. 初始化Canvas:通过getContext('2d')获取2D上下文,用于绘制图形。设置Canvas的宽度和高度为窗口的宽度和高度。

  2. Meteor类:流星类包括位置、长度、角度和速度属性。update方法更新流星的位置和透明度,draw方法绘制流星。

  3. createMeteor函数:随机生成流星的属性,并将其添加到流星数组中。

  4. animate函数:清除Canvas,生成新的流星,并更新和绘制现有流星。使用requestAnimationFrame实现动画循环。

结束

通过以上步骤,我们创建了一个简单的夜空流星划过的动画。可以根据需要调整流星的生成概率、速度和颜色,以实现不同的效果。