
Le dilemme du spinner rebelle en MaxScript 🎚️💡
Quel sacré bazar de lumières et de spinners tu t'es monté ! On dirait que tes contrôles jouent à « le dernier arrivé gagne ». Allons résoudre ce problème d'identité des spinners comme de bons détectives du code.
Le problème conceptuel
Ce qui se passe, c'est que :
- Tous tes handlers pointent vers la même variable nomobj
- À la fin de la boucle, nomobj ne contient que la dernière lumière
- Les handlers « se souviennent » de la référence, pas de la valeur
« Un handler sans contexte est comme un interrupteur sans câblage : il clique mais n'allume rien d'utile »
Solution technique
Tu dois créer des closures pour capturer le contexte correct. Essaie cette approche :
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
)
)
Explication clé
- Capture le contexte avec une variable locale à chaque itération
- Utilise des closures pour que le handler « se souvienne » de quelle lumière modifier
- Évite les références globales qui se écrasent
Si cela ne fonctionne pas (parfois le système de handlers de MaxScript est spécial), une autre option est :
- Créer un tableau global de références aux lumières
- Assigner à chaque spinner un indice unique
- Dans le handler, utiliser cet indice pour accéder au tableau
Souviens-toi : en MaxScript, comme dans la vie, le contexte est tout. Que tes spinners illuminent le bon chemin ! 💡 Et si tout échoue, tu peux toujours faire comme dans les films : « Plus de lumières ! » (même si ensuite le rendu prend une éternité).