Community编程与开发github.com

BennyKok/omg.dev

使用 omg.dev 的 web-game 模板构建一个适用于手机的 2D 或 3D 小游戏(街机、俯视、竞速、解谜、儿童、文字、简易 3D)。该工具包已包含引擎、完整游戏 UI、三套主题、每日挑战、好友挑战、分享、音效、追踪和 SEO。只需替换示例游戏;无需重建整个工具包。

omg.dev 是什么?

该技能指导 AI 代理使用 omg.dev 平台的 `web-game` 模板构建一个面向手机的浏览器游戏。它提供了一个“游戏工具包”,其中包含完整的游戏基础设施,例如 UI 组件(菜单、HUD、暂停界面、结果界面)、主题系统、触摸和键盘输入处理、音效、分析追踪以及 SEO 配置。用户或 AI 的任务是替换模板中附带的示例游戏(Coin Dash),而不是从头开始构建。这需要修改核心游戏逻辑、画面渲染、美术资源和文本,同时严格遵守固定规则,例如保持游戏无服务器、依赖本地存储保存进度,以及使用确定性随机函数模拟随机数,以确保每日挑战和分享种子链接的一致性。技能要求执行特定的构建顺序,包括启动实时预览、规划核心循环、复制并修改游戏逻辑文件、更换所有示例美术资源,以及通过一系列检查命令(`typecheck`、`test`、`check:ui`、`check:play`)验证每次修改。最后,它能够使用 `omg_deploy` 命令部署游戏,并支持通过链接分享和挑战功能。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/BennyKok/omg.dev/tree/HEAD/agents/skills/omg-web-game-builder

Installed? Explore more 编程与开发 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

从工具包构建手机网页游戏

web-game 模板是一个基于 Vite + React + TypeScript 的完整游戏(Coin Dash)。你的任务是替换其规则、视图、文本和美术资源,以实现用户的游戏。优先考虑手机:竖屏 390 x 844,单手操作。桌面端也必须能正常工作。

固定规则

  1. 在任何代码编辑之前,先启动实时预览(构建顺序第 1 步)。然后编写代码:用至多 10 行规划,然后进行编辑。每次只修改一个文件或一个功能,然后运行 bun run typecheck。
  2. 绝不重建工具包已有的内容(见下方列表)。不要添加游戏引擎、UI 库或 @react-three/fiber。
  3. 游戏规则是 src/games/<game>/logic.ts 中的纯函数: 不能使用 React、DOM、绘图、Date.now() 或 Math.random()。使用 seeded(seed)。相同的种子必须产生相同的游戏结果:每日挑战和挑战模式依赖于此。
  4. 无服务器,无登录。进度保存在 localStorage 中(工具包已实现)。
  5. 文本中的每一个声明都必须与游戏的实际行为相符。
  6. “已验证”意味着已看到其实际运行: bun run check:play 已通过,并且你已查看了其在手机尺寸下的截图。从实时链接返回 HTTP 200 状态码不算测试。check:play 是无头运行的,不需要桌面或浏览器窗口。

工具包已经具备的功能(不要重新构建)

  • 固定步长循环、键盘和触摸输入(任意位置拖拽、摇杆、方向键、转向、动作按钮、多点触控、双人模式、在电脑上鼠标拖拽)、摄像机、碰撞检测、标签页隐藏时暂停。
  • 在 src/ui/ 中提供 2D 和 3D 通用的游戏 UI:菜单、HUD 条(分数徽章、生命值、计时器、暂停按钮)、暂停界面、结果界面、解锁功能、玩法介绍与常见问题、旋转手机提示、弹窗提示、路由、已保存的个人资料。
  • 在 src/ui/theme.ts 中的主题:softCandy(默认)、glassNeon、cleanMinimal。访问 ?theme=glassNeon 可以预览其他主题。
  • 最高分和解锁功能;每日挑战(基于日期种子、从发布日算起的数字、连胜记录);挑战链接 ?c=<seed>&s=<score>&n=<name>,带清理后的参数以及“你赢了 / 你输了”的结果和“发送回去”的按钮;使用 navigator.share 或剪贴板复制进行分享;首次点击后播放 Web Audio 音效,并可记住静音状态;振动功能静默失败。
  • track(name, data) 函数,支持事件:game_open、game_start、game_over、play_engaged(45 秒)、share、challenge_open、daily_complete。在开发中事件会输出到控制台,在发布页面上会发送到 omg 分析平台。play.tsx 中的 useRun 会发送这些事件;不要重复发送。
  • 100dvh、安全区域、无滚动或缩放、48 像素的触摸目标、减少动画效果。
  • 基于 src/app/about.ts 构建的 SEO:标题、描述、Open Graph 分享图像、VideoGame 和 FAQPage 结构化数据。安装清单来自 omg Vite 插件,使用 public/icons/ 中的文件。

