feat(interaction): 点击地面物品图标或名称标签自动走近并捡入包裹 (Item Pickup & Pathfinding) #391

Closed
opened 2026-09-23 01:57:24 +00:00 by troytt · 0 comments
Owner

问题背景与现状

目前主场景的鼠标交互层仅处理了空地走动、怪物技能攻击和场景 NPC 交互,未实现地面战利品的拾取交互链。玩家点击地面上的物品图标或浮动名称标签时没有任何响应。


原版 Diablo II v1.13c 核心机制规范(Ground Truth)

1. 双重热区交互响应 (Dual Pickup Hit-Test)

  • 玩家可直接点击地面物品小图标触发拾取。
  • 在按住 Alt 弹出浮动名称标签时,点击文字标签同样触发拾取(完全对齐原版操作手感)。
  • 鼠标悬停在物品图标或标签上方时,鼠标指针呈现拾取高亮态,标签边框点亮。

2. 距离判断与自动走近寻路 (Approach & Range Check)

  • 近距判定:当角色与目标物品的世界距离小于等于拾取半径(1.5 ~ 2 格世界网格)时,直接执行拾取。
  • 远距寻路:若距离过远,角色自动以物品所在点为目标进行 A* 寻路走向该物品,到达范围后自动停步并结算拾取。

3. 拾取结算与包裹装填逻辑

  • 金币拾取:
    • 金币不占背包网格,直接累加至角色随身金币存量。
    • 若角色金币达到携带上限(level * 10000),仅吸收上限差额,剩余金币留在地上。
    • 播放原版金币拾取音效(gold.wav)。
  • 装备道具拾取:
    • 遍历玩家背包(10x4 网格),依据物品尺寸(invWidth * invHeight)寻找第一个可完整放置的连续空位(canPlace)。
    • 若有空间:将物品填入背包,移除地面实体,并播放对应物品类别的拾取音效。
    • 若无空间:阻止拾取,交由包裹已满流程处理。

改造与验收标准

  1. 点击地面物品图标或其 Alt 浮动标签,角色能准确寻路走近至可拾取距离。
  2. 金币正确入袋累加且不占用背包格子,装备道具按原版网格逻辑自动摆入背包可用空位。
  3. 成功拾取后地面实体立即销毁,并播放原版清脆的拾取音效。
  4. 自动化构建与单测(npm run typecheck, npm test)100% 通过。
## 问题背景与现状 目前主场景的鼠标交互层仅处理了空地走动、怪物技能攻击和场景 NPC 交互,未实现地面战利品的拾取交互链。玩家点击地面上的物品图标或浮动名称标签时没有任何响应。 --- ## 原版 Diablo II v1.13c 核心机制规范(Ground Truth) ### 1. 双重热区交互响应 (Dual Pickup Hit-Test) - 玩家可直接点击地面物品小图标触发拾取。 - 在按住 Alt 弹出浮动名称标签时,点击文字标签同样触发拾取(完全对齐原版操作手感)。 - 鼠标悬停在物品图标或标签上方时,鼠标指针呈现拾取高亮态,标签边框点亮。 ### 2. 距离判断与自动走近寻路 (Approach & Range Check) - **近距判定**:当角色与目标物品的世界距离小于等于拾取半径(1.5 ~ 2 格世界网格)时,直接执行拾取。 - **远距寻路**:若距离过远,角色自动以物品所在点为目标进行 A* 寻路走向该物品,到达范围后自动停步并结算拾取。 ### 3. 拾取结算与包裹装填逻辑 - **金币拾取**: - 金币不占背包网格,直接累加至角色随身金币存量。 - 若角色金币达到携带上限(`level * 10000`),仅吸收上限差额,剩余金币留在地上。 - 播放原版金币拾取音效(`gold.wav`)。 - **装备道具拾取**: - 遍历玩家背包(10x4 网格),依据物品尺寸(`invWidth * invHeight`)寻找第一个可完整放置的连续空位(`canPlace`)。 - 若有空间:将物品填入背包,移除地面实体,并播放对应物品类别的拾取音效。 - 若无空间:阻止拾取,交由包裹已满流程处理。 --- ## 改造与验收标准 1. 点击地面物品图标或其 Alt 浮动标签,角色能准确寻路走近至可拾取距离。 2. 金币正确入袋累加且不占用背包格子,装备道具按原版网格逻辑自动摆入背包可用空位。 3. 成功拾取后地面实体立即销毁,并播放原版清脆的拾取音效。 4. 自动化构建与单测(npm run typecheck, npm test)100% 通过。
troytt added this to the 复刻捡起/丢弃物品 milestone 2026-09-23 01:57:24 +00:00
Sign in to join this conversation.
No Label
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: troytt/diablo2-web#391
No description provided.