
El sistema se basa en dos funciones principales que se escriben en la casilla variable: maxloop() para el bucle principal y replay() para repetir conjuntos de bucles. Dichas variables se llaman desde la casilla loop en la interfaz.
loop y variableEn la ventana de configuración de efectos (la que aparece al presionar "Modify"), verás dos casillas para controlar los bucles: loop y variable. Es vital entender la diferencia para sacar el máximo provecho del sistema.
loop es un atajo fácil para usar la función maxloop(). Es perfecta para crear rejillas o secuencias simples.variable te da el control total. Aquí puedes escribir maxloop(), replay() y cualquier otra variable o código Lua que necesites.loop?Lo que escribes en la casilla loop se convierte directamente en los argumentos para maxloop(v, h, d).
Si en loop escribes: 10
maxloop(10, 1, 1)j irá de 1 a 10 (maxj será 10). fx.loop_v será 10.Si en loop escribes: 4, 5
maxloop(4, 5, 1)j irá de 1 a 20 (maxj será 20). fx.loop_v será 4 y fx.loop_h será 5.Si en loop escribes: 2, 3, 4
maxloop(2, 3, 4)j irá de 1 a 24 (maxj será 24). fx.loop_v será 2, fx.loop_h será 3, y fx.loop_3 será 4.variable?Cuando necesitas usar replay(), definir variables personalizadas, o tener un control más granular, debes escribir el código completo en la casilla variable. Lo que escribas aquí tiene prioridad sobre lo que haya en la casilla loop.
;). Esta es la única regla que necesitas recordar. Se aplica para separar replay() de maxloop(), maxloop() de una variable, o dos variables entre sí.variable:Combinando replay y maxloop:
replay(3); maxloop(10);
; que separa las dos funciones. Esta es la sintaxis estándar para separar cualquier instrucción en la casilla variable.maxloop de 10 iteraciones se repetirá 3 veces. Tendrás acceso a las variables j, maxj, J y maxJ.Definiendo una variable personalizada:
maxloop(20); mi_variable = 50 * ratio; mi_color = color.random()
; separa cada instrucción. maxloop(20) se separa de la definición de mi_variable, y esta a su vez se separa de mi_color.j irá de 1 a 20. Además, tendrás las variables mi_variable y mi_color disponibles en las otras casillas para usarlas en tus cálculos.Combinando todo:
replay(4); maxloop(5); delay_particula = 30; velocidad = 1.5
J (1-4), j (1-5 en cada repetición), y las variables personalizadas delay_particula y velocidad.maxloop( v, h, d )Descripción: Es la función fundamental para crear bucles. Genera un número determinado de líneas de diálogo (que se convierten en los objetos del efecto), y proporciona variables para controlar las propiedades de cada una de ellas.
Argumentos:
v (número, opcional): El número de iteraciones verticales del bucle. Por defecto es 1.h (número, opcional): El número de iteraciones horizontales del bucle. Por defecto es 1.d (número, opcional): El número de iteraciones en una tercera dimensión (profundidad). Por defecto es 1.Variables que Crea: Al usar maxloop, estas variables quedan disponibles en todas las demás casillas del efecto:
j: El contador principal de la iteración. Su valor va desde 1 hasta maxj. Esta es la variable más importante y la que más usarás.maxj: El número total de iteraciones. Se calcula como v * h * d.fx.loop_v: Almacena el valor que se le dio a v.fx.loop_h: Almacena el valor que se le dio a h.fx.loop_3: Almacena el valor que se le dio a d.Ejemplo de Uso Básico (Línea de objetos):
-- En la casilla "variable":
maxloop(10)
-- En la casilla "pos_x":
-- Coloca 10 objetos en una línea horizontal, cada uno separado por 50 píxeles.
l.left + (j - 1) * 50
Ejemplo Avanzado (Rejilla de 4x5):
Para crear una rejilla (grid), se combinan fx.loop_v y fx.loop_h con operaciones matemáticas. El operador módulo (%) nos da la columna, mientras que la división entera (math.floor) nos da la fila.
-- En la casilla "variable":
maxloop(4, 5) -- 4 filas, 5 columnas
-- En la casilla "pos_x":
-- (j-1) % 5 dará como resultado 0,1,2,3,4, 0,1,2,3,4...
l.left + ((j - 1) % fx.loop_h) * (l.width / fx.loop_h)
-- En la casilla "pos_y":
-- math.floor((j-1)/5) dará como resultado 0,0,0,0,0, 1,1,1,1,1...
l.top + math.floor((j - 1) / fx.loop_h) * (l.height / fx.loop_h)
replay( n )Descripción: Es un bucle "externo" que ejecuta el maxloop completo un número n de veces. Es ideal para crear capas de efectos o "tandas" de partículas. El contador j del maxloop se reinicia en cada repetición de replay.
Argumentos:
n (número): El número de veces que se repetirá el maxloop.Variables que Crea:
J: El contador del bucle de repetición. Su valor va desde 1 hasta maxJ.maxJ: El número total de repeticiones, que es igual a n.Ejemplo de Uso (Ondas de partículas):
Imagina que quieres que 3 "ondas" de 5 partículas cada una aparezcan secuencialmente.
-- En la casilla "variable":
replay(3); maxloop(5)
-- En la casilla "start_t":
-- J controla el tiempo de inicio de cada ONDA.
-- j controla el retardo de cada partícula DENTRO de la onda.
l.start_time + (J - 1) * 500 + (j - 1) * 40
-- En la casilla "pos_x":
-- j controla la posición de cada partícula.
l.left + (j - 1) * 100
-- En la casilla "pos_y":
-- J controla la altura de cada onda de partículas.
l.top + (J - 1) * 50
Esto creará 15 líneas en total. Las primeras 5 aparecerán a los 0ms, 40ms, 80ms... en la altura l.top. Las siguientes 5 aparecerán a los 500ms, 540ms... en la altura l.top + 50, y así sucesivamente.
La verdadera potencia del sistema de bucles se libera al combinarlo con las funciones de tiempo del capítulo anterior. Las funciones time_loop1 y time_loop2 están diseñadas específicamente para esto.
time_loop1 con maxloopDescripción: Genera patrones de tiempo para objetos creados en un bucle simple (maxloop). Depende de las variables j y maxj para calcular los retardos.
Argumentos:
Mode (string): El patrón de tiempo a usar. Acepta "li" (lineal de inicio a fin), "lo" (lineal de fin a inicio), "mid1" (extremos hacia el centro), "mid2" (centro hacia los extremos).Delay (number, opcional): Milisegundos de retardo entre cada iteración. Por defecto es 30.Ejemplo de Uso (Patrón Secuencial Simple):
Crearemos una fila de 10 partículas que aparecen una tras otra.
-- En la casilla "variable":
maxloop(10)
-- En la casilla "start_t":
-- time_loop1() calcula automáticamente el retardo para cada partícula.
l.start_time + time_loop1("li", 50)
-- En la casilla "end_t":
l.start_time + time_loop1("li", 50) + 400 -- Cada partícula dura 400ms.
-- En la casilla "pos_x":
l.left + (j-1) * (l.width/9)
En este caso, time_loop1("li", 50) genera un retardo que aumenta en 50ms para cada valor de j. El resultado es que las 10 partículas aparecen en secuencia de izquierda a derecha.
time_loop2 con replayDescripción: Idéntica a la anterior, pero diseñada para bucles anidados o secundarios (replay). Depende de las variables J y maxJ.
Argumentos:
Mode (string): El patrón de tiempo a usar. Acepta "li", "lo", "mid1", "mid2".Delay (number, opcional): Milisegundos de retardo entre cada iteración. Por defecto es 30.replay, se puede usar time_loop2("li", 500) para que cada "tanda" de efectos (controlada por J) aparezca 500ms después de la anterior.Ejemplo de Uso (Capas de efectos secuenciales):
Crearemos 3 capas de partículas. Cada capa (J) aparece después de la anterior. Dentro de cada capa, las partículas (j) aparecen desde el centro hacia los extremos.
-- En la casilla "variable":
replay(3); maxloop(10)
-- En la casilla "start_t":
-- J controla el tiempo de inicio de cada CAPA.
-- j controla el tiempo de cada partícula DENTRO de la capa.
l.start_time + time_loop2("li", 500) - time_loop1("mid2", 30) -- Retardo de 500ms entre cada capa (J) y patrón "abrir cortinas" para las partículas (j)
-- En la casilla "end_t":
l.start_time + time_loop2("li", 500) - time_loop1("mid2", 30) + 400
-- En las casillas pos_x y pos_y (para completar el efecto):
-- pos_x:
l.left + (j-1)*(l.width/9)
-- pos_y:
l.top + (J-1)*50