Skip to content
 
 

Repository files navigation

是男人就飞三次

一款赛璐璐风格的海上街机竞速游戏。“单人”会自动前进,玩家负责转向、漂移和起飞; “双打”沿用同一条竞速规则,两名玩家各驾一艇,与四名 AI 同场争夺名次和荣誉。

文档分工

  • README:给玩家、试玩者和准备参与项目的人看,说明游戏是什么、怎么玩、怎么运行。
  • docs/llmwiki.md:给 AI 和接手代码的开发者看,记录稳定的玩法、输入、生命周期、视觉和验收契约。
  • docs/development-handoff.md:记录当前版本的开发交接、已完成事项、未完成事项和风险,不承担长期架构说明。
  • docs/expansion-gallery-handoff.md:只记录资料片画廊及未来资料片玩法。

在线试玩

打开网页版

游戏是本地前端应用,成绩和设置保存在当前浏览器的 localStorage,不会要求账号。 清理站点数据或使用无痕窗口会得到一份新的存档。

本地运行

npm install
npm run dev

打开终端输出的地址即可。生产构建和本地验收命令见开发参与

玩法目录

桌面版从玩法目录进入两条并列体验:

  • 单人:一艘艇对抗五名 AI。油门自动保持,玩家专注转向、漂移、起飞和路线判断。
  • 双打:两名玩家各驾一艘艇,与四名 AI 共六艇竞速。两艘玩家艇共享一条完整赛道和排名, 画面左右 50/50 独立追拍,左屏只跟左席、右屏只跟右席;不会再进入旧的固定分屏工位玩法。

双打先经过“按键入座”,再进入选角:键盘左区按 A、右区按 D,或手柄用左摇杆 / 十字键的 左、右方向决定自己负责的席位。入座后画面归属和设备不会交换;两席各自拥有大幅立绘、候选轨道和 确认锁定,选手不能重复。双打开始前就把左、右操作写在 HUD 上,避免进场后猜键。

双打沿用单人的漂移、飞行、七飞 Final 和六艇排名规则。左席键盘使用 W/A/S/D,右席使用 方向键;手柄两席都用同一根左摇杆的 X 轴转向、Y 轴前进 / 刹车 / 倒车,松杆时保持自动前进。 一席淘汰后不会把另一席也判负:幸存者继续比赛,暂离席可以用独立的安全支援或追踪鸭浪花互动连接赛道, 并且这些动作会进入本局荣誉结算。旧的“队伍协作”工位版本已封存到 archive/team-expedition-it-takes-two 分支,主分支不再把它当作可选模式。

双打达到三飞资格时只记录该席资格并继续六艇竞速,不会像单人那样冻结全场播放勋章仪式; 这样另一名玩家不会被迫等待。单人仍保留原有的资格仪式。

失败会先进入“失败回顾”,显示具体原因、距离 / 高度证据和下一次操作建议;确认“看高光”后再进入 荣誉墙。成功冲过 Final 后会先完整播放“七飞认证”,确认“查看高光”才进入荣誉墙。荣誉墙默认聚焦“游戏尚未结束”,结算后显示 5 秒倒计时并自动回到赛道,也可以立即确认;确认后复用同一场比赛的 Final 续跑倒计时,已完成 的飞行门不会归零;“再来一局”才会重置整场比赛,“玩法目录”用于离开。荣誉墙还给出六人名次、 积分、四张荣誉卡和本局 / 历史荣誉值。最终冲线会生成“终点船长”荣誉卡,并与本局其他荣誉一起 写入历史记录;记录结构使用稳定 id 和累计 honorScore,后续可以直接接服务端。

单人玩法

每一飞都遵循同一条节奏:

  1. 按住漂移键,让船边的 BANK 读条越过黄色刻度。
  2. 松开漂移键,把一格飞行库存存进船边的菱形。
  3. 靠近半透明白雾起飞入口时按起飞键,沿空中航道穿过门。
  4. 空中继续用漂移键空刹并转向,把船压回急弯里的白雾线路。

漂得更久只会让这次水面 BOOST 持续更久,不会把一格飞行变成长航程;真正的飞行 库存来自“过黄线后松开”。最多可以存三格,每次水面起飞消耗一格;即使还有多格库存, 同一飞也最多只能再消耗一格续航一次。

正规水面路线上的 checkpoint 浮漂是真实障碍:撞中会损失 20% 速度,把浮标抛起并弹飞鸭子气球; 气球旋转升空后爆成羽毛,浮标落水并稍后归位,不会判负;

水面上偏离主线的是一组可绕线追逐的实体荣誉浮标:六枚铸造金币, 底部由浮筒、泡沫圈和信号桅杆托在水面上;金币有锯齿边、双层轮缘、罗盘压印和短促的环形高光, 只放在中段水面扇区,起终点视线保持干净。撞入外圈会记录一次荣誉,正面通过会额外记录 center 精度;命中会播放双音拾取提示、固定池的金币碎片、扩散金环和专属金色提示卡,并沿双打席位分到各自安全带, 不会回收飞行格、改变 BOOST 或接管路线,玩家可以在不打乱主线的前提下主动选择风险路线。 菱形升空入口和飞行分支只负责导航,不生成锥体或浮漂。飞行中或高空浪跳不会触发这类撞击。

