[Parity][ui/cursor] 游戏画面内同时显示系统三角鼠标与游戏手指光标(双重光标重合),未按 1.13c D2gfx #10029 隐藏系统硬件光标 #718
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?
问题描述
在
play.html游戏画面内(包括前置主菜单、Battle.net 登录、选人/建角、大厅界面,以及进入游戏后的世界场景),鼠标位置同时显示两个重合的光标:cursor: auto / default);protate.dc6/ohand.dc6/orotate.dc6/buysell.dc6)。需要严格对齐原版 1.13c 行为:在游戏画面(
#play-stage客户区)内隐藏系统三角光标,只保留游戏手指光标(或手持物品/买卖修鉴图标)。原版 Diablo II v1.13c 实现机制(二进制反汇编核查)
在原版 v1.13c 中,游戏客户区全流程只显示软件绘制的 DC6 手指光标,通过
D2gfx.dll、D2Win.dll与D2Client.dll三层协同隐藏 Windows 系统硬件光标:1.
D2gfx.dll:窗口创建与系统光标显隐控制(0x6fa88070、0x6fa880a0、0x6fa88290 [#10029]、0x6fa885a0 [#10072])0x6fa90cf8(gbCursorVisible,初值为1)。WINDOW_HideCursor(0x6fa880a0):WINDOW_ShowCursor(0x6fa88070):当
gbCursorVisible == 0时,循环调用ShowCursor(TRUE)直至内部计数>= 0(0x6fa88080..0x6fa88086),并将0x6fa90cf8置回1。WINDOW_Create@0x6fa885a0/#10072):CreateWindowExA(0x6fa887e8)、ShowWindow、UpdateWindow、SetFocus执行完毕后,在0x6fa8883b立即调用call 0x6fa880a0(WINDOW_HideCursor)隐藏系统箭头光标。D2GFX_ShowCursor(BOOL bHide)(0x6fa88290/ Ordinal#10029):窗口模式下(
[0x6fa9125c] != 0),若参数bHide != 0则调用0x6fa880a0隐藏系统光标;若bHide == 0则调用0x6fa88070显示系统光标。2.
D2Win.dll:前置菜单与战网大厅界面的光标控制(0x6f8f7800、0x6f8f7020)D2WIN_OnMouseMove(0x6f8f7800): 每次鼠标在菜单/大厅客户区内移动时,强制确保系统光标处于隐藏状态(push 1),仅在帧末由D2Win软件渲染手指光标。D2WIN_OnNcMouseMove(0x6f8f7020):仅当鼠标移出客户区(如窗口标题栏,
[esi+0x8] == 2)时,执行push 0; call 0x6f8e77e6恢复系统光标。3.
D2Client.dll:游戏内世界与 HUD 的光标控制(0x6fac63d0、0x6fac60a0)D2CLIENT_OnMouseMove(0x6fac63d0):更新
gnMouseX(0x6fbcb828)与gnMouseY(0x6fbcb824)后,在0x6fac6454执行: 随后更新空闲计时器0x6fbcb860 = GetTickCount()并驱动0x6fba8558光标状态机,在画面最上层仅绘制游戏内手指光标或手持物品。D2CLIENT_OnNcMouseMove(0x6fac60a0):仅在鼠标移出客户区(
[esi+0x8] == 2)时调用push 0; call 0x6fabd1c2恢复系统光标。当前
diablo2-web根因分析游戏内世界区域(
#view+#d2-hud-canvas)穿透导致cursor: none失效:src/client/ui/hud-manager.ts:798-800仅在this.hudCanvas(#d2-hud-canvas)上设置了this.hudCanvas.style.cursor = "none"。play.html:264及src/client/ui/hud-manager.ts:2545-2554中,当鼠标位于游戏世界场景(未悬停在底栏/面板上,且未持物、未处于买卖/鉴定模式)时,this.hudCanvas.style.pointerEvents被动态设为"none":pointer-events: none的元素不参与鼠标命中测试,其cursor: none样式也会被浏览器完全忽略;命中测试直接穿透到底层的#view(WebGL2 世界画布,play.html:246-255)和#play-stage(play.html:214-224)。#view与#play-stage均未设置cursor: none,浏览器直接回退为默认系统三角光标,与#d2-hud-canvas上renderCursor()绘制的游戏手指光标重叠。前置主菜单与战网大厅(
#bnet-shell+#bnet-canvas)完全未隐藏系统光标:src/client/frontend/frontend-renderer.ts:1645每帧在#bnet-canvas上绘制游戏手指光标(this.cursor.render(ctx, this.cursorAtlas, nowMs))。FrontendRenderer构造函数(src/client/frontend/frontend-renderer.ts:322-330)与play.html:226-244(#bnet-shell、#bnet-canvas)均未设置cursor: none,导致整个前置菜单、登录、选人、建角及大厅界面全程显示系统三角光标与游戏手指双重光标。修复方向与验收标准
play.html中为#play-stage及其子元素(#bnet-shell、#bnet-canvas、#view、#d2-hud-canvas等)设置cursor: none。src/client/frontend/frontend-renderer.ts构造函数中对this.canvas.style设置cursor = "none"。src/client/main.ts初始化时对stageEl、bnetShell、bnetCanvas、viewCanvas、hudCanvas显式确保cursor: none,不受hudCanvas.style.pointerEvents在"auto"与"none"之间切换的影响。#d2-toolbar-container与右侧抓包面板#d2-inspector-container)保持系统光标:#play-stage进入网页工具栏或抓包器时正常显示系统光标,严格对应原版窗口模式WM_NCMOUSEMOVE的客户区/非客户区边界行为。#play-stage内只显示游戏自身的 DC6 手指/物品光标,绝不出现系统三角鼠标光标。