本文发布于 1431 天前。
关于lua中的and语句,请参考Aegisub特效随机:Lua中的And和Or
AutoTags 原始函数代码
function AutoTags(Intervalo,Dato1,Dato2) --Intervalo为时间间隔,Dato1/2为变化的内容
local RESULTADO="" --初始化 RESULTADO为输出结果
local SUERTE = 0 --初始化局部输出存储器
local CONTADOR = 0 --初始化计数器
local ARREGLO = 0 --初始化表,用于存储前后变换的两个标签
local count = math.ceil(line.duration/Intervalo) --总的变换次数
ARREGLO = {Dato1,Dato2} --把两个变换的状态写入ARREGLO表,方便奇偶调用
for i = 1, count do --核心循环
CONTADOR = i --重复计数器数值
if Dato1 and Dato2 then --拒绝Data1和Data2为空时的无效变换?
if CONTADOR%2 ==0 then --从默认变成Data1,再变成Data2
SUERTE = ARREGLO[1] --将标签写入临时的输出
else
SUERTE = ARREGLO[2]
end
end
RESULTADO = RESULTADO .."\\t(" ..(i-1)*Intervalo.. "," ..i*Intervalo.. ",\\" ..SUERTE..")".."" --从0开始输出并叠加变换
end
return RESULTADO --返回最终结果
end
AutoTags 无换行代码
可以直接复制进Aegisub
function AutoTags(Intervalo,Dato1,Dato2) local RESULTADO="" local SUERTE = 0 local CONTADOR = 0 local ARREGLO = 0 local count = math.ceil(line.duration/Intervalo) ARREGLO = {Dato1,Dato2} for i = 1, count do CONTADOR = i if Dato1 and Dato2 then if CONTADOR%2 ==0 then SUERTE = ARREGLO[1] else SUERTE = ARREGLO[2] end end RESULTADO = RESULTADO .."\\t(" ..(i-1)*Intervalo.. "," ..i*Intervalo.. ",\\" ..SUERTE..")".."" end return RESULTADO end
函数使用说明
Comment: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,code once,function AutoTags(Intervalo,Dato1,Dato2) local RESULTADO="" local SUERTE = 0 local CONTADOR = 0 local ARREGLO = 0 local count = math.ceil(line.duration/Intervalo) ARREGLO = {Dato1,Dato2} for i = 1, count do CONTADOR = i if Dato1 and Dato2 then if CONTADOR%2 ==0 then SUERTE = ARREGLO[1] else SUERTE = ARREGLO[2] end end RESULTADO = RESULTADO .."\\t(" ..(i-1)*Intervalo.. "," ..i*Intervalo.. ",\\" ..SUERTE..")".."" end return RESULTADO end
Comment: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,template line,{!AutoTags(100,'fs50','fs20')!}
Comment: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,karaoke,test
如上,在使用函数时,传入值的Dato1和Dato2应当为字符串,固用' '
框起来。
函数返回值无{}
,固应当在template行中写类似{AutoTags(Timeinterval,'fs50','fs20'}
因为是写在代码当中,所以如果要有多个变化同时发生,需要用\来写后续的特效标签。例如{AutoTags(Timeinterval,'fs50\\frz90','fs20\\frz0'}
[1]
变种[2]
AutoTags1 (with pause):停顿
可以让每个变换之间有时间间隔/停顿。
function AutoTags1(Intervalo,Dato1,Dato2,Pause) local RESULTADO="" local SUERTE = 0 local CONTADOR = 0 local ARREGLO = 0 local count = math.ceil(line.duration/(Intervalo+Pause)) ARREGLO = {Dato1,Dato2} for i = 1, count do CONTADOR = i if Dato1 and Dato2 then if CONTADOR%2 ==0 then SUERTE = ARREGLO[1] else SUERTE = ARREGLO[2] end end RESULTADO = RESULTADO .."\\t(" ..(i-1)*(Intervalo+Pause).. "," ..i*Intervalo+Pause*(i-1).. ",\\" ..SUERTE..")".."" end return RESULTADO end
AutoTags2 (with Delay):延迟
可以让变换有不同的开始时间。可以配合$si
等使用。
function AutoTags2(Intervalo,Dato1,Dato2,Delay) local RESULTADO="" local SUERTE = 0 local CONTADOR = 0 local ARREGLO = Layer local count = math.ceil(line.duration/Intervalo) ARREGLO = {Dato1,Dato2} for i = 1, count do CONTADOR = i if Dato1 and Dato2 then if CONTADOR%2 ==0 then SUERTE = ARREGLO[1] else SUERTE = ARREGLO[2] end end RESULTADO = RESULTADO .."\\t(" ..(i-1)*Intervalo+Delay.. "," ..i*Intervalo+Delay.. ",\\" ..SUERTE.. ")".."" end return RESULTADO end
AutoTags3 (Different Intervals):不同的时间间隔过渡
AutoTags3(第一次变化用时,最终变化用时,”标签1″,”标签2″)
即,每个\t变换的时间,会从Interval1逐渐过渡到Interval2
function AutoTags3(Intervalo1,Intervalo2,Dato1,Dato2) local RESULTADO="" local SUERTE = 0 local CONTADOR = 0 local ARREGLO = 0 local count = 2*math.ceil(line.duration/(Intervalo1+Intervalo2)) local d=math.ceil((Intervalo2-Intervalo1)/count) local t={} ARREGLO = {Dato1,Dato2} for i = 1, count do CONTADOR = i t[1]=0 t[i+1]=t[i]+Intervalo1+(i-1)*d if Dato1 and Dato2 then if CONTADOR%2 ==0 then SUERTE = ARREGLO[1] else SUERTE = ARREGLO[2] end end RESULTADO = RESULTADO .."\\t(" ..t[i].. "," ..t[i+1].. ",\\" ..SUERTE..")".."" end return RESULTADO end
自用流水灯效果函数:colorTag
在制作「派对浪客诸葛孔明」的OP特效时,遇到了需要彩色流水灯效果的需求。
因为AutoTags(好像)不支持多个状态循环的变化,于是重写了一个用于生成循环变色效果的代码。
colors = {"&H003202C7", "&H0015CCD7", "&H0092321E", "&H0004C026", "&H0096C121",
"&H009C8CCC", "&H00AB4EB8"
}
colorNum = 7 -- 总的颜色数,即colors表的元素数
function colorTag(sylNum, timeDuration, timeGap)
currentStart = 0
currentEnd = 0 + timeGap
currentColorNum = sylNum % 7 + 1 -- 当前选定的颜色
colorResult = "" -- 输出结果
colorResult = colorResult .. "\\3c"..colors[currentColorNum] -- 添加初状态
while timeDuration - currentEnd > -timeGap do
currentColorNum = (currentColorNum + 1) % 7 + 1
colorResult = colorResult .. "\\t(" .. tostring(currentStart) .. "," .. tostring(currentEnd) ..",\\3c" .. colors[currentColorNum] .. ")"
currentStart = currentStart + timeGap
currentEnd = currentEnd + timeGap
end
return colorResult
end
colorTag(5, 2000, 120)
>>> \3c&H009C8CCC\t(0,120,\3c&H003202C7)\t(120,240,\3c&H0092321E)\t(240,360,\3c&H0096C121)\t(360,480,\3c&H00AB4EB8)\t(480,600,\3c&H0015CCD7)\t(600,720,\3c&H0004C026)\t(720,840,\3c&H009C8CCC)\t(840,960,\3c&H003202C7)\t(960,1080,\3c&H0092321E)\t(1080,1200,\3c&H0096C121)\t(1200,1320,\3c&H00AB4EB8)\t(1320,1440,\3c&H0015CCD7)\t(1440,1560,\3c&H0004C026)\t(1560,1680,\3c&H009C8CCC)\t(1680,1800,\3c&H003202C7)\t(1800,1920,\3c&H0092321E)\t(1920,2040,\3c&H0096C121)
函数说明:sylNum
为当前音节的序数,配合计数器使用,用于产生颜色错位。timeDuration
为当前行的时间长度。timeGap
为渐变间隔时间。
应用举例(syl)
Comment: 0,0:00:15.07,0:00:17.07,Default,计数器,0,0,0,code line,ci=0
Comment: 0,0:00:15.07,0:00:17.07,Default,计数器,0,0,0,code once,function countc() ci=ci+1 return ""end
Comment: 0,0:00:00.00,0:00:05.00,Default,colorTag,0,0,0,code once,colors = { "&H003202C7", "&H0015CCD7", "&H0092321E", "&H0004C026", "&H0096C121", "&H009C8CCC", "&H00AB4EB8" } colorNum = 7 function colorTag(sylNum, timeDuration, timeGap) currentStart = 0 currentEnd = 0 + timeGap currentColorNum = sylNum % 7 + 1 colorResult = "" colorResult = colorResult .. "\\3c"..colors[currentColorNum] while timeDuration - currentEnd > -timeGap do currentColorNum = (currentColorNum + 1) % 7 + 1 colorResult = colorResult .. "\\t(" .. tostring(currentStart) .. "," .. tostring(currentEnd) ..",\\3c" .. colors[currentColorNum] .. ")" currentStart = currentStart + timeGap currentEnd = currentEnd + timeGap end return colorResult end
Comment: 0,0:00:05.00,0:00:05.00,Default,,0,0,0,template syl,!countc()!{\pos($x,$y)\bord3\blur2!colorTag(ci, line.duration, 100)!}
Comment: 0,0:00:05.00,0:00:07.00,Default,,0,0,0,karaoke,{\k13}知{\k13}道{\k13}答{\k13}案{\k13}的{\k13}明{\k13}天{\k13}还{\k13}有{\k13}什{\k13}么{\k13}期{\k13}待{\k13}的{\k13}意{\k13}义
应用举例(line)
如果希望结果只有一行显示(而不是每个syl各一行),只要把修饰语改为template line
,并调整(删除)定位标签。
Comment: 0,0:00:15.07,0:00:17.07,Default,计数器,0,0,0,code line,ci=0
Comment: 0,0:00:15.07,0:00:17.07,Default,计数器,0,0,0,code once,function countc() ci=ci+1 return ""end
Comment: 0,0:00:00.00,0:00:05.00,Default,colorTag,0,0,0,code once,colors = { "&H003202C7", "&H0015CCD7", "&H0092321E", "&H0004C026", "&H0096C121", "&H009C8CCC", "&H00AB4EB8" } colorNum = 7 function colorTag(sylNum, timeDuration, timeGap) currentStart = 0 currentEnd = 0 + timeGap currentColorNum = sylNum % 7 + 1 colorResult = "" colorResult = colorResult .. "\\3c"..colors[currentColorNum] while timeDuration - currentEnd > -timeGap do currentColorNum = (currentColorNum + 1) % 7 + 1 colorResult = colorResult .. "\\t(" .. tostring(currentStart) .. "," .. tostring(currentEnd) ..",\\3c" .. colors[currentColorNum] .. ")" currentStart = currentStart + timeGap currentEnd = currentEnd + timeGap end return colorResult end
Comment: 0,0:00:05.00,0:00:05.00,Default,,0,0,0,template line,!countc()!{\bord3\blur2!colorTag(ci, line.duration, 1000)!}
Comment: 0,0:00:05.00,0:00:07.00,Default,,0,0,0,karaoke,{\k13}知{\k13}道{\k13}答{\k13}案{\k13}的{\k13}明{\k13}天{\k13}还{\k13}有{\k13}什{\k13}么{\k13}期{\k13}待{\k13}的{\k13}意{\k13}义
Dialogue: 0,0:00:05.00,0:00:07.00,Default,,0,0,0,fx,{\bord3\blur2\3c&H0015CCD7\t(0,1000,\3c&H0004C026)\t(1000,2000,\3c&H009C8CCC)}知{\bord3\blur2\3c&H0092321E\t(0,1000,\3c&H0096C121)\t(1000,2000,\3c&H00AB4EB8)}道{\bord3\blur2\3c&H0004C026\t(0,1000,\3c&H009C8CCC)\t(1000,2000,\3c&H003202C7)}答{\bord3\blur2\3c&H0096C121\t(0,1000,\3c&H00AB4EB8)\t(1000,2000,\3c&H0015CCD7)}案{\bord3\blur2\3c&H009C8CCC\t(0,1000,\3c&H003202C7)\t(1000,2000,\3c&H0092321E)}的{\bord3\blur2\3c&H00AB4EB8\t(0,1000,\3c&H0015CCD7)\t(1000,2000,\3c&H0004C026)}明{\bord3\blur2\3c&H003202C7\t(0,1000,\3c&H0092321E)\t(1000,2000,\3c&H0096C121)}天{\bord3\blur2\3c&H0015CCD7\t(0,1000,\3c&H0004C026)\t(1000,2000,\3c&H009C8CCC)}还{\bord3\blur2\3c&H0092321E\t(0,1000,\3c&H0096C121)\t(1000,2000,\3c&H00AB4EB8)}有{\bord3\blur2\3c&H0004C026\t(0,1000,\3c&H009C8CCC)\t(1000,2000,\3c&H003202C7)}什{\bord3\blur2\3c&H0096C121\t(0,1000,\3c&H00AB4EB8)\t(1000,2000,\3c&H0015CCD7)}么{\bord3\blur2\3c&H009C8CCC\t(0,1000,\3c&H003202C7)\t(1000,2000,\3c&H0092321E)}期{\bord3\blur2\3c&H00AB4EB8\t(0,1000,\3c&H0015CCD7)\t(1000,2000,\3c&H0004C026)}待{\bord3\blur2\3c&H003202C7\t(0,1000,\3c&H0092321E)\t(1000,2000,\3c&H0096C121)}的{\bord3\blur2\3c&H0015CCD7\t(0,1000,\3c&H0004C026)\t(1000,2000,\3c&H009C8CCC)}意{\bord3\blur2\3c&H0092321E\t(0,1000,\3c&H0096C121)\t(1000,2000,\3c&H00AB4EB8)}义