返回

兔年火树银花贺新春,烟花绚烂耀眼

前端

烟花照亮兔年:用 SVG 和 Canvas 点亮春节

兔年春节即将到来,而烟花作为春节传统习俗的代表,寓意着人们对新年的美好期盼和对幸福生活的向往。今天,我们就将带你使用一张兔子的 SVG 图片,通过 getImageData 获取图片像素数据,再结合 Canvas 动画效果,让你在兔年春节期间体验一场视觉盛宴。

第一步:准备 SVG 图片和像素数据

首先,准备好一张你喜欢的兔子的 SVG 图片,然后将其导入到你的项目中。接下来,使用 getImageData() 方法获取 SVG 图片的像素数据。这个方法可以让你访问图片每个像素的 RGB 值和透明度信息,为后续的烟花动画效果打下基础。

第二步:绘制烟花动画效果

在 Canvas 上绘制烟花动画效果需要使用以下步骤:

  1. 创建 Canvas 元素: 在你的 HTML 文档中创建并添加一个新的 Canvas 元素,它将作为你烟花动画的画布。
  2. 获取 Canvas 上下文: 获取 Canvas 元素的上下文对象,它可以让你在 Canvas 上进行绘制操作。
  3. 绘制烟花: 使用上下文对象,通过设定烟花的位置、速度、颜色、半径和透明度,在 Canvas 上绘制一个个烟花。为了营造逼真效果,可以为每个烟花设置不同的运动轨迹,并随着时间推移改变它们的透明度,模拟烟花消散的过程。

代码示例

// 创建 Canvas 元素
const canvas = document.createElement('canvas');
document.body.appendChild(canvas);

// 获取 Canvas 上下文
const ctx = canvas.getContext('2d');

// 烟花数据
const fireworks = [];

// 创建烟花
function createFirework(x, y) {
  return {
    x,
    y,
    velocity: {
      x: Math.random() * 2 - 1,
      y: Math.random() * 2 - 1,
    },
    color: `rgb(${Math.random() * 255}, ${Math.random() * 255}, ${Math.random() * 255})`,
    radius: Math.random() * 10 + 5,
    alpha: 1,
  };
}

// 更新烟花位置和透明度
function updateFireworks() {
  fireworks.forEach((firework) => {
    firework.x += firework.velocity.x;
    firework.y += firework.velocity.y;
    firework.alpha -= 0.01;

    // 透明度为 0 时移除烟花
    if (firework.alpha <= 0) {
      fireworks = fireworks.filter((f) => f !== firework);
    }
  });
}

// 绘制烟花
function drawFireworks() {
  // 清除画布
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  fireworks.forEach((firework) => {
    // 绘制烟花本体
    ctx.fillStyle = firework.color;
    ctx.beginPath();
    ctx.arc(firework.x, firework.y, firework.radius, 0, Math.PI * 2, true);
    ctx.fill();

    // 绘制烟花尾迹
    ctx.fillStyle = `rgba(${firework.color}, ${firework.alpha})`;
    for (let i = 0; i < 10; i++) {
      ctx.fillRect(
        firework.x + Math.random() * 20 - 10,
        firework.y + Math.random() * 20 - 10,
        2,
        2
      );
    }
  });
}

// 动画循环
function loop() {
  updateFireworks();
  drawFireworks();

  requestAnimationFrame(loop);
}

// 开始动画循环
loop();

常见问题解答

  1. 如何控制烟花的发射速度和数量?
    你可以通过调整 createFirework() 函数中设置的 velocity 和随机烟花数量来控制烟花的发射速度和数量。

  2. 如何改变烟花颜色?
    在 createFirework() 函数中,你可以修改随机颜色的生成方式,例如指定特定的颜色范围或使用预定义的颜色数组。

  3. 如何让烟花在特定的区域内发射?
    可以在 createFirework() 函数中设置发射位置的限制,确保烟花只在指定的区域内发射。

  4. 如何添加额外的烟花效果,比如爆炸和闪光?
    你可以通过在绘制烟花时添加额外的图形和动画效果,例如在爆炸时绘制一个扩散的圆圈或添加闪烁的效果。

  5. 如何优化烟花动画的性能?
    为了优化性能,可以减少同时绘制的烟花数量,并通过控制烟花的运动和透明度变化来降低 CPU 和 GPU 的负载。