《以撒的结合:忏悔》Lua模组求助:角色尺寸修改失效问题
问题排查:《以撒的结合:忏悔》模组角色尺寸修改失效问题
问题描述
我是模组开发新手,正在为《The Binding of Isaac Repentance》开发模组,Lua语言对我来说较为陌生。该模组的设计目标是提升角色伤害与尺寸、降低移动速度,目前伤害和速度的修改功能运行正常,但角色尺寸提升功能未生效。
另外,本模组的教程内容感谢YouTube用户catinsurance。
原始代码
local mod = RegisterMod("More food!", 1) local clownBurger = Isaac.GetItemIdByName("Clown's Burger!") local clownBurgerDamage = 3 local clownBurgerSpeed = 0.5 local clownBurgerSize = 100 --tried with 2 at first but nothing really changed function mod:EvaluateCacheDmg(player, cacheFlags) if cacheFlags & CacheFlag.CACHE_DAMAGE == CacheFlag.CACHE_DAMAGE then local itemCount = player:GetCollectibleNum(clownBurger) local damageToAdd = clownBurgerDamage * itemCount player.Damage = player.Damage + damageToAdd end end mod:AddCallback(ModCallbacks.MC_EVALUATE_CACHE, mod.EvaluateCacheDmg) function mod:EvaluateCacheSpd(player, cacheFlags) if cacheFlags & CacheFlag.CACHE_SPEED == CacheFlag.CACHE_SPEED then local itemCount = player:GetCollectibleNum(clownBurger) local speedToDecrease = clownBurgerSpeed * itemCount player.MoveSpeed = player.MoveSpeed - speedToDecrease end end mod:AddCallback(ModCallbacks.MC_EVALUATE_CACHE, mod.EvaluateCacheSpd) function mod:EvaluateCacheSize(player, cacheFlags) if cacheFlags & CacheFlag.CACHE_SIZE == CacheFlag.CACHE_SIZE then local itemCount = player:GetCollectibleNum(clownBurger) local sizeToAdd = clownBurgerSize * itemCount player.Size = player.Size + sizeToAdd end end mod:AddCallback(ModCallbacks.MC_EVALUATE_CACHE, mod.EvaluateCacheSize)
问题原因与修复方案
核心问题
在《以撒的结合:忏悔》API中,角色尺寸的修改逻辑和伤害、速度存在本质差异:
player.Size是缩放系数(默认值为1.0),而非绝对值。你设置的100会触发游戏的数值上限限制,直接导致修改被忽略;即使设为2,也会因为叠加逻辑错误无法正常生效。- 原代码使用
GetCollectibleNum(clownBurger)无法计算道具的叠加效果(比如通过道具复制、卡牌获得的额外层数),必须加上第二个参数true才能统计所有生效的道具数量。
修复后的代码
local mod = RegisterMod("More food!", 1) local clownBurger = Isaac.GetItemIdByName("Clown's Burger!") local clownBurgerDamage = 3 local clownBurgerSpeed = 0.5 local clownBurgerSizeMultiplier = 0.2 -- 每次获得道具,尺寸提升20%(默认1.0,叠加后为1.2、1.4...) -- 合并所有缓存回调,简化逻辑 function mod:EvaluateCache(player, cacheFlags) local itemCount = player:GetCollectibleNum(clownBurger, true) -- 第二个参数true统计所有叠加的道具 if itemCount <= 0 then return end -- 处理伤害提升 if cacheFlags & CacheFlag.CACHE_DAMAGE == CacheFlag.CACHE_DAMAGE then player.Damage = player.Damage + clownBurgerDamage * itemCount end -- 处理移动速度降低,防止数值为负 if cacheFlags & CacheFlag.CACHE_SPEED == CacheFlag.CACHE_SPEED then player.MoveSpeed = player.MoveSpeed - clownBurgerSpeed * itemCount player.MoveSpeed = math.max(player.MoveSpeed, 0.1) -- 限制最低速度为0.1 end -- 处理尺寸缩放,基于默认值叠加增量 if cacheFlags & CacheFlag.CACHE_SIZE == CacheFlag.CACHE_SIZE then player.Size = 1.0 + clownBurgerSizeMultiplier * itemCount player.Size = math.min(player.Size, 3.0) -- 限制最大尺寸为3倍默认值 end end mod:AddCallback(ModCallbacks.MC_EVALUATE_CACHE, mod.EvaluateCache)
关键修改点说明
- 将尺寸修改从绝对值改为百分比增量,
0.2代表每次获得道具提升20%尺寸,数值更合理,不会触发游戏的异常限制。 - 使用
player:GetCollectibleNum(clownBurger, true)确保统计所有生效的道具层数,包括复制道具、卡牌等带来的叠加效果。 - 合并三个独立的缓存回调为一个,减少冗余代码,逻辑更清晰。
- 增加速度和尺寸的数值限制,避免出现负速度或过大尺寸导致的游戏异常。
额外测试提示
- 测试时可以临时将
clownBurgerSizeMultiplier改为0.5(每次提升50%),更容易直观看到尺寸变化效果。 - 若需要同步调整角色碰撞箱大小(而非仅视觉尺寸),游戏会自动基于
player.Size调整基础碰撞箱;如果需要自定义碰撞箱,可以额外修改player.HitboxWidth和player.HitboxHeight参数。
内容的提问来源于stack exchange,提问作者Alex_Vargas
相关产品推荐
相关产品推荐

