只有茄子的像素图,其他的食材看不到
昨天 08:09综合
找到根因了。
BeatSystem.InjectFoods 第 624-635 行,当食物有多个食材时,会拆分成独立食材分别进入 foodPool:
splitData.ingredientKeys = { ingKey } -- ← 只保留单个 key
每个拆分出的食材单独生成一个敌人,每个敌人的 ingredientKeys 只有 1 个元素。ComposeDishSprite 进入单食材路径(居中满铺),所以每个敌人只显示自己那一种食材的像素图。
3 个食材投喂后,关卡中会生成 3 个独立敌人,每个各显示一种食材——但你只看到了茄子,说明另外两个食材的像素图渲染出来看起来和茄子的形状太相似,或者其他两个敌人从另一方向进入/被挡住了,并不是合成失败。
现在的问题是:这个「拆分」行为是设计意图,还是 bug?
从游戏体验来看,"炒小白菜土豆番茄"应该作为一道菜整体进入口腔,而不是拆散成 3 个独立食材。目前的拆分逻辑破坏了合成精灵的展示效果。
你有两个选项:
方案 A(推荐):保留菜品整体性,1 道菜 → 1 个敌人,显示三角合成精灵
lua
复制
-- 直接整体入池,不拆分
table.insert(foodPool, {
typeName = typeName,
foodData = item,
portions = PORTIONS_PER_INGREDIENT,
})
方案 B:拆分为独立食材,但每个食材显示自己的像素(当前行为),只是多食材菜"散伙了"
找到了根本原因:Map.GenerateDefaultMap() 中定义了3个出生点(spawnRows = {5, 10, 15}),而 BeatSystem 在 influx 阶段随机选取 spawns[math.random(1, #spawns )],导致拆分的食材敌人从不同方向进入。
现在看看 BeatSystem.lua 中的 influx spawn 逻辑,然后制定修复方案
现在看看 BeatSystem.lua 中的 influx spawn 逻辑,然后制定修复方案
现在清楚问题所在了。修复方案:在 influx 阶段固定使用第一个出生点(即唯一入口),而不是随机选取。
同时,考虑到用户设计意图(食物从嘴进来,只有一个入口),应该让所有 influx 食材都从同一个入口生成。最优做法是固定用 spawns[1],而不是随机。
buildSpawnQueue 也在循环遍历所有出生点(spawnIdx = (spawnIdx % #spawns ) + 1)。但更根本的问题是 Map.GenerateDefaultMap() 本身就创建了 3 个出生点(row 5, 10, 15),与"只有一个入口"的设计相矛盾。
需要修复两处:
Map.GenerateDefaultMap 改为单一入口(左侧中央)
buildSpawnQueue 也固定用第一个出生点
Bot Avatar
现在 buildSpawnQueue 也要固定使用第一个出生点(虽然现在 default map 只有 1 个,但保险起见也要一致):
Bot Avatar
现在构建验证:
Bot Avatar
构建成功。修复总结:
问题根因:Map.GenerateDefaultMap() 定义了 3 个出生点(row 5, 10, 15),而 BeatSystem 在 influx 阶段随机选取,导致拆分的食材敌人从 3 个不同位置进入地图。
修复内容(2处):
Map.lua(GenerateDefaultMap):将 3 个出生点改为单一入口(地图左侧中央),符合"食物从嘴进入、只有一个通道"的设计。
BeatSystem.lua(buildSpawnQueue + influx 阶段):
buildSpawnQueue:移除循环轮换 spawn 点的逻辑(spawnIdx 轮转),改为固定用 spawns[1]
influx 阶段:将 spawns[math.random(1, #spawns )] 改为 spawns[1]
现在所有食材(无论是拆分的还是单个的)都会从同一个入口进入,与"一个入口一个出口"的设计一致。
需要修复两处:
Map.GenerateDefaultMap 改为单一入口(左侧中央)
buildSpawnQueue 也固定用第一个出生点
Bot Avatar
现在 buildSpawnQueue 也要固定使用第一个出生点(虽然现在 default map 只有 1 个,但保险起见也要一致):
Bot Avatar
现在构建验证:
Bot Avatar
构建成功。修复总结:
问题根因:Map.GenerateDefaultMap() 定义了 3 个出生点(row 5, 10, 15),而 BeatSystem 在 influx 阶段随机选取,导致拆分的食材敌人从 3 个不同位置进入地图。
修复内容(2处):
Map.lua(GenerateDefaultMap):将 3 个出生点改为单一入口(地图左侧中央),符合"食物从嘴进入、只有一个通道"的设计。
BeatSystem.lua(buildSpawnQueue + influx 阶段):
buildSpawnQueue:移除循环轮换 spawn 点的逻辑(spawnIdx 轮转),改为固定用 spawns[1]
influx 阶段:将 spawns[math.random(1, #spawns )] 改为 spawns[1]
现在所有食材(无论是拆分的还是单个的)都会从同一个入口进入,与"一个入口一个出口"的设计一致。
根因确认:第 627 行 for k, v in pairs(item) do splitData[k] = v end 把 bindNpcName(绑定的是小白菜的 NPC 图)复制给了茄子和土豆的拆分条目,导致三者都用同一张 NPC 图。
修复:拆分时清除 bindNpcName,让每个子食材走 ComposeDishSprite 路径显示自己的像素图
问题根因:BeatSystem.InjectFoods 拆分多食材菜品时,用 for k, v in pairs(item) do splitData[k] = v end 把母菜的所有字段都复制过去,包括 bindNpcName(绑定了小白菜的 NPC 图)。茄子和土豆的拆分条目也继承了这个字段,所以三者都显示同一张 NPC 图。
修复:拆分后显式置 splitData.bindNpcName = nil,让每个子食材走 ComposeDishSprite 路径,各自显示对应食材的像素图(小白菜 → 小白菜图、茄子 → 茄子图、土豆 → 土豆图)。



