3d8566bc-063f-41e8-8934-68c9ac5b8211

This commit is contained in:
2026-06-23 13:38:23 +00:00
parent 674775be0e
commit da18f32df2
36 changed files with 849 additions and 34 deletions
+21
View File
@@ -0,0 +1,21 @@
"use client";
// 回响星核 / Echo Nexus — 音频 React 适配
import { useEffect } from "react";
import { getAudio } from "@/lib/game/audio";
import { useGameStore } from "@/store/gameStore";
/** 同步全局音频开关到音频引擎 */
export function useAudioSync() {
const soundOn = useGameStore((s) => s.soundOn);
useEffect(() => {
getAudio().setEnabled(soundOn);
}, [soundOn]);
}
/** 便捷播放函数(组件内调用) */
export function sfx(
name: Parameters<ReturnType<typeof getAudio>["play"]>[0],
opts?: { color?: string; combo?: number }
) {
getAudio().play(name, opts);
}
+13 -4
View File
@@ -3,10 +3,11 @@
import { useEffect, useRef } from "react";
import { useGameStore } from "@/store/gameStore";
/** 100ms tick:产能 + 自动产晶体 + 自动解码 */
/** 250ms tick:产能 + 自动产晶体 + 自动解码 + 成就检测 */
export function useGameLoop() {
const tick = useGameStore((s) => s.tick);
const autoDecodeTick = useGameStore((s) => s.autoDecodeTick);
const checkAchievements = useGameStore((s) => s.checkAchievements);
const init = useGameStore((s) => s.init);
const inited = useRef(false);
@@ -15,22 +16,30 @@ export function useGameLoop() {
init();
inited.current = true;
}
let achCounter = 0;
const id = setInterval(() => {
const now = Date.now();
tick(now);
autoDecodeTick();
// 成就检测每秒执行一次(降低开销)
achCounter++;
if (achCounter % 4 === 0) {
checkAchievements();
}
}, 250);
return () => clearInterval(id);
}, [tick, autoDecodeTick, init]);
}, [tick, autoDecodeTick, checkAchievements, init]);
// 页面可见性:切回时补 tick
// 页面可见性:切回时补 tick + 立即检测成就
useEffect(() => {
const onVis = () => {
if (document.visibilityState === "visible") {
tick(Date.now());
checkAchievements();
}
};
document.addEventListener("visibilitychange", onVis);
return () => document.removeEventListener("visibilitychange", onVis);
}, [tick]);
}, [tick, checkAchievements]);
}