Files
goodbuddy/tests/fixtures/web-3d-game-skill/SKILL.md
T

5.2 KiB

id, name, version, description, tags
id name version description tags
web-3d-game Web 3D Game 1.0.0 设计、实现并验证无需外部网络或安装依赖即可运行的浏览器 3D 游戏。 当用户要求制作可玩的 WebGL 游戏、3D 关卡、交互式 3D Demo 或需要实际启动和游玩验收时使用。
WebGL
3D 游戏
浏览器
交互原型

浏览器 3D 游戏

目标不是静态页面或“看起来像 3D”的插画,而是一个能启动、能操作、有明确目标和反馈、经过实际游玩验证的 3D 游戏。

开始前

  1. 先检查工作区,不覆盖用户已有文件。若目录非空,创建独立子目录。
  2. 若会话提供游戏设计、关卡或资产类 MCP 工具,必须先调用适用工具,并将其结果转化为实现约束。不得声称调用了未实际调用的工具。
  3. 明确一个短小但完整的玩法循环:移动或跳跃、收集或躲避、达成目标、胜利或失败、重新开始。
  4. 默认制作单人、离线、键盘可玩的游戏。除非用户明确要求,不加入账号、遥测、广告、远程资源或联网功能。

技术边界

  • 默认使用原生 HTML、CSS、JavaScript 和 WebGL2。可以在项目内实现小型向量/矩阵辅助函数,但不得引用 CDN、远程字体、远程贴图或运行时网络请求。
  • 不要求 npm install。若需要本地服务器,使用 Node.js 标准库编写 server.mjs,仅绑定 127.0.0.1,并限制在游戏目录内提供静态文件。
  • WebGL2 不可用时显示可读错误,不得用空白画布静默失败。
  • 使用透视投影、深度测试、可辨识的相机运动和至少一种明暗或雾效,确保场景是真实 3D 渲染,而不是 Canvas 2D 伪装。
  • 游戏循环使用 requestAnimationFrame,限制异常大的 delta time;窗口尺寸和 device pixel ratio 变化时正确调整画布。
  • 不读取工作区外文件,不执行下载脚本,不把密钥、环境变量或本机路径写入游戏。

最小项目结构

创建并说明下列文件。可按实际需要拆分更多本地模块,但所有引用必须留在项目目录:

  • index.html:画布、HUD、开始/暂停/结束界面和键盘说明。
  • styles.css:响应式布局、清晰焦点、可读对比度和状态反馈。
  • game.js:渲染、输入、物理/碰撞、规则、音画反馈和测试接口。
  • server.mjs:无依赖本地静态服务器,或在 README 中说明为何可直接打开。
  • README.md:启动命令、URL、控制方式、目标、文件结构和已执行的验收。

可玩性要求

游戏至少包含:

  • WASD 与方向键的等价移动;需要跳跃时支持 Space。
  • 明确的玩家实体、地面/平台、边界和相机跟随。
  • 至少一个有空间位置的目标集合,以及一个会改变游戏状态的障碍、计时或敌对机制。
  • HUD 显示目标进度和当前状态。
  • 收集、受击、解锁、胜利和失败中的适用反馈,可使用几何动画、颜色、屏幕提示和 Web Audio 合成音效。
  • 开始、暂停/继续、胜利或失败后的重新开始路径。
  • 页面失焦时清理按键状态,防止输入卡住。
  • 不依赖刷新页面即可重开一局。

首次进入页面不得因为浏览器音频策略而报错。仅在用户首次交互后创建或恢复 AudioContext。

可测试接口

在不改变正常玩法的前提下公开一个只读为主的测试表面:

window.__GOODBUDDY_GAME__ = {
  version: 1,
  getState() {
    return {
      status: 'ready',
      score: 0,
      target: 5,
      player: { x: 0, y: 0, z: 0 }
    }
  },
  setInput(action, active) {},
  reset() {}
}
  • status 至少区分 readyplayingwon 和适用的 lost/paused
  • getState() 只返回有界、可序列化的游戏状态,不返回 WebGL 对象或隐私数据。
  • setInput() 接受与真实按键相同的动作语义,用于自动化游玩,不得直接加分或跳过规则。
  • reset() 与界面中的重开按钮走同一条状态重置路径。

实现顺序

  1. 建立静态项目和启动方式,先确认页面可访问。
  2. 完成着色器编译、网格、透视相机、深度测试和 resize。
  3. 完成玩家控制、碰撞和相机跟随。
  4. 加入目标、障碍和完整状态机。
  5. 加入 HUD、开始/结束界面、视觉和音频反馈。
  6. 加入测试接口和 README。
  7. 启动本地服务器并实际游玩,不只检查源代码。

验收门禁

完成前必须验证:

  1. 启动命令能从全新终端成功运行,且只监听 loopback。
  2. 页面加载后没有 uncaught exception、着色器错误、404 或外部网络请求。
  3. 真实键盘可以开始、移动、完成核心目标并触发胜利或失败。
  4. 碰撞不会让玩家稳定穿过地面、边界或关键障碍。
  5. HUD 进度与 window.__GOODBUDDY_GAME__.getState() 一致。
  6. 使用 setInput() 也能通过同一玩法规则推进游戏,reset() 能恢复初始状态。
  7. 至少测试一次 resize 和页面失焦后的输入恢复。
  8. README 记录实际执行过的命令与结果,不把计划写成已验证事实。

若受当前环境限制无法启动浏览器或完成某项验证,明确列出未验证项和阻塞原因;不得将“文件已生成”表述为“游戏已可玩”。