下载 App

首次砍树无掉落动画

05/103 浏览攻略
需要查看掉落动画代码。
现在理解了整个流程。让我确认 gameTime 的初始化问题 — SpawnDrops 用 self.gameTime 作为 spawnTime,但首次砍树时 gameTime 可能还是 0 或很小。
但更关键的问题在于:_SyncNPCEntries 中的 nvgCreateImage 是在 renderFunc 闭包内调用的(即在渲染时而非同步时)。首次渲染时创建纹理,该帧纹理句柄可能返回 0 或加载需要一帧延迟,导致第一帧走到 fallback 色块逻辑。
不过用户说的是"没有掉落动画",意思是没有看到从上到下的飘落效果,而是直接出现在地上。这说明动画本身的帧没有被渲染出来。
让我检查 _SyncNPCEntries 在 Update 中被调用的时序。关键在于 SpawnDrops 设置了 dirty = true,但 SpawnDrops 是在 HandleKeyDown 中调用的,而 Update 中的 dirty 检查在 Update 末尾。
问题可能是:HandleKeyDown 和 HandleUpdate 的执行顺序。让我看 main.lua 中 HandleUpdate 的 dropSystem_:Update(dt) 在什么位置。
好,dropSystem_ 在地图加载回调中创建,gameTime 初始化为 0。
现在让我更仔细地分析。用户说"第一次砍树没有掉落动画,1秒后木头直接出现在地上"。
关键在于 _SyncNPCEntries 的条件:drop.state ~= STATE_PICKED and drop.state ~= STATE_WAITING。第一个掉落物 delay=0,所以 state = STATE_FALLING,应该立即被加入 NPC 列表。
但问题可能是 nvgCreateImage 首次调用时返回的纹理句柄为 0(纹理还在加载中),导致掉落物走到 fallback 色块,但可能因为绘制参数问题根本看不到。让我仔细看 fallback 逻辑… fallback 用棕色色块,应该能看到。
等等,让我重新审视用户的描述:“1秒钟后地上出现木头”。FALL_DURATION 是多少?
纹理文件存在。问题大概率是 nvgCreateImage 首次调用时纹理没有立刻可用(异步加载),第一帧返回 0,导致走到 fallback 色块但用户看起来像是"没有东西"。等纹理加载完后已经过了 FALL_DURATION,掉落物直接处于 STATE_GROUND 了。
解决办法:在 DropSystem.New 初始化时预加载纹理,而不是在首次渲染时才加载。但 nvgCreateImage 需要 vg 上下文,初始化时可能还没有。
更好的方案:在 _SyncNPCEntries 函数里(不是在闭包里),就预加载纹理。这样每次同步时就确保纹理已经 loaded。
现在理解了根本原因。nvgCreateImage 在 renderFunc 闭包内首次调用时,纹理可能需要异步加载。加载完成前(约0.5-1秒),每帧都走到 fallback 色块(22x22像素,太小难以察觉),动画帧被"跳过"。第二次砍树时 texCache 已有句柄,渲染立即成功。
修复方案:在 DropSystem.New 中预加载纹理到引擎资源缓存,并初始化 _texCache。
问题 2 — 首次砍树无掉落动画:nvgCreateImage 在 renderFunc 闭包中首次调用时,纹理数据尚未加载到内存,导致整个掉落动画期间渲染空白。等纹理就绪时动画已结束,木头"突然出现"在地上。修复:在 DropSystem.New 中通过 cache:GetResource("Image", DROP_TEXTURE) 预加载纹理到引擎资源缓存,并初始化 _texCache,确保首次 nvgCreateImage 调用时数据立即可用。
可以预览测试了。
生成正面、背面、侧面,可以走动的角色形象截图
生成正面、背面、侧面,可以走动的角色形象
当前 NPC 角色编辑器的数据结构 编辑器使用 32×32 像素画布,数据结构大致是: 3 个朝向:正面、背面、侧面 2 个动画状态:静止(idle)、行走(walk) 每个状态可以有多帧,支持帧率控制 每帧本质上是一个 32×32 的颜色数组 要解决的 3 个问题 步骤 问题 方案 1. 图片→编辑器 128×128 PNG 导入为 32×32 像素数据 加载图片后逐像素采样(每4×4取1像素)
1 赞
9 回复
穿透层修复
经验一:CSS transform 穿透层修复模式 问题本质 当容器使用 CSS transform: translateX/Y/scale 平移/缩放子树时,即使父容器有 overflow = "hidden",引擎的命中检测可能不裁剪越界区域。如果 transform 后的子树有更高的 zIndex,它会在视觉范围外拦截其他兄弟节点的指针事件。 受影响的场景 地图编辑器(右键平移/滚轮缩放后)
官方
4 赞
地图编辑器仿真 tick 重建抑制
UI 重建频率 = 事件分发的可靠性上限。 只要有一帧 SetRoot 销毁了正在处理 pointer 事件的控件,跨重建边界的 Down/Up 对就会被吞。高频仿真 tick 必须在 UI 边界按页面过滤。 关键代码(scripts/main.lua HandleUpdate) 四步走:先原地处理人员 → 聚合所有仿真 changed → 地图页强制压制 → 只放行显式/登录态变化。 -- ma
官方
4 赞
【日常更新】支持2人、3人、4人对战截图
【日常更新】支持2人、3人、4人对战
优化了排行榜显示玩家昵称
3 赞
以鼠标为锚点缩放
核心数学原理 缩放前后,鼠标指向的那个世界坐标点必须保持在同一屏幕位置。 已知:旧缩放 oldZoom、新缩放 newZoom、鼠标锚点屏幕坐标 (ax, ay)、当前偏移 (panX, panY) 步骤1:算出旧缩放下鼠标指向的世界坐标 wx = (ax - panX) / oldZoom wy = (ay - panY) / oldZoom 步骤2:新缩放后反解新偏移,让 wx/wy
官方
1 赞
右键拖拽平移
一、问题本质 不是平移公式写错,而是 UrhoX UI 库指针事件派发的两个不对称陷阱叠加: 陷阱 现象 根因文件 OnPointerMove 不向父冒泡 右键按下 isPanning_=true,但 move 事件永远到不了 mapView urhox-libs/UI/Core/Widget.lua(OnPointerDown/Up 有 parent 冒泡,OnPointerMove 没有) H
官方
4 赞
编辑器实体 zIndex 层级
问题 编辑器中墙段被房间面板覆盖不可见。原因:给房间设 zIndex=1 会创建 stacking context,其内部带背景色/TiledImage 的 floorLayer 作为 paint layer 在合成时盖过了同层级 zIndex=2 的墙段——差距太小不够可靠。 解决:底层不设 zIndex,上层用明显间距 错误做法(zIndex 间距太小 + 给底层也设 zIndex): --
官方
1 赞
精灵平滑移动、墙碰撞体积
一、 渲染层用连续坐标(scripts/页面/校园地图.lua,三处统一): -- NPC 定位(第408-410行) local contLeft = (character.x or 0) * 5 - 18 - charLeft local contTop = (character.y or 0) * 5 - 36 - charTop -- 主角定位(第504-506行) local con
官方
1 赞
自动寻路赠送
核心功能 携带模式(点击物品跟鼠标)下: ≤8格:点击小人直接赠送(金色边框) >8格:点击远距离小人 → 自动寻路走向目标 → 到达8格内自动赠送 取消:玩家按方向键/WASD/摇杆手动移动 → 立即取消,恢复物品 关键经验(3条踩坑教训) 经验1:类型标识不是中文,是英文枚举值 地图编辑器放置的角色 type/job 字段是英文标识(teacher_3、doctor、cleaner_2、tea
官方
1 赞
碰撞方案
核心教训 1. 格子像素必须匹配精灵尺寸 5px格子+36px精灵=7.2:1比例,任何碰撞方案(AABB/空气墙/单点/格中心)都无法同时满足"不穿墙+四面间距一致+不跳格"。对齐环世界32px后,36px精灵≈1.1格,问题根本解决。 2. 连续渲染 + 格级碰撞的分层设计 渲染用连续坐标 x*S-18(平滑不跳),碰撞用格级检测(不穿墙),二者解耦。 3. 精灵大于格子时,单点检测必然不对称
官方
1 赞