
MaxScript 中叛逆 spinner 的困境 🎚️💡
¡Vaya lío de luces y spinners te has montado! 你的灯光和 spinner 搞得一团糟!看起来你的控件在玩“最后进来的赢”。我们来像优秀代码侦探一样解决这个 spinner 身份问题。
概念问题
发生的情况是:
- 所有你的 handler 都指向同一个变量 nomobj
- 在循环结束时,nomobj 只包含最后一个灯光
- Handler “记住”的是引用,而不是值
“没有上下文的 handler 就像没有布线的开关:点击了但不会点亮任何有用的东西”
技术解决方案
你需要创建 闭包 来捕获正确的上下文。试试这个方法:
for i = 1 to mat_sel.count do (
local currentLight = mat_sel[i] -- Captura la luz actual
local spinnerName = ("spin_" + (i as string)) as name
local lightName = (currentLight.name + ": ") as string
-- Crea el spinner con el valor actual
samp.addControl #spinner spinnerName lightName paramStr type:#integer range:[0,100, currentLight.subdivisiones] fieldWidth:40 align:#center
-- Handler con closure que captura la luz correcta
on spinnerName changed val do (
currentLight.subdivisiones = val
)
)
关键解释
- 捕获上下文,在每次迭代中使用局部变量
- 使用闭包,让 handler “记住”要修改哪个灯光
- 避免使用全局引用,因为它们会被覆盖
如果这个不起作用(有时 MaxScript 的 handler 系统很特殊),另一个选项是:
- 创建一个全局灯光引用数组
- 为每个 spinner 分配一个唯一索引
- 在 handler 中,使用该索引访问数组
记住:在 MaxScript 中,就像生活中一样,上下文就是一切。让你的 spinner 照亮正确的道路!💡 如果一切失败,你总是可以像电影里那样:“更多灯光!”(尽管渲染会花费永恒的时间)。