
O dilema do spinner rebelde em MaxScript 🎚️💡
Que bagunça de luzes e spinners você armou! Parece que seus controles estão jogando no "o último que entra ganha". Vamos resolver esse problema de identidade dos spinners como bons detetives do código.
O problema conceitual
O que acontece é que:
- Todos os seus handlers apontam para a mesma variável nomobj
- No final do loop, nomobj contém apenas a última luz
- Os handlers "lembram" a referência, não o valor
"Um handler sem contexto é como um interruptor sem fiação: faz clique mas não acende nada útil"
Solução técnica
Você precisa criar closures para capturar o contexto correto. Experimente esta abordagem:
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
)
)
Explicação chave
- Captura o contexto com uma variável local em cada iteração
- Usa closures para que o handler "lembre" qual luz modificar
- Evita referências globais que são sobrescritas
Se isso não funcionar (às vezes o sistema de handlers do MaxScript é especial), outra opção é:
- Criar um array global de referências às luzes
- Atribuir a cada spinner um índice único
- No handler, usar esse índice para acessar o array
Lembre-se: em MaxScript, como na vida, o contexto é tudo. Que seus spinners iluminem o caminho correto! 💡 E se tudo falhar, você sempre pode fazer como nos filmes: "Mais luzes!" (embora depois o render demore uma eternidade).