【新春创意营】我用代码造了个能放鞭炮的节拍器

《零依赖纯前端实现春节音游:我用代码造了个能放鞭炮的节拍器》


项目背景

春节想做个有年味的小玩意,但不想依赖任何外部资源(图片/音频文件)。于是用纯前端技术栈实现了一个节奏点击游戏:点击屏幕跟着节拍"放鞭炮",连击越高年味越浓。


核心玩法

机制:圆圈从外向内缩放到命中线时点击,判定分 Perfect/Good/Miss,支持连击加成。

节拍生成算法

JavaScript

复制

// 以半拍为步进,制造节奏感
const step = 60/BPM/2; // 0.3s @ 100BPM
规则:每小节 0/2/4/6 拍必生成
      10% 概率在奇数拍加花
      6% 概率空拍制造悬念

计分:基础分 + 连击×2,准确率加权计算"年味指数"。


技术亮点

1. Web Audio API 合成音效(零音频文件)

点击反馈

JavaScript

复制

oscillator.type = "square";
oscillator.frequency.setValueAtTime(900, t);
gain.gain.exponentialRampToValueAtTime(0.18, t+0.01);

爆竹噪声(核心 trick):

JavaScript

复制

// 生成白噪声 + 指数衰减包络
for(let i=0; i<bufferSize; i++){
  const env = Math.exp(-i/(sampleRate*0.02)); // 20ms衰减
  data[i] = (Math.random()*2-1) * env;
}
// 带通滤波器模拟鞭炮的"噼啪"质感
biquadFilter.type = "bandpass";
biquadFilter.frequency.value = 1400;

不用加载资源,首屏即玩,且每次爆炸都是"真随机"。

2. CSS 烟花(伪元素魔法)

不用 Canvas 画烟花,用 ::before/::after + box-shadow 实现爆炸:

css

复制

.firework::before {
  box-shadow: 
    0 -20px 0 -2px #ffd700,
    14px -14px 0 -2px #ff6b6b,
    /* 8个方向... */
}
animation: explode 1s ease-out;

性能友好,且能响应式适配。

3. 中式边框设计

放弃圆角卡片,改用四角花纹 + 双层边框

  • 外层:box-shadow 模拟红绸厚边

  • 四角:content: "❖" 金色装饰符

  • 内框:渐变金色线条 + 虚线衬底

配色锁定 #8B0000#ffd700,传统且高级。


踩坑记录

表格

复制

问题 解法
音频自动播放被拦截 首次点击才初始化 AudioContext
移动端点击延迟 touchstart + preventDefault
Canvas 模糊 根据 devicePixelRatio 缩放画布
节拍漂移 audioContext.currentTime 而非 Date.now

最终效果

  • 体积:单 HTML 文件,< 15KB

  • 依赖:0(纯原生)

  • 平台:移动端优先,桌面端兼容

  • 特色:每局 45 秒,适合碎片时间,结算可分享"年味指数"


源码


体验地址https://ggboypip-ai.github.io/newchun/index.html

核心收获:浏览器的多媒体 API 足够强大,纯代码也能造出完整的感官体验。春节不需要 Heavy,有节奏、有声响、有那点红,就够了。

哈哈哈可以的

哈喽,想问一次天猫卷什么时候可以发哇

看私信 等你很久了 :joy:

不好意思哈哈,没看见 :rofl:

终于等到你,还好她没放弃 :grinning_cat_with_smiling_eyes:

1 个赞