【Aegisub】某函数的参数要求是自定义函数时的注意事项

因为在后面的教程中会介绍3D效果的制作,而我写的space库有不少函数的其中一些参数要求是填入一个自定义函数的,所以先在介绍3D效果之前讲清楚在填自定义函数时的一些注意事项。(水教程)
首先,之前的视频讲过Yutils的filter函数是如何使用的,filter函数的第二个参数就要求是要填一个自定义函数。之前讲过的,比如你可以这样填:
function (x,y) y=y+(5-5*(j/maxj)^2)*math.sin(x/5+(j)/2) return x,y end
这样的话你这个参数就是填了一个自定义的函数,但是当你要设定一些复杂一点的函数的时候,你可以先在一开始就写好一个函数,然后再在用filter的时候,把你写好的函数提供给filter使用。就拿刚刚的例子举例,你可以先一开始设定一个函数,比如名叫y2e2的函数:
function y2e2(x,y,i,n)
y=y+(5-5*(i/n)^2)*math.sin(x/5+(i)/2)
return x,y
end
然后再在使用filter函数的时候,用上你在之前定义的y2e2函数,就像这样:
_G.Yutils.shape.filter(text,function(x,y) return y2e2(x,y,j,maxj) end)
那么问题就来了,你是否能理解为什么这里没有直接在第二个参数那里填上y2e2(x,y,j,maxj)就完了呢?为什么这里不能写_G.Yutils.shape.filter(text,y2e2(x,y,j,maxj))呢,你说第二个参数不是要求填一个自定义函数吗,你填了一个“函数”,为什么这样是错误的呢?那么接下来就来说明一下这个问题
假设你现在写了这么一个函数:
function n3y7(a,b,c)
a=a+5 b=b-3 c=c*2
return a+b+c
end
然后你使用这个函数时,要给这个函数填入参数吧,那么比如你这样填入参数:
n3y7(233,66/2,3*5)
那么当然在实际执行你这个n3y7函数之前,是不是先要“获得”它的参数?也就是说,66/2等于33,而3*5等于15,然后提供给这个n3y7的三个参数就应该是233、33、15了,所以当然你使用n3y7(233,66/2,3*5)就和你使用n3y7(233,33,15)是一回事
然后此时假设你又写了一个函数:
function g5k3(a,b)
return a+b
end
然后你在用n3y7函数的时候,参数是这样填的 n3y7(233,66,g5k3(3,5)) 这样你也应该能够反应过来,在实际执行n3y7函数之前,先会“计算”它里面的参数的结果,所以先会算出g5k3(3,5)等于8,然后n3y7才能“获得”它第三个参数8。所以在这种简单的情况下,你肯定不会疑问,难道刚刚这里的第三个参数填入了一个“自定义函数”吗
所以再回到一开始的问题,当某个函数的参数需要填入一个自定义函数的时候,就算你在之前一开始就定义过xxx函数,但是你也不能直接在需要填入自定义函数的参数的位置直接填xxx就完事了。拿刚刚的例子来说,如果直接写_G.Yutils.shape.filter(text,y2e2(x,y,j,maxj))的话,是不是在实际执行filter函数之前,先要“获得”它的参数,所以就会先执行y2e2函数,而显然这y2e2函数首先第一点它返回的不是一个“函数”,而是两个数,第二点是现在这种填法在执行y2e2函数时,你都没有输入正确的参数,你现在这样它会先执行y2e2(x,y,j,maxj)对吧,那么这里面的参数x和y是什么?对吧,压根就没有填入正确的参数。因为你想要的x和y是要在执行filter函数时,才会传给你,而现在在执行filter函数时,先会“获得”filter函数它需要的参数,就先会执行y2e2(x,y,j,maxj),而这样的话,你x和y是啥?所以从两个方面来讲,无论怎么填都错了。就算你仅仅对y2e2函数填入了正确的参数,但是y2e2函数最后返回结果是不是两个数,那么相当于你给filter函数的第二个参数就不是要求的自定义函数,所以参数输入还是错误的。所以说,任何要求填入自定义函数的参数,你都要正确的填入一个自定义函数,所以说,这里就算你一开始在前面写了一个y2e2函数,在给filter用的时候,也不能就那样直接填进去完事。
当然无论你写_G.Yutils.shape.filter(text,function(x,y) return y2e2(x,y,j,maxj) end)也好,还是写_G.Yutils.shape.filter(text,function(xx,oo) return y2e2(xx,oo,j,maxj) end)也好,都没有问题,因为自定义函数嘛,它本身的参数名字你想取啥取啥。
然后你也可以在一开始设定一个参数多一点函数来给自定义函数使用,比如:
function xxx(x,y,i,n,a,w)
y=y+(5-5*(i/n)^a)*math.sin(x/5+(i)/w)
return x,y
end
这样就多了一些稍微自由一点的参数了,那么你在给filter用的时候,这些参数当然也要你自己设定好,比如 i 和 n 这两个参数,你当然要传入的是 j 和 maxj ,所以这两个参数填这个,然后剩下的a和w你也要自己填好,a你可以填比如2,w你可以填比如1.5等等等等。所以整体来说,用的时候就要这样写:
_G.Yutils.shape.filter(text,function(xx,oo) return xxx(xx,oo,j,maxj,2,1.5) end)
当然参数可以自由设定,所以你也可以这样填:
_G.Yutils.shape.filter(text,function(xx,oo) return xxx(xx,oo,j,maxj,5,4) end)
a啊w啊的数值可以按你的想法自由设定,但是一定要填正确的参数进去,不填的话在这里就是不对的。