首页宝宝踢:小脚连蹬 2~4 下带「咚」声后缩回,脚印缩小变淡(v26110650)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -9,7 +9,7 @@
|
||||
<title>兜爸心选 · 孕育陪伴</title>
|
||||
<!-- 11-04 UGC 总开关(孕妈广场 + 测一测,后台 /box_bm/plaza 顶部切换),见 js/ugc.js -->
|
||||
<script src="js/ugc.js?v=26110702"></script>
|
||||
<!-- V:26110649 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
|
||||
<!-- V:26110650 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
|
||||
<link rel="stylesheet" href="mama-box.css">
|
||||
<link rel="stylesheet" href="night.css?v=26110608">
|
||||
<link rel="stylesheet" href="js/wh-cm.css?v=26110642">
|
||||
@@ -2732,7 +2732,7 @@ html.night .rs-pan .rp-card{background:rgba(255,255,255,.06);border-color:rgba(2
|
||||
})();
|
||||
</script>
|
||||
<!-- 2026-10-03 首页彩蛋:宝宝在肚皮底下动(独立文件,删掉这一行即整体下线;开关在「隐私权限」) -->
|
||||
<script src="js/bump.js?v=26110649"></script>
|
||||
<script src="js/bump.js?v=26110650"></script>
|
||||
<!-- 2026-10-04 首页头图:按孕周换宝宝 + 阳光水波(独立文件) -->
|
||||
<script src="js/hero-fx.js"></script>
|
||||
<!-- 2026-10-05 首页头图:宝宝时不时动一动小手小脚(独立文件,删掉这一行即下线) -->
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
(function () {
|
||||
'use strict';
|
||||
/* 页面版本号(YYMMDD+序号):显示在「关于兜爸心选」页底部;bump 时同步 head 注释与 ?v= */
|
||||
var VER = '26110649';
|
||||
var VER = '26110650';
|
||||
const $ = (s, c) => (c || document).querySelector(s);
|
||||
const $$ = (s, c) => Array.from((c || document).querySelectorAll(s));
|
||||
|
||||
|
||||
32
js/bump.js
32
js/bump.js
@@ -242,6 +242,13 @@
|
||||
let t = .7; ft.beats = r.map(d => (t += d * m));
|
||||
ft.dur = Math.max(ft.dur, t + .9); ft.kicked = true; // 有节奏就不再「中途再顶一下」
|
||||
}
|
||||
/* 11-07 用户:「踢的时候伴随着小音效,紧着蹬了几脚之后又缩回去」→ 小脚丫一顶上来就原地快蹬 2~4 下,蹬完就收(不再停 3~5 秒) */
|
||||
if (P === PARTS.foot && !inChain && !ft.beats) {
|
||||
const n = 2 + (Math.random() * 3 | 0), m = stage && stage.slow ? 1.25 : 1;
|
||||
let t = .55; ft.beats = []; for (let i = 0; i < n; i++) ft.beats.push(t += (.26 + Math.random() * .12) * m);
|
||||
ft.dur = t + .75; ft.kicked = true;
|
||||
}
|
||||
if (!pk.held) kickSnd(P.soft || P.roll ? .55 : 1);
|
||||
ft.catchable = P !== PARTS.kick;
|
||||
if (!skin) skin = findSkin(ft.x, ft.y);
|
||||
gather(ft.x, ft.y, Math.max(P.rx, P.ry) * 1.25 + 20);
|
||||
@@ -274,6 +281,15 @@
|
||||
g.gain.setValueAtTime(.0001, t); g.gain.exponentialRampToValueAtTime(vol, t + .008); g.gain.exponentialRampToValueAtTime(.0001, t + len);
|
||||
o.connect(g); g.connect(a.destination); o.start(t); o.stop(t + len + .02);
|
||||
}
|
||||
/* 11-07 踢一下「咚」:低沉短促的闷声 + 一点点软的上泛,音量很小;跟随静音键(ambient)。
|
||||
AudioContext 必须在用户手势里建,否则一直是 suspended → 页面上第一次点 / 滑时先建好,之后宝宝自己踢就能出声 */
|
||||
function kickSnd(v) {
|
||||
if (!ac || ac.state !== 'running' || document.hidden) return;
|
||||
blip(150, 62, .11 * v, .15); blip(290, 150, .025 * v, .07, .012);
|
||||
}
|
||||
['pointerdown', 'touchend', 'click'].forEach(t => document.addEventListener(t, function un() {
|
||||
audio(); if (ac && ac.state === 'running') ['pointerdown', 'touchend', 'click'].forEach(x => document.removeEventListener(x, un, true));
|
||||
}, true));
|
||||
const buzz = p => { try { navigator.vibrate && navigator.vibrate(p); } catch (e) {} };
|
||||
|
||||
function heart(x, y) {
|
||||
@@ -360,7 +376,7 @@
|
||||
ft.beat++; ft.h.vel -= 85; ft.pop = .12;
|
||||
ft.ox += (Math.random() - .5) * 10; ft.oy += (Math.random() - .5) * 10;
|
||||
}
|
||||
if (ft.pop > 0 && (ft.pop -= dt) <= 0) ft.h.vel += stage && stage.slow ? 95 : 150;
|
||||
if (ft.pop > 0 && (ft.pop -= dt) <= 0) { ft.h.vel += stage && stage.slow ? 95 : 150; kickSnd(.8); }
|
||||
}
|
||||
if (u > ft.dur) {
|
||||
// 连续踢:这一下收得快一点,旁边紧接着再来,不等下一个间隔
|
||||
@@ -473,15 +489,15 @@
|
||||
cx.fill();
|
||||
}
|
||||
function footprint(x, y, rx, ry, ang, k, life) {
|
||||
/* 11-07 用户纠正:「要按之前的踢法——先从页面底下把页面踢得鼓起来,隐隐约约,之后才能看清一个小小的脚丫子」
|
||||
→ 前 0.7 秒只有鼓包,之后 1 秒里小脚丫才慢慢浮出来;脚印缩小到鼓包的一半、软边,最清楚时也只是浅浅一层(不是贴上去的脚丫图);鼓包收回去时跟着淡掉 */
|
||||
if (k < .5 || life < .7) return;
|
||||
/* 11-07 用户二次纠正:「隐隐约约看出来是个小脚印就行,不能那么大」——主角是页面被小脚撑起来的鼓包,
|
||||
脚印只是鼓包顶上很小、很淡的一层(鼓包的 1/3 大,软边,峰值 0.12),顶到一半以上、第一下蹬上来之后才有 */
|
||||
if (k < .5 || life < .35) return;
|
||||
const sm = v => (v = Math.min(1, Math.max(0, v)), v * v * (3 - 2 * v));
|
||||
const a = sm((k - .5) / .5) * sm((life - .7) / 1), f = .5;
|
||||
const a = sm((k - .5) / .5) * sm((life - .35) / .4), f = .34;
|
||||
cx.save(); cx.translate(x, y); cx.rotate(ang); cx.scale(rx * f, ry * f);
|
||||
cx.shadowBlur = 6 * dpr;
|
||||
cx.fillStyle = cx.shadowColor = 'rgba(255,255,255,' + (.2 * a).toFixed(3) + ')'; soleShape(-.03, -.035);
|
||||
cx.fillStyle = cx.shadowColor = 'rgba(120,72,58,' + (.24 * a).toFixed(3) + ')'; soleShape(0, 0);
|
||||
cx.shadowBlur = 4 * dpr;
|
||||
cx.fillStyle = cx.shadowColor = 'rgba(255,255,255,' + (.16 * a).toFixed(3) + ')'; soleShape(-.04, -.05);
|
||||
cx.fillStyle = cx.shadowColor = 'rgba(110,70,58,' + (.12 * a).toFixed(3) + ')'; soleShape(0, 0);
|
||||
cx.restore();
|
||||
}
|
||||
function paint() {
|
||||
|
||||
Reference in New Issue
Block a user