- 游戏开发
- 插件系统
【免费下载链接】REPENTOGON
Script extender for The Binding of Isaac: Repentance
导读
SuplexState是 REPENTOGON(《The Binding of Isaac: Repentance》的脚本扩展框架)为玩家角色新增的枚举类型,用于描述Suplex!(德式后抛摔)道具在使用过程中所处的完整状态机。本文以 SuplexState 枚举文档 为主体,结合仓库内的 Lua 枚举定义、C++ 底层枚举以及EntityPlayer的读写接口,讲解 5 个状态的语义、状态迁移逻辑,并给出可在 MOD 中直接使用的 Lua 实战示例。读完本文,你将掌握如何读取、设置并利用SuplexState实现自定义的 Suplex! 流程控制(如强制打断、追踪状态、重定向落点等)。
一、枚举全貌:5 个状态的完整定义
原文档给出的枚举值如下:
| Value | Enumerator | Comment |
|---|---|---|
| 0 | INACTIVE | — |
| 1 | DASHING | — |
| 2 | AIMING | — |
| 3 | ASCENDING | — |
| 4 | DESCENDING | — |
从命名上可以清晰看出,该枚举完整刻画了 Suplex! 道具从激活到完成落地的四段式动作流程:
INACTIVE(0):未处于 Suplex 流程中,是角色的"空闲"基准状态;DASHING(1):角色正朝目标敌人冲刺的阶段;AIMING(2):冲刺命中、将目标抓举至头顶后,玩家瞄准跳跃落点的阶段;ASCENDING(3):角色携目标跳起上升的阶段;DESCENDING(4):角色携目标向下砸落、对落点造成伤害的阶段,流程结束后回到INACTIVE。
背景补充:Suplex! 是《以撒的结合:忏悔》中的主动道具,其效果正是"冲撞敌人 → 将其抓举过头顶 → 跳起 → 猛砸落地"。
SuplexState枚举的 5 个值即对应这一套完整动作的每个阶段。
二、源码级印证:枚举的双端定义完全一致
该枚举在仓库中同时存在于Lua 侧与C++ 侧两处,且数值完全对应:
- Lua 侧(运行时给 MOD 使用):定义于 enums_ex.lua,是 REPENTOGON 在游戏启动时注入 Lua 环境的扩展枚举表:
SuplexState = { INACTIVE = 0, DASHING = 1, AIMING = 2, ASCENDING = 3, DESCENDING = 4, }- C++ 侧(底层引擎定义):定义于 Global.zhl,与 Lua 侧逐值对齐:
enum SuplexState { INACTIVE = 0, DASHING = 1, AIMING = 2, ASCENDING = 3, DESCENDING = 4 };从源码结构看,Lua 侧的枚举表正是 C++ 侧枚举的忠实镜像,两者共享同一套数值约定,因此 MOD 中写入的值(如SuplexState.ASCENDING)可以直接与底层状态字段对接,不存在转换开销或偏移误差。
三、配套字段与读写 API:围绕 SuplexState 的完整操作面
SuplexState并不是孤立存在的——REPENTOGON 为 Suplex! 流程配套提供了一组完整的字段与 Lua 接口,全部集中在玩家实体EntityPlayer上:
3.1 底层字段(C++ 结构)
在 EntityPlayer.zhl 中可以看到,玩家实体上保存了 4 个 Suplex 相关字段:
int _suplexState : 0x1f08; -- 当前 Suplex 状态(即 SuplexState 枚举值) int _suplexAimCountdown : 0x1f0c; -- 瞄准阶段的倒计时 Vector _suplexTargetPos : 0x1f10; -- 目标敌人位置(抓举目标) Vector _suplexLandPos : 0x1f18; -- 计划落地位置这印证了状态机不仅记录"当前处于哪个阶段",还携带了瞄准倒计时、目标坐标与落点坐标等配套数据,供后续阶段的计算使用。
3.2 Lua 读写接口(8 个函数)
在 LuaEntityPlayer.cpp 中实现了 4 组成对的 Get/Set 接口,注册在 函数注册表 中:
| Get 函数 | Set 函数 | 参数/返回值 |
|---|---|---|
GetSuplexState() | SetSuplexState(State) | 返回/设置[SuplexState](https://link.gitcode.com/i/5d47b94dd69c7c26500b7f32db718d06)枚举值 |
GetSuplexAimCountdown() | SetSuplexAimCountdown(Countdown) | 返回/设置整数倒计时帧数 |
GetSuplexTargetPosition() | SetSuplexTargetPosition(Position) | 返回/设置[Vector](https://link.gitcode.com/i/d89f4a8f55530055dd47900d468530f8)目标位置 |
GetSuplexLandPosition() | SetSuplexLandPosition(Position) | 返回/设置[Vector](https://link.gitcode.com/i/d89f4a8f55530055dd47900d468530f8)落点位置 |
接口的官方签名(含拷贝用签名)可在 EntityPlayer 文档 与 EntityPlayer 文档 - Set 区 中查到。其中SetSuplexState在实现上直接将传入的整数值写入底层字段player->_suplexState(见 LuaEntityPlayer.cpp),未做范围校验,因此写入合法枚举值至关重要。
关联信息:
GetHeldEntity()(EntityPlayer.md)可返回玩家当前抓举在头顶的实体(如可投掷红炸弹或 Suplex! 目标),与 Suplex 流程配套使用,可在DASHING/AIMING阶段确认抓举目标。
四、实战示例:状态驱动的 Suplex! 流程控制
下面给出可直接嵌入 MOD 的 Lua 代码,覆盖三种典型用法。
4.1 每帧跟踪玩家当前 Suplex 阶段
-- 在 MC_POST_PEFFECT_UPDATE 回调中调用 local player = Isaac.GetPlayer(0) local state = player:GetSuplexState() if state == SuplexState.INACTIVE then -- 空闲:角色不在 Suplex 流程中 elseif state == SuplexState.DASHING then -- 正在冲向目标 elseif state == SuplexState.AIMING then -- 已抓举目标,正在瞄准落点 elseif state == SuplexState.ASCENDING then -- 跳起上升中 elseif state == SuplexState.DESCENDING then -- 向下砸落中,即将落地 end4.2 强制打断 / 手动重置 Suplex 流程
-- 将状态直接复位为 INACTIVE,可立即中断当前 Suplex 动作 player:SetSuplexState(SuplexState.INACTIVE)4.3 重定向落点(配合 AIMING / ASCENDING 阶段)
if player:GetSuplexState() == SuplexState.AIMING then -- 读取当前目标位置与计划落点 local target = player:GetSuplexTargetPosition() local land = player:GetSuplexLandPosition() -- 修改落点,让角色砸向别处(如房间内的某个敌人) local newLand = target + Vector(0, 40) player:SetSuplexLandPosition(newLand) -- 同时可调整瞄准倒计时 player:SetSuplexAimCountdown(30) end4.4 注意事项
- 务必使用枚举常量而非魔法数字:虽然底层仅存储整数,但直接书写
0/1等数字会显著降低可读性,且在INACTIVE(0)以外的状态分支中极易出错。 - 写入需谨慎:
SetSuplexState不做边界校验(见上文实现),写入 0–4 之外的数值可能导致状态机行为异常或动画错乱。 - 状态是瞬态的:
DASHING、ASCENDING等阶段通常只持续数帧,若需"捕捉"某一状态(如观察DASHING是否发生),建议使用标志位在进入状态时记录。
五、扩展阅读
- 枚举定义与函数注册可参考 enums_ex.lua 与 LuaEntityPlayer.cpp;
- 底层字段结构见 EntityPlayer.zhl,C++ 枚举镜像见 Global.zhl;
- 该组 API 于 REPENTOGON 更新日志中与
Get/SetSuplexAimCountdown、Get/SetSuplexTargetPosition、Get/SetSuplexLandPosition一同被收录(见 changelog.txt),确认其为稳定提供的扩展接口; - 抓举实体检测请配合 GetHeldEntity 使用。
- 游戏开发
- 插件系统
【免费下载链接】REPENTOGON
Script extender for The Binding of Isaac: Repentance
相关推荐
REPENTOGON Lua API 解析:HistoryItem 类与《以撒的结合:忏悔》道具历史追踪系统
REPENTOGON Lua API 解析:HistoryItem 类与《以撒的结合:忏悔》道具历史追踪系统 HistoryItem 是 REPENTOGON
游戏开发插件系统REPENTOGON WaterClipFlag 枚举完全指南:掌控《以撒的结合:忏悔》水中渲染与倒影行为
REPENTOGON WaterClipFlag 枚举完全指南:掌控《以撒的结合:忏悔》水中渲染与倒影行为 WaterClipFlag 是 REPENTOGON
游戏开发插件系统REPENTOGON DebugFlag 枚举全解析:以位掩码控制《以撒的忏悔》调试开关
REPENTOGON DebugFlag 枚举全解析:以位掩码控制《以撒的忏悔》调试开关 DebugFlag 是 REPENTOGON 为《以撒的结合:忏悔》(
游戏开发插件系统
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考