当前六名选手依次为 GLMChatGPTGeminiKimiClaudeDeepSeek;选手卡片会同时显示 对应的中文玩梗名 盛唐俊杰山姆傲慢美国豆包KK打你嗷梁圣梁子。英文模型名保留为稳定身份, 开场身份牌和选手电台使用中文玩梗名。前三飞完成后会冻结当前比赛,播放 男人勋章 仪式,仪式上可以直接翻开神秘资料片画廊;恢复后继续挑战第四至第七飞。第七 门计分并完成落水回收后,普通水面偏航和逆行判定解除,具备完整七飞资格的选手从任意方向穿过可见金门即可完成 Final。 终点按每条合格船真实穿门的先后顺序结算;停在门前让合格对手先过,名次也会如实下降。尚未完成七飞的落后船即使绕回物理门线,也不会被误记为冲线者,也不会在 Final 等待期间凭多跑一圈挤到合格船前面,仍按正常赛道继续跑。在第七门 之前,漏门、提前落水、偏离空中航道和水面逆行仍然会结束本局。

操作

单人操作(手机也只开放这一套低门槛操作):

设备 转向 漂移 / 空刹 起飞 / 续航
键盘 A D Shift(按住) Space
手柄 左摇杆或方向键 X / Square,肩键也支持 A / Cross
手机 左侧触控区 右下 漂 / 刹 右侧上方

双打操作:两席各自读取一套完整的方向向量;手柄不使用 RT / LT 推进。

