大于 800×600 的视口档位中,面板和控制栏的点击 / 悬停坐标没加栏位偏移,栏内格子和按钮点偏 #542
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
现象
在大于 800×600 的视口档位里(main 上是 1024×768;本地分支
feat/viewport-formula-resolutions新增的 1068×600、1280×720 也一样),左右栏和底部控制栏画的位置是对的,点击拦截也对(点在栏上不会让角色走路),但栏内格子和按钮的命中位置偏了:点了没反应,或者点中旁边的格子 / 按钮。鼠标悬停的高亮和 tooltip 也偏。800×600 不受影响。舞台按档位比例撑满时(
marginW = 0)的偏移:代码现状(main
33b1b0a,src/client/ui/hud-manager.ts)绘制和拦截用的是正确的偏移:
render()1865–1870:左栏translate(deltaLeft, panelOffsetY)(1900、1926),右栏translate(deltaRight, panelOffsetY)(1955、1973,1024×768 下deltaRight = 224),控制栏translate(barOffsetX, barOffsetY)(1989)。isPointInterceptedByHud()的宽屏分支(1132–1153)也按barOffsetX/Y、panelOffsetY和右栏的实际位置判断。三条鼠标输入路径只用了
±marginW:没减panelOffsetY和barOffsetX/Y,右栏也没减rightDockX − 400。handleMouseMove()627–654(程序化点击handleClick()656–667 走第 3 条):控制栏组件 631–634 直接用原始坐标;右栏 639–645 用deltaRight = marginW;左栏 652 用deltaLeft = -marginW。window的mousemove1291–1346:同上(1295–1299、1305–1320);悬停物品 tooltip 回写坐标(1310–1337)也只加了±marginW,y 没加。handleHudMouseDown()1367 起:腰带、红蓝球、热键、控制栏 1449–1483 用原始坐标;左右栏 1485–1542 用±marginW,y 都没减panelOffsetY。belt.ts、globes.ts、hotkeys.ts、control-bar.ts、inventory.ts、skill-tree-panel.ts、world-panels.ts、character-sheet.ts都按原生 800×600 坐标做命中测试,不知道视口档位,所以只能在HudManager里换算。期望修复
HudManager里加一组"逻辑坐标 → 区域本地坐标"的换算,和render()用同一组 docking 量:(x − leftDockX, y − panelOffsetY)(x − (rightDockX − 400), y − panelOffsetY)(x − barOffsetX, y − barOffsetY)-marginW、+marginW、0,行为不变。render()不一致。验证
HudManager(可参考tests/client/viewport-formula-profiles.test.ts里的createHudAt),在画面上的实际位置点击:跑 / 走切换、小面板按钮、腰带格、物品栏格子、人物加点、仓库格子、技能树,断言对应动作触发;悬停断言 tooltip 位置和绘制位置一致。play.html切到 1024×768、1068×600、1280×720,实际点一遍并截图存档。相关
feat/viewport-formula-resolutions(748f6ba,待合入 main):按公式生成视口档位(barOffsetX = (W − 800) / 2、barOffsetY = H − 600、panelOffsetY = (H − 600) / 2),新增 1068×600、1280×720。只改了绘制和点击拦截,没动输入路径,所以同样有本问题。handleHudMouseDown()的腰带 / 左栏点击附近目前还有未提交的改动,修复前先等它合入 main,再在其基础上改,避免冲突。