diff --git a/docs/plans/mobile-touch-controls.md b/docs/plans/mobile-touch-controls.md new file mode 100644 index 0000000..612b6d4 --- /dev/null +++ b/docs/plans/mobile-touch-controls.md @@ -0,0 +1,229 @@ +# 手机端虚拟按键方案 + +> 目标:手机浏览器打开 https://foxpaw.top/q1k3/ 能直接玩 +> 方案:半透明悬浮按键,覆盖在游戏界面上 + +--- + +## 一、输入映射 + +游戏当前输入系统(`input.js`)是 `keys[]` 数组 + `mouse_x/mouse_y`,虚拟按键只需往同一个数组里写值: + +| 游戏操作 | 当前触发方式 | keys 索引 | 虚拟按键 | +|---------|-------------|----------|---------| +| 前进 | W / ↑ | keys[1] | 左区 ↑ | +| 后退 | S / ↓ | keys[3] | 左区 ↓ | +| 左移 | A / ← | keys[2] | 左区 ← | +| 右移 | D / → | keys[4] | 左区 → | +| 射击 | 鼠标左键 | keys[7] | 右下大按钮 | +| 跳跃 | 空格 / 鼠标右键 | keys[9] | 右下小按钮 | +| 切武器上 | E / 滚轮下 | keys[6] | 右区小按钮 | +| 切武器下 | Q / 滚轮上 | keys[5] | 右区小按钮 | +| 视角旋转 | 鼠标移动 | mouse_x/mouse_y | 右半屏拖拽 | + +--- + +## 二、界面布局 + +``` +┌──────────────────────────────────┐ +│ │ +│ 游戏画面 (Canvas) │ +│ │ +│ │ +│ ┌────┐ ┌─────────┐ │ +│ │ ↑ │ │ 视角 │ │ +│ │← ─→│ │ 拖拽 │ │ +│ │ ↓ │ │ 区域 │ │ +│ └────┘ └─────────┘ │ +│ │ +│ ┌────┐ ┌──────┐ ┌───────┐ │ +│ │攻击│ │ Q │ │ E │ │ +│ │ │ │上武器│ │下武器 │ │ +│ └────┘ └──────┘ └───────┘ │ +│ ┌─────────┐ │ +│ │ 跳跃 │ │ +│ └─────────┘ │ +└──────────────────────────────────┘ +``` + +### 分区说明 + +| 分区 | 覆盖区域 | 操作 | +|------|---------|------| +| **左区(运动)** | 屏幕左 30%,从底部到 55% 高度 | 四个方向按钮 + 中心空白 | +| **右区(视角)** | 屏幕右 70%,从顶部到底部 | 触摸拖拽控制视角 | +| **右下角(动作)** | 屏幕底部 15%,左侧攻击 | 攻击、武器切换、跳跃 | + +--- + +## 三、改动文件清单 + +### 3.1 `input.js` — 新增触摸处理 (~40 行) + +在文件末尾追加: + +```js +// ─── 移动端虚拟按键 ─── + +// 检测触摸设备 +let is_touch = 'ontouchstart' in window; + +// 仅在触摸设备上创建虚拟按键 +if (is_touch) { + // 创建控制层 + let ctrl = document.createElement('div'); + ctrl.id = 'ctrl'; + ctrl.innerHTML = + '
'+ 'code: phoboslab.org / music: no-fate.net'+ - '
'; \ No newline at end of file + ''; diff --git a/source/input.js b/source/input.js index eb2ad52..248f2e6 100755 --- a/source/input.js +++ b/source/input.js @@ -81,3 +81,72 @@ c.onmouseup = (ev) => { keys[key_action + ev.button] = 0; }; +// ─── Mobile virtual controls ─── + +if (is_touch) { + let ctrl = document.createElement('div'); + ctrl.id = 'ctrl'; + ctrl.innerHTML = + '