拖到合成目标才留位
错误原因
我在上一轮加回收功能时,为了"修位置回正"加了 else 分支:当牌既没拖到回收区、也没合成目标时,强制把牌弹回原位。这破坏了 Stacklands 的基本交互——拖到空地就该留在那里。
lua-- ❌ 错误版本(多余的 else 导致拖到空地也弹回) if inRecycle and not card.locked then ...回收溶解... elseif self._mergeTarget then ...尝试合成,失败才回位... else card.x = self._drag.startX -- ← 这行导致空地也弹回! card.y = self._drag.startY end
改正后核心代码
lua-- ✅ 正确版本:拖到空地保留位置,只在回收/合成失败时处理位置 if self._drag and self._drag.dragging then local card = self._drag.card -- 1. 拖到回收区 → 溶解 local rx, ry, rw, rh = self:_GetRecycleRect() local inRecycle = card.x + CW*0.5 >= rx and card.x + CW*0.5 <= rx + rw and card.y + CH*0.5 >= ry and card.y + CH*0.5 <= ry + rh if inRecycle and not card.locked then card.x = rx + (rw - CW) * 0.5 card.y = ry + rh + 20 self._gm:DissolveCard(card.uid) self:_AddMessage("回收成功", nvgRGBA(255, 200, 100, 255)) -- 2. 拖到另一张牌上 → 尝试合成,失败才回位 elseif self._mergeTarget then local started = self._gm:TryMerge(card.uid, self._mergeTarget.uid) if not started then card.x = self._drag.startX -- 合成失败回位 card.y = self._drag.startY end end -- 3. else 分支删掉:拖到空地就留在 card.x/card.y(即鼠标释放位置),不做任何处理 self._drag = nil self._mergeTarget = nil end
关键改动:删除 else { 强制回原位 } 分支。NanoVG 渲染时 card.x/card.y 已经是鼠标释放位置,什么都不做就自然留在那里——这正是拖拽系统原本的行为,我之前的"修复"反而画蛇添足。