选择 2D 或 3D

默认为 2D(脚本压缩后约 100 KB)。仅在需要深度感时才使用 3D;它会添加 three.js 库(压缩后约 137 KB),在菜单显示期间加载,且绝不会出现在 2D 构建中。通过在 src/app/view.ts 中修改一行代码进行切换,然后删除未使用的视图文件。

选择控制方式

在 src/app/about.ts 中设置一次,配置 GAME.controls 对象:kind(控制类型)、touchHint(手机端菜单提示文本)和 keysHint(电脑端菜单提示文本)。play.tsx 会将 GAME.controls.kind 传递给 <TouchControls> 组件。这两个提示文本以及 howToPlay(玩法介绍)必须描述同一种控制方式。对于使用按钮的游戏,绝不要使用“拖拽”一词;对于拖拽游戏,绝不要使用“点击箭头”一词。如果提示文本中引用了其他控制方式,check:ui 和 check:play 检查将会失败。

游戏类型kind 值玩家操作规则读取方式
接挡、捕捉、跑酷、赛道躲避、弹弓drag在场地上任意位置拖拽axisX/axisY;使用 mode="absolute" 时,通过 dragTarget 让挡板位于手指下方
俯视角游戏、自由移动、双摇杆射击stick操作左下角的摇杆axisX/axisY
网格移动:迷宫、贪吃蛇、推箱子dpad点击四个方向箭头axisX/axisY 或 wasTapped
赛车、双键变道steer按住左或右axisX
单次点击:flappy bird、跳跃、时机游戏buttons点击动作按钮wasTapped(input, "p1", "a")

可以使用 buttons={[...]} 在任何控制类型上添加动作按钮。axes="x" 将拖拽限制为左右方向。键盘始终有效:方向键或 WASD,以及空格键。

构建顺序

  1. 首先预览,在编辑任何文件之前: 如果缺少 node_modules 文件夹,在项目目录中运行 bun install。然后在后台启动 bun run dev(端口 5174)。调用 omg_expose_port,端口设为 5174,不要使用 expoGo。告诉用户:“预览已准备就绪,位于下方卡片中。它会在您构建时自动更新。” Vite 会在后续每次保存时重新加载预览。如果首次运行步骤已完成此操作,或者端口 5174 已被此项目的开发服务器占用,则直接进入步骤 2。
  2. 规划: 用一句话描述核心循环,选择控制类型(见上表)、胜利条件、失败条件、得分方式以及回合如何结束(计时、生命值或掉落物)。将规划写入 README.md。
  3. 规则: 将 coin-dash/logic.ts 复制到 src/games/<game>/logic.ts。保留 createGame(players, seed)、stepGame(game, input, dt)、finalScore、events(用于音效)、UNLOCKS、shareLine 这些函数和对象。使用 axisX/axisY/wasTapped 读取输入。
  4. 视图: 复制 view-2d.ts(画布:drawWorld、drawShadow、loadImage)或 view-3d.ts(three.js:createStage、chaseCamera、billboard、checkerTexture;共享几何体、Lambert 材质、无阴影映射的 blob 阴影)。当设置了美术资源图像时绘制它,否则绘制占位形状。
  5. 连接: 在 src/app/play.tsx 中修改导入、HUD 数值、FEEDBACK(每个事件对应的音效)、按钮以及 run.finish({...}) 这一行。保留 <TouchControls kind={GAME.controls.kind}>、<HudScore icon={ART.scoreIcon}>、run.step 和 run.finish。
  6. 文案: 填写 src/app/about.ts(游戏名称、包含搜索词的标题、描述、标语、控制方式、上线日期、游戏方向、3 到 5 步的玩法介绍、技巧提示、4 到 6 个常见问题)。
  7. 美术资源(必须): 工具包自带 Coin Dash 示例美术资源,这些资源绝不能出现在用户的游戏中。在 theme.ts 中选择预设主题,或者自行扩展一个主题并设置客户的颜色。使用 omg_generate_image 生成图片,保持统一风格(一张精灵图,切割成透明 PNG,游戏总大小控制在 3 MB 以下),并替换所有以下项目:
    • src/app/art.ts 中的 ART.hero(菜单标题下的美术图)和 ART.scoreIcon(HUD 分数图标)。删除 public/art/hero.svg 和 public/art/score.svg。
    • ART.items(每种解锁一个)和 ART.sprites。
    • public/icons/(pwa-192x192.png、pwa-512x512.png、pwa-512x512-maskable.png、尺寸为 180 的 apple-touch-icon.png)和 public/og.png(1200 x 630)。 然后查看菜单、游戏和结果页面的截图:确保没有红色跑者、金币、金币徽章出现,除非游戏主题就是关于金币的。
  8. 检查: 依次运行 bun run typecheck、bun test、bun run check:ui,然后运行 bun run check:play。check:play 会在 390 x 844 的尺寸下通过触摸操作进行一个回合的测试:菜单、开始游戏、你的控制方式、暂停、恢复、结果界面、控制台错误、示例美术资源。打开 .omg/ui-check/ 和 .omg/play-check/ 中的每一个 PNG 截图。修复每一个 FAIL 和 WARN 错误,然后再次运行这些检查。在 check:play 通过之前,不要发布。
  9. 发布: 执行 omg_deploy。首次发布需要 public/omg-store/1.png 到 3.png(菜单、游戏、结果界面在 390 x 844 尺寸下的截图)。等待一分钟,然后运行 bun run check:play -- --url <上线后的链接>,并查看其截图。仅报告在此次检查中通过的项目。

