Files
metin2-client/docs/MOBILE-TOUCH-OPTIMIZATION.md
T

110 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 原生移动端触控优化
2026-09-30 首批优化,适用于 SDL3 / Vulkan 客户端。移动端 UI 由 PORT 模块提供,资源中的 40250 Python 脚本不改写。
## 已实现
- 六个快捷键围绕攻击键形成单层弧线;自动狩猎放在弧线外侧。按钮、间距和摇杆随 UI 尺寸一起调整。
- 保留真实物品 / 技能图标和数量,增加技能冷却秒数、未学习遮罩和激活技能绿环。状态来自 CPythonPlayer;技能可否释放仍由原有逻辑判断,不把这些展示状态当作完整施法条件。
- 根据 SDL 窗口显示倍率与实际像素高度,把 48dp 换算为 UI 坐标下的触摸目标。战斗按钮直径和物品操作行使用这一目标;现有背包格子与其他原版窗口尚未整体重排。
- 单击背包/装备显示原物品说明,双击调用原使用/穿戴/卸下方法;不再弹出移动端操作面板。
- 拖动调用原有物品移动和快捷槽绑定流程;拖到 NPC 商店背景或货架先显示出售确认。双击和拖放核对页码、物品编号、数量、背包可见性与确认状态,失效手势取消;长按继续沿用原右键使用行为。
- 修复每帧重排导致浮动摇杆起点回到默认位置;同一按钮和 UI 手势保留原手指所有权,避免另一根手指覆盖。
实现入口:`src/host/touch_controller.h`、`src/host/vk_frame.cpp`、`src/platform/ScriptLib/PythonBoot.cpp`、`MobileInventoryScript.inc`。
## 验证
```sh
cmake --build build/release --target mt_native_render -j8
cmake --build build/native --target port_login_flow_test -j8
MT_TEST_MOBILE=1 ctest --test-dir build/native -R '^port.login_flow$' --output-on-failure
ctest --test-dir build/native -R '^port.login_flow$' --output-on-failure
./android/build.sh --no-deploy
```
移动模式的离线登录测试额外覆盖摇杆跨帧保留起点、真实触点单击说明、双击穿脱、拖动换位、出售确认/取消与翻页失效。桌面模式继续覆盖既有登录、战斗、商店、仓库流程。
## 后续工作
- 可保存的按钮位置 / 大小、自定义固定 / 浮动摇杆和视角灵敏度。
- 目标切换、就近 NPC 交互与拾取入口。
- 背包格子及商店、任务窗口的完整手机布局、拖放目标高亮。
- Android 真机验证多指连续战斗、挖孔安全区、屏幕密度和长时间手持体验。构建通过及桌面截图不等于真机手感验收。
## 2026-10-14:参考 D2R Mobile 的单层技能弧
参考仓库 [d2r-mobile](https://github.com/jhaizhou-ops/d2r-mobile),检查版本 `685d3ddef8bf75768fd4c51228566f2e8d2a5182`。
参考入口是 `dm/ios/Sources/dm_touch_controls.c` 的 `dm_tc_layout_make`:主操作键旁的单层技能弧,以及移动区与战斗区分开。
本次采用布局思路,未引入其游戏资源或兼容层代码。
- 保留左下浮动摇杆、右下大攻击键,六个快捷槽全部在同一条弧线上,不拆成两层,也不将第五、第六槽移到底部。
- 六槽相对攻击键的距离相同,相邻角度相差 24 度。间距覆盖实际命中使用的 1.25 倍半径,避免相邻命中区域交叠。
- 整组上移,为原有生命、法力、经验和菜单底栏留出空间。自动狩猎在弧线左侧独立放置,保留点击切换与长按设置。
- 六槽编号、图标、数量、冷却、拖入绑定和原有使用逻辑保持对应。摇杆头与底盘同步缩放。
- `--mobile` 在 Mac 验收时同样隐藏原桌面快捷栏,与 Android 展示路径一致。桌面模式沿用原布局。
- 几何统一放在 `src/host/touch_layout.h`,渲染和触摸命中共用计算结果。
检查命令:
```sh
cmake --build build/native --target host_touch_layout_test port_login_flow_test -j8
ctest --test-dir build/native -R '^host.touch_layout$' --output-on-failure
MT_TEST_MOBILE=1 ctest --test-dir build/native -R '^port.login_flow$' --output-on-failure
ctest --test-dir build/native -R '^port.login_flow$' --output-on-failure
JOBS=8 ./android/build.sh --no-deploy
```
几何检查覆盖 640×360、800×600、超宽横屏、放大触摸目标和平板,检查安全边界、单层顺序、最小触摸尺寸和命中间距。
Mac 移动模式离线场景渲染截图在 `build/touch-layout-validation/mobile.png`。Android 真机手持与多指手感仍需实测。
其他值得借鉴的设计及适配优先级见 [D2R-MOBILE-REFERENCE.md](D2R-MOBILE-REFERENCE.md)。
## 2026-10-14:按用户截图调整 HUD 分区
参考用户提供的横屏实机截图,在上一版单层技能弧上继续调整。实现仅在触摸模式安装的 PORT 模块 `src/platform/ScriptLib/MobileHUDScript.inc`,不修改原资源包里的 Python 文件。
- 左上:职业头像、角色名、等级、生命/法力数值及原版红、蓝、耐力三条;有效能量加成显示剩余分钟,状态图标放在下方。所有数值来自当前玩家数据,没有收到最大值时显示 `--`。
- 右上:角色、背包、好友、设置四个圆形入口;小地图向下留出菜单行。头像也可打开角色面板。
- 左侧:任务、帮助、聊天,沿用现有界面动作。矮屏或触摸目标放大时改为横排,避开摇杆。原来的小帮助图标不重复显示。
- 左下:浮动摇杆;右下:大攻击键及六技能单层弧;空槽保留编号,绑定后显示原图标和数量/冷却。
- 底部:第 7、8 个本地快捷槽,可绑定药水等物品。点击和拖入绑定与原快捷栏一致;没有额外生成物品或修改物品效果。
- 以深棕底和金铜色圆边统一菜单及战斗控件,聊天消息移到摇杆右侧。原桌面底栏在触摸模式隐藏,菜单通过原有回调打开。
- HUD 显隐接入原任务栏的 Show/Hide,离开游戏时恢复原方法并释放回调。HUD 容器本身不可命中,只有实际按钮接收点击,移动区域不会被整屏容器挡住。
验证文件在 `build/mobile-hud-validation/`:`mobile.png` 是 Mac 移动模式的离线场景截图,截图中的生命/法力使用测试钩子设置以展示条形效果,非真实服务器状态;`mobile-test.log` 与 `desktop-test.log` 为回归记录。
`host.touch_layout` 同时检查新增物品快捷槽与技能、攻击、自动狩猎的扩展命中范围不交叠。
Android 产物为 `android/app/build/outputs/apk/debug/app-debug.apk`,未自动安装到手机;真机多指和长期手持体验仍需实测。
### 经验球与原版状态栏样式恢复
用户要求四颗经验球留在左下、头像及红蓝耐力条沿用之前的样式。左上改为复用原 TaskBar 的 `Gauge_Board`:原边框、HP/SP 动画贴图、恢复覆盖层和黄色 ST 条整体重挂到移动 HUD,职业头像仍取原角色资源。状态变化调用原 `RefreshStatus` / `RefreshStamina` 更新,保留原计算逻辑。
`EXP_Gauge_Board` 与四个 `EXPGauge` 点整体移到左下角;继续使用原版按四分之一填充经验球的 `SetExperience`,旁边增加经验百分比,移除顶部新画的经验细条。隐藏/显示 HUD、屏幕尺寸变化和离开游戏的父节点恢复都覆盖这些组件。
最新预览 `build/mobile-hud-validation/mobile.png` 中的 850/1000 HP、420/600 SP、70/100 耐力和 62.50% 经验来自离线测试钩子,用于检查颜色、填充和位置。
后续微调:头像外圈缩为 34 个 UI 像素,与原版红蓝耐力三条的外框整体同高;裁掉旧状态底图左侧的大球装饰。移动 HUD 将聊天窗口查看和输入状态的背景色设为透明,保留消息文字、滚动和输入功能,离开游戏恢复原实例颜色。已检查离线渲染预览并重新构建 Android APK。
## 物品手势调整:单击说明、双击穿脱、拖放移动/出售
- `MobileInventoryScript.inc` 移除单击操作面板。单击只显示原 Tooltip,不把物品挂到指针;双击使用原 `UseItemSlot`,穿戴与卸下仍由原客户端校验并向服务端发请求。
- 双击核对第一次点选的窗口、页码、全局格子、物品编号、数量及时间。换页、换物品、出现确认窗口后不执行旧双击。
- 拖动仍先走原 `SelectItemSlot` 拿起,再交给原背包、装备或快捷槽的目标处理。NPC 商店背景/标题/货架均可作为出售落点;通过实际拾取到的窗口及祖先识别,遮挡在上面的其他窗口不会触发出售。
- 商店出售调用原背包 `__SellItem`,保留禁止出售检查、确认/取消和确认时物品身份复核;不直接绕过确认发出售包。私人商店不增加此入口。
- 开着背包/商店时,窗口绘制在战斗覆盖层前面,命中也优先窗口;HUD 菜单回到普通 UI 层,避免遮住装备格。
- 不修改服务端,也不绕过商店开启时不能卸装备等已有规则。长按仍使用原右键行为;拆分堆叠和一键整理未在此次增加。
客户端内的离线测试夹具增加装备穿/脱和物品换位回复,只在 `MT_TEST_MOBILE` 测试环境启用。回归覆盖单击无使用请求、双击穿戴/卸下的实际格子变化、拖动换位、换页取消、出售取消保留物品以及确认后物品/金币变化。运行日志:`build/mobile-hud-validation/gestures-test.log`。
## D2R 默认摇杆与技能外观(2026-10-14)
参照 d2r-mobile `dm/ios/Sources/DmTouchOverlay.m`(参考检出 `685d3ddef8bf75768fd4c51228566f2e8d2a5182`)的颜色、透明度和构图,用客户端绘图命令独立绘制,不引入参考项目的游戏贴图。
- 技能使用深色圆底、古铜外圈和暗色内圈;闲置底色 alpha 0.48、外圈 0.54,按住恢复至 0.92 / 1.0。
- 空技能槽显示小铜色加号;已绑定的 Metin2 图标保持清晰,占直径 64%,保留冷却、激活和数量提示。
- 浮动摇杆改为闲置淡圆环、带双圈和四角星的摇杆头;操作时增强透明度并显示朝向弧,移除十字刻度和蓝色连线。摇杆头半径为 23 × UI 缩放。
- 圆底使用不重叠扫描条绘制,避免原先矩形交叠形成十字暗块。保留原命中区域、浮动原点、移动计算和六技能单层弧线。
验证:`host.touch_layout` 与 `MT_TEST_MOBILE=1` 的 `port.login_flow` 均通过(57.16 秒),浮动原点测试改为检查实际底圈起点。macOS 渲染预览为 `build/mobile-hud-validation/d2r-style.png`;Android APK 构建成功,未安装到真机。日志为 `build/mobile-style-test.log`、`build/mobile-style-android-build.log`。