下面全部内容在游戏里按 H 也能看到。想直接开飞的话,点右上角的
飞行模拟器 就行。
| 按键 | 作用 |
|---|---|
W / ↑ S / ↓ | 抬头 / 压机头(拉杆、推杆) |
A / ← D / → | 左倾 / 右倾(压坡度转弯) |
Q E | 方向舵左 / 右(修正侧滑) |
Shift / Z Ctrl / X | 加油门 / 收油门 |
空格 | 开火。机炮会过热,过热后需要冷却才能继续射击 |
Tab(按住) | 瞄准辅助:机头自动拉向最近的敌机,松开即恢复手动 |
V | 切换视角:驾驶舱(第一人称)→ 第三人称 → 环绕 |
`(反引号) | 切换纯字符视图 / 真 3D 视图 |
按 V 循环切换,右上角按钮也能点:
| 视角 | 说明 |
|---|---|
| 驾驶舱 | 第一人称,相机贴在机头,最沉浸 |
| 第三人称 | 默认。相机在飞机后上方,能看见自己的机身与姿态 |
| 环绕 | 相机绕着飞机慢慢转,用来欣赏自己的飞行姿态 |
按 C 切换到鼠标模式,点击画面锁定指针:移动鼠标等于推杆,左键开火。
再按 Esc 解除锁定。默认是键盘模式,右上角的状态条会显示当前处于
KEY 还是 MOUSE。
F | 全屏 / 退出全屏 |
H | 打开 / 关闭说明面板 |
R | 阵亡后复活 |
C | 切换键鼠模式 |
V | 切换视角(驾驶舱 / 第三人称 / 环绕) |
1~5 | 直接切画质档位 |
右上角控制条里可以随时切换画质档位。画质就是屏幕上字符的个数: 一共五档:约 96 / 148 / 210 / 300 / 420 列,最高一档屏幕上超过十万个字符。选「自动」会按帧率 在档位之间实时升降,卡了自动降、流畅了自动升。
触屏设备会自动切到触屏布局:左下角是虚拟摇杆(推杆 = 俯仰,左右 = 压坡度),
右下角四个按钮是 FIRE 开火、AIM 瞄准辅助、THR+ / THR- 油门。
顶部按钮默认收成一个 M,点一下才展开画质、视图这些选项,免得小屏被按钮塞满。
想在电脑上预览手机布局,加 ?mobile=1 即可。
ONLINE 带延迟 / SOLO 单机)、房间号、玩家与机器人数量、当前画质与帧率、已摧毁建筑数。OVERHEAT。@ 是自己,O 是城市,红色是敌方飞机,绿色是友方。R)会在最近的战场空域重新起飞,
出生速度已经配平,直接推油门就能打。飞行模拟器默认自动接入联机。房间号决定战场:同一房间号的所有玩家共享同一片地形、同一批建筑破坏状态,
并且各自带一组 AI 机器人。网址后面加 ?room=房间名 就能换房间,例如
/fly.html?room=nightwatch。房间号只能用小写字母、数字、下划线和短横线。
连不上服务器时会自动降级为单机模式,玩法完全一样,只是场上只有你和 AI 机器人。
顶栏会从 ONLINE 变成 SOLO。
整个画面是一次 WebGL2 实例化绘制:每个字符是一个实例,顶点着色器把实例序号换算成屏幕格子,
再输出背景四边形与字形四边形;字形图集只有 alpha 通道参与计算,颜色来自每个实例的前景 / 背景属性。
因此六万多个字符和一百个字符一样,都只是一次 drawArraysInstanced。
地形求交用的是「逐列轮廓推进」:同一列的每一行共享同一条水平射线,所以整个世界沿该方向 只需要推进一次地面高度轮廓,每一行取它第一次落到地形之下的位置。复杂度从 O(格数×步数) 降到 O(列数×步数 + 格数),这是能在几万字符下跑满帧的关键。
建筑、飞机、子弹、爆炸都是盒体 / 精灵,走同一套 z-buffer 深度测试,谁近谁盖住谁。
世界由种子确定性生成:房间名哈希成 seed,地形、城市选址、每栋楼的位置与高度全部由这个 seed 推出, 两端逐字节一致 —— 所以联机时服务器只需要广播实体位置、子弹和破坏状态,带宽极小。
整站跑在 Cloudflare 边缘的一个 Worker 里:静态页面与脚本以内联资源的形式由同一个 Worker 返回, 联机房间是 Durable Object(SQLite 后端,免费版可用),20Hz 权威模拟并向房间内广播状态。 没有使用任何对象存储。