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

10 KiB
Raw Blame History

原生移动端触控优化

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。

验证

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,检查版本 685d3ddef8bf75768fd4c51228566f2e8d2a5182。 参考入口是 dm/ios/Sources/dm_touch_controls.c 的 dm_tc_layout_make:主操作键旁的单层技能弧,以及移动区与战斗区分开。 本次采用布局思路,未引入其游戏资源或兼容层代码。

  • 保留左下浮动摇杆、右下大攻击键,六个快捷槽全部在同一条弧线上,不拆成两层,也不将第五、第六槽移到底部。
  • 六槽相对攻击键的距离相同,相邻角度相差 24 度。间距覆盖实际命中使用的 1.25 倍半径,避免相邻命中区域交叠。
  • 整组上移,为原有生命、法力、经验和菜单底栏留出空间。自动狩猎在弧线左侧独立放置,保留点击切换与长按设置。
  • 六槽编号、图标、数量、冷却、拖入绑定和原有使用逻辑保持对应。摇杆头与底盘同步缩放。
  • --mobile 在 Mac 验收时同样隐藏原桌面快捷栏,与 Android 展示路径一致。桌面模式沿用原布局。
  • 几何统一放在 src/host/touch_layout.h,渲染和触摸命中共用计算结果。

检查命令:

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。

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。