Local MCP Server
在Termux中运行本地MCP服务器,支持Ollama模型的文件读取与命令执行。
下载 11
基于 requestAnimationFrame 的 React 游戏循环与动画钩子,支持 delta 时间处理和安全清理。
openclaw skills install @ravenquasar/react-game-loop命令、参数、文件名以原文为准
适用于使用 requestAnimationFrame 的游戏循环和动画的生产就绪自定义 React Hook。
将 Hook 文件复制到你的项目中:
# 从你的技能目录中
cp <skill-dir>/assets/hooks/useGameLoop.ts src/hooks/
<skill-dir>指代你的 OpenClaw 技能安装目录。
requestAnimationFrame 类型)此 Hook 仅限浏览器环境使用 —— 它依赖于 requestAnimationFrame,在 Node.js 或 SSR 环境中不可用。
useGameLoop(options)import { useGameLoop } from './hooks/useGameLoop';参数:
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
onFrame | (deltaTime: number, elapsedTime: number) => void | — | 每帧调用一次,传入时间差(毫秒)和累计时间(毫秒)。必填。 |
maxDeltaTime | number | 100 | 最大时间差限制(毫秒)。防止标签页切换或卡顿时出现巨大跳跃。 |
返回值:
| 字段 | 类型 | 描述 |
|---|---|---|
start | () => void | 启动游戏循环 |
stop | () => void | 停止游戏循环 |
isRunning | boolean | 当前循环状态 |
在异步或闭包上下文中(如 requestAnimationFrame、setInterval、事件监听器)读取回调或状态时,请使用 useRef。始终在 useEffect 中同步 ref。
const cbRef = useRef(onFrame);
useEffect(() => { cbRef.current = onFrame; }, [onFrame]);在 useEffect 中始终返回清理函数。对于 RAF 或定时器,将句柄存储在 ref 中,并在卸载时取消。
useEffect(() => {
const id = requestAnimationFrame(tick);
return () => cancelAnimationFrame(id);
}, []);将用户回调包裹在 try/catch 中,防止错误影响内部循环状态。
try {
callbackRef.current(delta, elapsed);
} catch (err) {
console.error('hook 回调错误:', err);
}在游戏循环中,对 deltaTime 进行限幅,避免标签页切换或卡顿导致的时间跳跃。
const delta = Math.min(rawDelta, maxDeltaTime);参见 assets/examples/GameTimer.tsx,获取完整使用示例,展示累计时间与 FPS 显示功能。
assets/hooks/useGameLoop.ts — 基于 requestAnimationFrame 的游戏循环,包含启动/停止/运行状态控制、时间差限幅和错误容错assets/examples/GameTimer.tsx — 基础使用示例已收录 1 个 Skill