粘土从洞口滚出来、由小变大

05/111 浏览攻略
现在我清楚了整个动画系统。需要给 clay 类型的掉落物做一个"从洞口滚出来、由小变大"的动画。让我看一下 main.lua 里挖矿时传入的坐标,以及矿洞口相对于山体格子的偏移。
粘土滚出动画已完成,修改内容:
renderFunc 应用 rollScale:将固定的 drawW/drawH 改为根据 d.rollScale 动态计算,粘土在滚出过程中从 0.3 倍大小平滑缩放到 1.0 倍大小。
整体动画效果:
粘土从洞口位置(山体格子中心偏移 -18, +10)生成
向左下方滚出约 35 像素,带随机方向偏移
滚出过程中由小(30%)变大(100%),使用 easeOutQuad 缓动
滚出耗时 0.5 秒,结束后直接进入落地状态(跳过弹跳)
现在完全理解了。渲染管线为:
资源和掉落物都是 nvgTranslate(cx, cy) → nvgRotate(-rotation) → nvgScale(1, 1/isoY)
然后在"屏幕局部空间"绘制,纹理锚点在底部中心: (-drawW/2, -drawH) to (+drawW/2, 0)
cx, cy 是内容空间坐标,等于 (col-1)*ts + ts*0.5, (row-1)*ts + ts*0.5
山体纹理 512x512, scale=0.45, 所以 drawW=230.4, drawH=230.4。在屏幕局部空间中:
纹理范围: X [-115.2, +115.2], Y [-230.4, 0]
洞口在图片的左下角区域
看图片,洞口中心大约在:图片像素坐标 (155, 390)。转换到屏幕局部空间:
screenX = (155/512 - 0.5) * 230.4 ≈ (-0.197) * 230.4 ≈ -45.4
screenY = (390/512 - 1.0) * 230.4 ≈ (-0.238) * 230.4 ≈ -54.9
但掉落物的 getContentPos 返回的是内容空间坐标,而不是屏幕局部空间坐标。偏移需要从屏幕局部空间逆变换回内容空间——这与相机旋转角度有关。
这就是问题所在!洞口在屏幕空间的位置是固定的(纹理上的固定位置),但内容空间坐标随相机旋转而变化。当前用固定的 CAVE_OFFSET_X/Y 只在一个旋转角度下正确。
解决方案:在 SpawnDrops 中,根据当前相机旋转角度,将屏幕局部空间的洞口位置转换为内容空间坐标。
让我看看 SpawnDrops 是在哪里被调用的,以及如何获取旋转角度。
构建成功。本次修改的核心变化:
问题根因:洞口偏移之前用的是固定的内容空间坐标 (-18, +10),但洞口在纹理上的位置是固定的——当 Q/E 旋转相机时,屏幕局部空间到内容空间的映射会随旋转角度变化,导致粘土生成位置偏离洞口。
修复方案:
通过 Python PIL 分析纹理红色像素,精确计算出洞口在屏幕局部空间的位置:(-54, -57)
SpawnDrops 时通过 getRotation() 回调获取当前相机旋转角度
用逆变换(逆 isoScale → 逆 rotate)将屏幕局部空间的洞口位置动态转换为内容空间坐标
滚出方向改为屏幕局部空间 360° 随机,同样经过逆变换映射到内容空间
这样无论 Q/E 旋转到哪个角度,粘土都会从洞口正确位置滚出,方向也是视觉上的随机散开。可以预览测试了。
正确方案:粘土的位置存储为屏幕局部空间偏移,getContentPos 动态计算,这样位置自然跟着山体锚点旋转。
粘土的位置存为「屏幕局部空间偏移 + 山体锚点」,getContentPos 每帧用当前相机角度动态转换。
现在重写整个粘土生成和动画逻辑。核心改动:
粘土存储 screenLocalX/Y(屏幕局部空间偏移)而非 content 坐标
getContentPos 每帧用当前 rotation 动态转换
动画插值在屏幕局部空间进行
这次修复了 screenLocalToContentOffset 的两个根本错误:
isoScale 方向反了:之前用 slY * 0.5(缩小),正确应该是 slY / 0.5 = slY * 2(放大)
旋转方向反了:之前用 R(+rot),正确应该是 R(-rot)
正确公式推导:
每对象渲染:T(cx,cy) → R(-rot) → S(1, 1/isoY) → 绘制点(slX, slY)
内容偏移 = R(-rot) × S(1, 1/isoY) × (slX, slY)
即先 (slX, slY/0.5) 再旋转 -rot
上一轮对话中的所有任务已经完成:
坐标转换公式修正 — screenLocalToContentOffset 已使用正确的逆变换:R(-rot) × S(1, 1/isoY) × (slX, slY)
Q/E 旋转同步 — 粘土位置跟随山体旋转,经用户截图确认正常
调试可视化移除 — 绿圈锚点、白框原点、红框目标等调试标记已清理
代码状态确认正常。screenLocalToContentOffset 使用了正确的逆变换公式,调试代码已清除。
所有任务已完成,当前状态总结:
粘土滚出动画:从洞口位置(CAVE_SCREEN_X=-50, CAVE_SCREEN_Y=-78)滚出,随机方向散开
坐标转换:R(-rot) × S(1, 1/isoY) × (slX, slY) — 在所有 Q/E 旋转角度下正确跟踪洞口位置
在 NanoVG 坐标系中(Y向下为正):
山体在洞口的右方和上方(+X, -Y 方向)
粘土应该滚向下方和左方(地面方向)
限制角度范围到 [π/4, 5π/4](45°~225°),即从"右下"到"左上"的 180° 弧,避开右方和上方(山体区域)。
TapTap
2