欢迎光临散文网 会员登陆 & 注册

【Aegisub】任意字符串转ASSDraw3绘图代码

2020-05-02 07:05 作者:多华宫与火火里  | 我要投稿

首先在提任意字符串转ASSDraw3绘图之前,先讲讲ASSDraws的绘图代码是什么样子的


一、Yutils的文字转绘图产生的绘图字符串是什么样的

Yutils可以将文字转为绘图代码,但是这些绘图字符串都是省略的绘图字符串。

因为本来的绘图字符串应该符合以下规律:

b命令后面只能接3个点,然后要不然后面什么绘图命令都没有、要不然就接下一个绘图命令


直线l命令后面只接一个点,然后要不然后面就画完了,要不然就接着下一个绘图命令


m表示开始一个新的绘图起点


所以整个绘图比如这样的格式:

m 2 5 l 12 55 l 24 32


再比如:m 0 3 b 12 23 21 33 26 18 b 42 33 15 28 10 38 l 5 9


而Yutils转出的绘图代码并不是上面这种"严格规范"的格式,而是能省就省的格式,这样的省略格式虽然你复制到assdraw3里面也能识别,但是,assdraw3会自动把你这个省略的代码补完、补齐以后才读出绘图的,所以并不是直接读的省略的绘图代码,而是它自动补齐再读的绘图


所以,如果直接用Yutils转的绘图,就不能用在比如vector_move函数里面,因为那个函数只能读出"严格规范"的绘图字符串代码,不能读出Yutils这种能省就省省略绘图代码,它可不会像assdraw3那样自动补齐、补完。所以你直接用Yutils转的绘图字符串给Vector_move函数,那么就会报错,就会报错说你的绘图命令是未知的,所以为了不出现这样的情况,你就必须先自己把Yutils转出的绘图字符串文本给好好补齐才可以

比如你可以这样写一个函数来处理字符串:

function Xshape.change_Yutilsdraw(ass_shape)

local new_l_b={}

for m in ass_shape:gmatch("m[^m]+") do

for bl in m:gmatch("[mbl][- .%d]+") do

if bl:match("[mbl]")=="m" then

new_l_b[#new_l_b+1]=bl

elseif bl:match("[mbl]")=="l" then

local l_points={}

for l_p in bl:gmatch("[-.%d]+ [-.%d]+") do

l_points[#l_points+1]="l "..l_p.." "

end

new_l_b[#new_l_b+1]=table.concat(l_points)

elseif bl:match("[mbl]")=="b" then

local b_points={}

for b_p in bl:gmatch("[-.%d]+ [-.%d]+ [-.%d]+ [-.%d]+ [-.%d]+ [-.%d]+") do

b_points[#b_points+1]="b "..b_p.." "

end

new_l_b[#new_l_b+1]=table.concat(b_points)

end

end

end

return table.concat(new_l_b)

end

当然你也可以用gsub来写,那样更简单!


二、那么对于任意一串字符串,要怎么处理成assdraw3形式的绘图代码呢?

详见视频:https://www.bilibili.com/video/BV1da4y1v7kd/

另外,如何封闭绘图路径也在另一个视频里说明介绍了

【Aegisub】任意字符串转ASSDraw3绘图代码的评论 (共 条)

分享到微博请遵守国家法律