席位 / 设备 前进 / 制动倒车 转向 漂移 / 空刹 起飞 入座 / 互动
左席键盘 W / S A D Left Shift Space 入座 A;淘汰后 Q 支援 / E 浪花
右席键盘 / (也支持 J L Right ShiftKNumpad 0 Numpad Enter(也支持 I 入座 / ;淘汰后 U 支援 / O 浪花
每只手柄 左摇杆 Y:前进 / 刹车;十字键上下备用 同一根左摇杆 X X / Square A / Cross 入座左 / 右;淘汰后 B 支援 / Y 浪花

手柄斜向输入同时转弯和推进;左上、左下都算左席方向,右上、右下都算右席方向。 松杆时保留自动前进,向下才会制动或倒车,所以玩家不需要一直按住油门。Esc / Start 冻结整局,确认继续,返回键退出到玩法目录。设备断开会冻结模拟,重连后清除旧边沿再继续。

一席淘汰后,幸存者继续争名次;淘汰席的设备只读取支援 / 浪花边沿,不会再抢夺船的转向、 速度或起飞输入。每次互动有冷却和三格库存:支援只在水面安全窗口补一格飞行电池;浪花会先发射一只 带大幅螺旋轨迹的追踪鸭,幸存者可主动躲开,命中也只造成轻微侧向水花,不反向、不锁定、不影响飞行门。 淘汰席的画面会追拍幸存者,不会停在原地发呆。

单人没有加速键,油门会自动保持;双打加入前进、制动和倒车。键盘的 Shift 在水面是漂移, 进入空中后是空刹。手机默认使用触控转向,横屏游玩,竖屏会暂停并提示旋转设备。 体感转向是主动选择的备用模式,不会改变右侧漂移和起飞按钮的位置。手柄漂移有持续震感,每次落水都会 有一次强力震动;体感反馈可以在混音面板整体开关。

手机默认是“转向 · 触控”,左侧两个大区负责左转 / 右转;点右上角切换为“转向 · 体感”后, 屏幕左下会出现“体感转向”刻度:向左或向右倾斜手机,标记回到“回中”就是直行。选角页的 “选手能力对比”雷达只表示加速、转向、漂移、空控对本局手感的微调,不是操作控件。

第一次在 PC 键盘上开局时,画面会用一条不阻塞操作的短提示告诉你先按住 Shift; 第一次真实失败后,才会邀请你开启更完整的逐步驾驶提示。所有提示都可以跳过,且不会 降低物理难度或影响勋章资格。起飞与续航提示卡只在你还没掌握该动作时出现,练会之后就 不再弹出;每飞续航限一次,用完后继续按起飞键不会有第二次效果,画面会直接告诉你本次 续航已用完、剩余库存留给下一飞。

点下 GO 后不会立刻把你扔进倒计时:会先锁住输入约 3.6 秒,让六名选手、艇和车手 在海面上完成一段开场亮相。Chromium 如果刚好弹出自己的全屏说明,倒计时还会再等一小段 固定缓冲,让浏览器的提示先退场;这段等待只发生在开局展示,不会改变比赛中的速度或判定。

画面、声音与保存

半透明白雾航道表示“可以飞行的空间”,绿色水面线表示“当前推荐的水面路线”。航道会沿真实 路线流动,并在急弯前用形状和方向提前提示,不会接管转向。冲过门后的惯性会保留, 门后回收尾段和水面路线会平滑交接。偏出白雾边缘不会立刻判负:雾气会先被撕裂、 船身被风吹得摇晃并被缓缓带离航道,同时警报与震动逐级增强;只要立刻回正就能 救回来,越飘越深才会失速下坠、判为偏离航道。

六位选手在艇上露脸驾驶,发色、肤色与立绘一致,白色赛服配各自战队色的手套和滚边; 两位女选手分别保留青色发梢 bob 与高马尾轮廓,开场身份牌会明确标出“女将”。 转向时他们会提前看弯,并肩缠斗时会互相转头对视挑衅;双手全程握把,冲线也不举手—— 定格画面的情绪交给镜头和结算面板。

强敌完成一段漂亮的连漂后,艇尾会沿用玩家同源的蓝白短尾焰,随真实 BOOST 突发并收束; 漂移蓄力时不会持续冒特效,方便你一眼分清“正在蓄力”和“已经释放”。

艇尾两片主动翼面会跟随真实操作:水面漂移时大幅抬升,转向时左右差动;空中按住空刹后 张角更大,松手会带明显的阻尼回摆。近海的象牙白灯塔是固定视觉地标;当前明亮日间环境下 灯室不发射扫光,不参与赛道、碰撞或路线判定。

背景音乐在第一次明确操作后启动并贯穿本局;3 · 2 · 1 使用递减灯光和短促电子音, GO 使用更高一档的非语音起步信号。环境水声目前只保留经过审核的短事件,未审核的 持续噪声不会自行加入。碰撞、落水和触觉反馈会合并同帧事件,不抢断右手漂移手感。

选手、荣誉、单人 / 双打成绩、双打互动统计、最快时间、资料片浏览记录和驾驶提示偏好都保存在本机浏览器中。资料片画廊 是概念预览,不代表七个资料片已经可玩;当前页面按需加载图片,失败时会显示重试状态。 手机打开截图预览时会先收起游戏按钮;预览页提供明确的“回到游戏”按钮,随时可以退出截图页。 桌面和手机都只在按下 GO 时首次请求沉浸全屏,选手切换不会提前弹出浏览器提示;Chrome 的原生 “如何退出全屏”提示属于浏览器界面,网页不能把它关掉,所以开场展示会给它留出缓冲。PC 如果全屏被 系统或用户退出,比赛右上角会出现“恢复全屏”,也可以关闭本局提示;手机则在下一次真实游戏触控时重试。 系统分享若退出全屏,关闭或返回游戏时会立即尝试恢复。

开发参与

项目使用 TypeScript 编写游戏逻辑,Vite 启动开发环境并把源码整理成网页,Three.js 负责把船、海面和光影组织成实时 3D 画面,Playwright 则让真实浏览器自动跑完关键验收。 Node.js 只是这些开发、构建和验收工具的运行环境,不是玩家必须安装的游戏引擎。

发布时,Vite 会把开发代码整理成浏览器能直接运行的 JavaScript;Chrome、Safari 等浏览器 各自用内置的 JavaScript 引擎把这些代码跑起来,玩家不需要安装 Node.js 或绑定某一种引擎, 再通过浏览器自带的 3D 绘图能力 WebGL 把画面交给显卡。

它没有套用完整的游戏引擎:船感、海面、赛道与飞行规则都由这些小系统一层层组织, 你看到的效果,来自它们在浏览器里彼此咬合。

npm run build
npm run verify:smoke
npm run verify:team
npm run verify:collision
npm run verify:audio

verify:smoke 会在真实浏览器中检查桌面与 844x390 横屏手机能启动、画面非空,以及 关键 HUD 不重复、不溢出、不遮挡。verify:team 现在是单人 / 双打验收:检查模式目录、左右入座、 大立绘、六艇(两名玩家加四名 AI)、键盘和双手柄输入隔离、同一根摇杆的斜向前进、淘汰后的幸存者接管、 支援 / 浪花互动、荣誉结算和非空画面。碰撞和音频只在相关改动时运行对应的 verify:collisionverify:audio。旧工位协作 harness 已随封存分支移出主线。常用 代码位置如下:

  • src/game/:船体、赛道、飞行、AI、记录。
  • src/core/:键盘、手柄、手机输入、触觉和固定步进。
  • src/hud/:选角、HUD、驾驶提示、Final 和资料片画廊。
  • src/audio/:BGM、事件音效、混音和音频解锁。
  • harness/:确定性浏览器验收。

每个任务开始都完整阅读 AGENTS.mddocs/llmwiki.mddocs/development-handoff.md。改了物理、生命周期、音频 或记录,就运行对应专项 harness;像素改动则保存桌面和横屏手机截图供人工复核。

资产与许可

角色立绘、BGM 和资料片概念图是项目所有者提供的素材。来源、处理方式和替换注意事项 分别记录在 src/assets/**/LICENSES.md;替换素材前请保留同一套语义文件名并更新对应说明。

About

Cel-shaded arcade boat racing - Vite + Three.js

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages