【Aegisub】任意字符串轉(zhuǎn)ASSDraw3繪圖代碼

首先在提任意字符串轉(zhuǎn)ASSDraw3繪圖之前,先講講ASSDraws的繪圖代碼是什么樣子的
一、Yutils的文字轉(zhuǎn)繪圖產(chǎn)生的繪圖字符串是什么樣的
Yutils可以將文字轉(zhuǎn)為繪圖代碼,但是這些繪圖字符串都是省略的繪圖字符串。
因?yàn)楸緛?lái)的繪圖字符串應(yīng)該符合以下規(guī)律:
b命令后面只能接3個(gè)點(diǎn),然后要不然后面什么繪圖命令都沒(méi)有、要不然就接下一個(gè)繪圖命令
直線l命令后面只接一個(gè)點(diǎn),然后要不然后面就畫完了,要不然就接著下一個(gè)繪圖命令
m表示開(kāi)始一個(gè)新的繪圖起點(diǎn)
所以整個(gè)繪圖比如這樣的格式:
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轉(zhuǎn)出的繪圖代碼并不是上面這種"嚴(yán)格規(guī)范"的格式,而是能省就省的格式,這樣的省略格式雖然你復(fù)制到assdraw3里面也能識(shí)別,但是,assdraw3會(huì)自動(dòng)把你這個(gè)省略的代碼補(bǔ)完、補(bǔ)齊以后才讀出繪圖的,所以并不是直接讀的省略的繪圖代碼,而是它自動(dòng)補(bǔ)齊再讀的繪圖
所以,如果直接用Yutils轉(zhuǎn)的繪圖,就不能用在比如vector_move函數(shù)里面,因?yàn)槟莻€(gè)函數(shù)只能讀出"嚴(yán)格規(guī)范"的繪圖字符串代碼,不能讀出Yutils這種能省就省省略繪圖代碼,它可不會(huì)像assdraw3那樣自動(dòng)補(bǔ)齊、補(bǔ)完。所以你直接用Yutils轉(zhuǎn)的繪圖字符串給Vector_move函數(shù),那么就會(huì)報(bào)錯(cuò),就會(huì)報(bào)錯(cuò)說(shuō)你的繪圖命令是未知的,所以為了不出現(xiàn)這樣的情況,你就必須先自己把Yutils轉(zhuǎn)出的繪圖字符串文本給好好補(bǔ)齊才可以
比如你可以這樣寫一個(gè)函數(shù)來(lái)處理字符串:
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
當(dāng)然你也可以用gsub來(lái)寫,那樣更簡(jiǎn)單!
二、那么對(duì)于任意一串字符串,要怎么處理成assdraw3形式的繪圖代碼呢?
詳見(jiàn)視頻:https://www.bilibili.com/video/BV1da4y1v7kd/

另外,如何封閉繪圖路徑也在另一個(gè)視頻里說(shuō)明介紹了