只有在工具包的 Bug 阻碍你时才编辑 src/ui/、src/game/ 和 src/render/ 目录。将辅助函数添加到你自己的游戏文件夹中。

手机端规则

  • 保留视口标签、styles.css、page.ts。将 HUD 元素放在 <Hud> 组件内。重要的控制按钮保持在屏幕下半部分。
  • 游戏中不要使用 setInterval、setTimeout 或 Date.now() 来计算时间:使用 dt 增量时间。
  • 不要使用 alert、confirm、prompt、外部字体或外部脚本。
  • 3D 限制:最多几百个网格,重用几何体和材质,无后期处理,无大纹理。
  • 在手机上,omg 安装栏位于游戏下方,游戏变为其上方的卡片。不要隐藏或移动它。

最终报告

  1. 上线后的链接。2. 用一句话描述游戏。3. 测试了哪些内容以及测试的尺寸,包括在上线链接上执行 check:play 的结果。4. 菜单、游戏和结果界面的截图。5. 已知问题或后续想法(最多 5 条)。说明是否在真实手机上测试过 3D 游戏。

已学到的经验教训

  • 一行中末尾的按钮如果因横向滚动而移出屏幕,会导致玩家无法操作。check:ui 会检测此类按钮的失败;请确保关键按钮在 360 像素宽的屏幕上可见。
  • “已验证”的结论在部署后立刻得出,而此时线上网站仍在提供旧版本。请稍等片刻后重新检查。
  • 游戏的副本会与源版本产生差异。请从单一文件夹构建;绝不修补副本。
  • Fruit Catcher(10 月 22 日)在游戏有一对方向箭头按钮的情况下,提示文本却说“向左或向右拖拽移动篮子”,导致拖拽无效。正确设置 GAME.controls,并让 check:play 来驱动测试。
  • 同一款游戏发布时带有工具包的红色跑者、金币、金币分数徽章和金币应用图标。步骤 7 会替换所有这些内容;check:play 会对任何残留的示例文件报错。
  • 用户等待了 5 分钟未看到预览,因为端口从未暴露。步骤 1 必须在任何编辑之前完成。
  • 代理写道“桌面浏览器未运行”,并仅通过 HTTP 检查了上线链接。check:play 是无头运行的;请直接在上线链接上运行它。
  • 为新的自定义事件(play_engaged)优化的广告被弃用了。请从标准目标开始投放广告,待该事件每周触发约 50 次后再切换。

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相关技能