资讯详情

REPENTOGON ColorParams 类完全指南:从构造参数到实体染色叠加的底层实现与实战用法

📅 2026/10/16 3:30:16 | 华诺云谱 👁 阅读
REPENTOGON ColorParams 类完全指南:从构造参数到实体染色叠加的底层实现与实战用法
游戏开发插件系统【免费下载链接】REPENTOGONScript extender for The Binding of Isaac: Repentance项目地址https://gitcode.com/gh_mirrors/re/REPENTOGON点击查看免费下载ColorParams 是 REPENTOGON《以撒的结合忏悔》脚本扩展器暴露给 Lua 模组的一套实体颜色叠加参数类用于向某个实体追加一组带优先级、带剩余存活帧数Lifespan的颜色修饰实现受击闪红、中毒变绿、冰冻泛蓝等随时间衰减的效果。本文以官方类文档 docs/docs/ColorParams.md 为骨架结合仓库中的 Lua 绑定源码 repentogon/LuaInterfaces/LuaColorParams.cpp、内存结构定义 libzhl/functions/ColorParams.zhl 与实体侧绑定 repentogon/LuaInterfaces/Entities/LuaEntity.cpp完整梳理该类的构造参数、全部 Get/Set 方法、Duration 与 Lifespan 的时间语义以及它与Entity:GetColorParams/Entity:SetColorParams之间的联动原理。读完本文你将能够独立构造、读写和排布多层实体染色参数并理解其衰减与淡出行为。一、ColorParams 是什么一条待应用的实体颜色叠加在 REPENTOGON 的 Lua 接口中实体渲染颜色并非一个单一值而是由一组ColorParams按优先级叠加而成。每一条 ColorParams 记录包含一个基础颜色Color底层为ColorMod一个优先级priority两个时间字段duration1Duration与duration2Lifespan两个布尔开关fadeout与shared。从仓库的结构定义看它本质上是游戏内存中一个 0x3C 字节的小结构体libzhl/functions/ColorParams.zhlstruct ColorParams depends (ColorMod) { {{ ColorParams() : _priority(255), _color(ColorMod()), _duration1(-1), _duration2(-1), _fadeout(false), _shared(false) {} }} int _priority : 0x0; ColorMod _color : 0x4; int _duration1 : 0x30, _duration2 : 0x34; bool _fadeout : 0x38, _shared : 0x39; } : 0x3C;由此可知其默认构造值为priority 255、颜色为默认ColorMod()、duration1 duration2 -1、fadeout false、shared false。该结构体直接依赖ColorMod见 libzhl/functions/ColorMod.zhl后者承载 tintR/G/B/A、offsetRO/GO/BO与 colorizeRC/GC/BC/AC三组数值对应 Lua 侧Color类的全部字段参考 docs/docs/Color.md。二、构造函数与五个参数逐个拆解官方文档给出的构造签名是local fiveSecondRedColor ColorParams(Color(1,0,0,1),255,150,false,false)即ColorParams(Color color, int priority, int duration1, int duration2, boolean fadeout, boolean shared)对应 Lua 绑定实现repentogon/LuaInterfaces/LuaColorParams.cppLUA_FUNCTION(Lua_ColorParamsConstructor) { ColorParams color; color._color *lua::GetLuabridgeUserdataColorMod*(L, 1, lua::Metatables::COLOR, Color); color._priority (int)luaL_checkinteger(L, 2); color._duration1 (int)luaL_checkinteger(L, 3); color._duration2 (int)luaL_checkinteger(L, 3); // 注意第三个参数同时赋给 duration1 与 duration2 color._fadeout lua::luaL_checkboolean(L, 4); color._shared lua::luaL_checkboolean(L, 5); ... }各参数含义与取值建议参数类型含义与注意点colorColor叠加的颜色本体。直接复用 Color 类除 R/G/B/A 外还可携带 Offset 与 Colorize 数值priorityint叠加优先级。数值越大优先级越高255是默认值也是实体染色共享判定中的特殊值见下文第四节duration1int总时长Duration单位是更新帧update frame。官方文档明确它不影响还剩多少帧只影响 fadeout 时的淡出速度duration2int剩余寿命Lifespan单位同样是更新帧每帧递减fadeoutboolean是否在寿命耗尽过程中按Lifespan / Duration比例渐隐sharedboolean是否允许该染色在实体间复制/共享状态复制机制中的判定条件之一一个容易忽略的实现细节构造函数的第三个参数duration1在 C 绑定中同时写入了_duration1与_duration2两个字段LuaColorParams.cpp第 9、10 行。也就是说用构造函数创建的对象其 Duration 与 Lifespan 初始值总是相等的文档示例中的150即总时长 150 帧、剩余寿命 150 帧。之后若要制造已衰减一段时间的效果需要通过SetLifespan单独调整。三、全部方法速查六组 Get/Set 成对接口ColorParams 的方法全部是成对的 Get/Set 访问器注册代码见 repentogon/LuaInterfaces/LuaColorParams.cpp。以下逐一说明完整覆盖官方文档列出的全部方法GetColor / SetColor — 颜色本体local c params:GetColor() -- 返回 Color params:SetColor(Color(1, 0, 0, 1))底层直接读写_colorColorMod字段GetColor通过lua::luabridge::UserdataValueColorMod::place构造一个 Lua 侧Coloruserdata 返回SetColor则从参数中取出ColorModuserdata 整体拷贝。注意Color的 AAlpha字段并非简单透明度——参考 docs/docs/ColorModifier.md 中的警告它同时充当强度乘数A 为 0 时 RGB 变更可能不生效。GetPriority / SetPriority — 叠加优先级local p params:GetPriority() -- int params:SetPriority(255)priority决定多层染色叠加时的先后权重默认 255。该字段还参与状态复制逻辑CopyStatusEffects只搬运priority 255 !fadeout shared的条目见第四节。GetDuration / SetDuration — 总时长local d params:GetDuration() -- int params:SetDuration(150)官方文档原文要点Duration 定义这些参数应当持续的更新帧数它不影响当前还剩多少帧但如果Fadeout开启它会参与淡出速度的计算淡出速度 Lifespan / Duration。设一个较大的 Duration 而 Lifespan 很小淡出会非常急促反之淡出平缓。GetLifespan / SetLifespan — 剩余寿命local l params:GetLifespan() -- int params:SetLifespan(60)官方文档原文要点Lifespan 定义距离过期还剩多少个更新帧在每次非插值non-interpolation更新中按每秒 30 次的速率递减 1。直接修改它会立刻改变这些参数还能存活多少帧。也就是说游戏以固定 30 Hz 的节奏推进寿命计数对应每秒 30 帧的更新频率修改 Lifespan 即可精确控制染色何时移除。构造函数将 Duration 与 Lifespan 置为相同初值后两者便各自独立演化Duration 保持总时长常量参与淡出计算Lifespan 逐帧逼近 0。GetFadeout / SetFadeout — 淡出开关local f params:GetFadeout() -- boolean params:SetFadeout(true)开启后染色强度随Lifespan / Duration的比例逐渐衰减直至完全消失关闭则保持满强度直到 Lifespan 归零被移除。GetShared / SetShared — 共享开关local s params:GetShared() -- boolean params:SetShared(true)该字段的意义主要在实体状态复制场景中体现见下文。四、与实体联动GetColorParams / SetColorParams 与状态复制ColorParams 单独存在没有渲染意义它必须以列表形式挂在实体上。REPENTOGON 为Entity类新增了两个接口见 docs/docs/Entity.md 与 docs/docs/Entity.mdEntity:GetColorParams()返回一个 table元素是实体当前_colorParams列表中各条目的拷贝不是引用Entity:SetColorParams(table)整体替换实体的染色列表传空 table 会清空所有染色。其实现位于 repentogon/LuaInterfaces/Entities/LuaEntity.cppGetColorParams遍历内存中的vector_ColorParams _colorParams实体偏移 0x1AC见 libzhl/functions/Entity.zhl逐条newuserdata并拷贝SetColorParams校验第二参数必须是 table按长度clear()或整体重建列表。更值得关注的是CopyStatusEffects中的共享判定逻辑repentogon/LuaInterfaces/Entities/LuaEntity.cppfor (ColorParams p : ent1-_colorParams) { // try to automatically determine what colors should be shared if (p._priority 255 !p._fadeout p._shared) { ent2-_colorParams.push_back(p); } }从源码结构可以推断当实体状态被复制例如生成子体、或玩家相关实体复制状态时只有同时满足priority 255、未开启fadeout、shared true三条条件的染色条目才会被带过去而被复制方残留的这类条目会被置_duration2 1让它快速走完而不错乱其他染色。因此若你希望某个颜色效果跟随实体复制传播应构造为ColorParams(color, 255, frames, frames, false, true)。五、区分三个易混淆的颜色相关类REPENTOGON 中围绕颜色存在多个类使用前务必分清作用域ColorParams本文主题作用于单个实体的多层叠加参数带优先级与寿命通过Entity:GetColorParams/Entity:SetColorParams读写ColorModifierdocs/docs/ColorModifier.md忏悔引入的房间级颜色校正参数对应fxlayers.xml中存储的值存放于FXParams.ColorModifier见 docs/docs/FXParams.md修改后需要调用Room:UpdateColorModifier才会应用与实体染色完全无关Colordocs/docs/Color.md纯数据容器构造参数Color(R, G, B, A, RO, GO, BO, RC, GC, BC, AC)全部可选还内置了大量常量如Color.TearChocolate、Color.LaserIpecac等ColorParams 的_color字段正是这个结构。简言之Color是颜色是什么ColorModifier是整个房间怎么调色而ColorParams是某个实体要不要额外上一层带时限的色。六、实战示例构造一次五秒红色受击染色结合上文所有语义写一个完整可运行的模组片段local function tintPlayerRed() local player Isaac.GetPlayer() -- 构造纯红、优先级 255、总时长与寿命均为 150 帧约 5 秒按每秒 30 次更新计 local params ColorParams(Color(1, 0, 0, 1), 255, 150, 150, true, false) -- 若希望更早结束可直接改写寿命 params:SetLifespan(60) -- 还剩 2 秒 params:SetFadeout(true) -- 按 Lifespan / Duration 淡出 -- 读取当前染色列表追加一条后整体写回 local list player:GetColorParams() list[#list 1] params player:SetColorParams(list) end要点回顾构造函数第三个参数会同时写入 Duration 与 Lifespan因此总时长在构造后就固定在_duration1后续只通过SetLifespan缩短剩余时间淡出速度 Lifespan / Duration想让染色快速退场把 Lifespan 调小即可需要跨实体复制的染色务必满足priority 255 fadeout false shared trueSetColorParams({})传空表可一键清空实体上的全部染色叠加。七、相关仓库资源导航类文档docs/docs/ColorParams.md、docs/docs/Color.md、docs/docs/ColorModifier.mdLua 绑定实现repentogon/LuaInterfaces/LuaColorParams.cpp内存结构定义libzhl/functions/ColorParams.zhl、libzhl/functions/ColorMod.zhl实体挂载与读写repentogon/LuaInterfaces/Entities/LuaEntity.cpp、libzhl/functions/Entity.zhl实体侧接口文档docs/docs/Entity.md赞分享游戏开发插件系统【免费下载链接】REPENTOGONScript extender for The Binding of Isaac: Repentance项目地址https://gitcode.com/gh_mirrors/re/REPENTOGON点击查看免费下载相关推荐REPENTOGON TitleMenu 全局类指南用 GetSprite() 获取标题画面 Sprite 的底层实现与实战用法REPENTOGON TitleMenu 全局类指南用 GetSprite 获取标题画面 Sprite 的底层实现与实战用法 导读 TitleMenu 是 R游戏开发插件系统react-admin 通知体系完全指南useNotify Hook 的用法、参数与底层实现react admin 通知体系完全指南useNotify Hook 的用法、参数与底层实现 导读 本文以 react admin 的 useNotify H前端UI组件spritejs 3D 球体元素 Sphere 完全指南从构造参数到渲染实战spritejs 3D 球体元素 Sphere 完全指南从构造参数到渲染实战 Sphere 是 spritejs 跨平台高性能图形系统中用于创建三维球体的核心图形学3D渲染上一篇基于 Fuels-ts 的 Fuel Connectors 深度指南构建自定义钱包连接器与使用 Connector Manager下一篇llama2.c平台适配不同操作系统下的编译问题解决创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