【書きかけスクリプト】文字種別フォント
タイトルの通り。文字種別にフォントを選びたいという時のために作ったもの。一応anmファイルを想定していますがあくまで自分用
配布元どこだか忘れましたが、「ランダムフォント」で使われているスクリプトを流用しています。
code:lua
@文字種別フォント
--check0:縦書き,0
--dialog:コピー用,co="<?mes(EF_tex('ここにテキスト'))?>";基本font,bfont="MS UI Gothic";半角数字font,hnfont="Bradley Hand ITC";半角記号font,hfont="Bradley Hand ITC";半角カナfont,hkfont="MingLiU";全角記号font,afont="HGゴシックE";全角ひらfont,ahfont="HG明朝B";全角カナfont,akfont="メイリオ";全角漢字font,acfont="KaiTi";各fontsize,local fs={nil,nil,nil,nil,nil,nil,nil}
--attention;このスクリプトは「ランダムフォント」から必要な部分だけ抜粋&追加したものです。
if hfont == nil then
hfont = bfont
end
if hkfont == nil then
hkfont = bfont
end
if hnfont == nil then
hnfont = bfont
end
if afont == nil then
afont = bfont
end
if ahfont == nil then
ahfont = bfont
end
if akfont == nil then
akfont = bfont
end
if acont == nil then
acfont = bfont
end
if obj.check0 then
bfont="@"..bfont
hnfont="@"..hnfont
hfont="@"..hfont
hkfont="@"..hkfont
afont="@"..afont
ahfont="@"..ahfont
akfont="@"..akfont
acfont="@"..acfont
end
function EF_tex(text)
local fb={}
local TE={}
local ri=0
local se=0
local SF={}
if 0<#text then
while(0) do
ri=ri+1
if((0<=string.byte(text,1) and string.byte(text,1)<=127) or (161<=string.byte(text,1) and string.byte(text,1)<=223)) then --半角記号文字and半角カナの処理?
--if nil then
TEri=string.sub(text,1,1) --半角文字列を収納 if((0<=string.byte(text,1) and string.byte(text,1)<=32) or string.byte(text,1)==127) then --制御文字
--if nil then
se=se+1
SFse=ri --制御文字はtextの文字数に含まれないからTEriとは別で保存? end
else
TEri=string.sub(text,1,2) --全角文字列を収納 end
text=string.sub(text,1+fbri,#text) --fbriで格納した分だけ全体からtextを削る。textが残り0文字になったらbreak。 if(#text==0) then
break --この時点で繰り返された分だけriの値が保持される
end
end
end
local c=""
-- local font=""
-----------------------------------------------------
for k=1,ri do
local s,clr,clr2
if(fbk==1) then --半角系統の文字処理 if(48<=string.byte(TEk,1) and string.byte(TEk,1)<=57) then --半角数字文字 font=hnfont --半角数字文字
elseif(0<=string.byte(TEk,1) and string.byte(TEk,1)<=127) then --半角記号文字 font=hfont --半角記号文字
elseif(161<=string.byte(TEk,1) and string.byte(TEk,1)<=223) then --半角カナ font=hkfont --半角カナ
end
else --全角系統(2バイト文字)の処理
if(0x88<=string.byte(TEk,1) or (string.byte(TEk,1)==0x81 and (string.byte(TEk,2)==0x57 or string.byte(TEk,2)==0x58 or string.byte(TEk,2)==0x59))) then --全角漢字 font=acfont --全角漢字
else
if(string.byte(TEk,1)==0x83 and (0x40<=string.byte(TEk,2) and string.byte(TEk,2)<=0x96)) then --全角カナ font=akfont --全角カナ
elseif((string.byte(TEk,1)==0x82 and (0x9f<=string.byte(TEk,2) and string.byte(TEk,2)<=0xf1)) or (string.byte(TEk,1)==0x81 and ((0x40<=string.byte(TEk,2) and string.byte(TEk,2)<=0x56) or string.byte(TEk,2)==0x5b or string.byte(TEk,2)==0x60))) then --全角ひら font=ahfont --全角ひら
else --全角記号全般の処理
font=afont --全角記号
end
end
end
local b="<s,"..font..">"
local bb="<s>"
if(s~=nil) then --文字の大きさ指定されてる時の処理
b="<s"..s..","..font..">"
end
c=c..b..TEk..bb --ここで文字を繋げる s=nil --文字サイズを破棄
end
return c
end
文字カーニングとかサイズ変更もしたいよね
code:lua
---@param text string @ 表示文字列
---@param x number @ 表示位置x
---@param y number @ 表示位置y
---@param ch number @ 0=横書き/1=縦書き
---@param type number @ 文字装飾(0~4)
---@param col any @ 文字色
---@param size number @ 基準フォントサイズ
---@param fs table @ 各サイズ比{1,1,1,1,1,1,1,1}
---@param line number @ 行
---@param bfont string @ 基本フォント{"フォント名",字間,行間,字間(異なるフォント同士)}
---@param hnfont string @ 半角数字フォント{上に同じ。以下全部同様。}
---@param hfont string @ 半角記号フォント
---@param hkfont string @ 半角カナフォント
---@param afont string @ 全角記号フォント
---@param ahfont string @ 全角ひらフォント
---@param akfont string @ 全角カナフォント
---@param acfont string @ 全角漢字フォント
function EFob(text,x,y,ch,type,col,size,fs,line,bfont,hnfont,hfont,hkfont,afont,ahfont,akfont,acfont)
local function add(a,k)
local b = 0
for i = 1,k do
if ai ~= nil then b = b + ai end end
return b
end
if bfont1 == "" or nil then bfont1="MS UI Gothic" end if hnfont1 == "" or nil then hnfont1 = bfont1 end if hfont1 == "" or nil then hfont1 = bfont1 end if hkfont1 == "" or nil then hkfont1 = bfont1 end if afont1 == "" or nil then afont1 = bfont1 end if ahfont1 == "" or nil then ahfont1 = bfont1 end if akfont1 == "" or nil then akfont1 = bfont1 end if acfont1 == "" or nil then acfont1 = bfont1 end for i = 2,5 do
if bfonti == nil then bfonti = 0 end if hnfonti == nil then hnfonti = bfonti end if hfonti == nil then hfonti = bfonti end if hkfonti == nil then hkfonti = bfonti end if afonti == nil then afonti = bfonti end if ahfonti == nil then ahfonti = bfonti end if akfonti == nil then akfonti = bfonti end if acfonti == nil then acfonti = bfonti end end
if fs1 == nil then fs1 = 1 end for i = 2,8 do
if fsi == nil then fsi = fs1 end end
if ch==1 then
end
local fb={} --半角全角識別情報(1=半角/2=全角)
local TE={} --文字列を格納
local ri=0 --文字列の文字数
local se=0 --制御文字の文字数
local SF={} --制御文字格納
if 0<#text then
while(0) do
ri=ri+1
if((0<=string.byte(text,1) and string.byte(text,1)<=127) or (161<=string.byte(text,1) and string.byte(text,1)<=223)) then --半角記号文字and半角カナの処理?
--if nil then
TEri=string.sub(text,1,1) --半角文字列を収納 if((0<=string.byte(text,1) and string.byte(text,1)<=32) or string.byte(text,1)==127) then --制御文字
--if nil then
se=se+1
SFse=ri --制御文字はtextの文字数に含まれないからTEriとは別で保存? end
else
TEri=string.sub(text,1,2) --全角文字列を収納 end
text=string.sub(text,1+fbri,#text) --fbriで格納した分だけ全体からtextを削る。textが残り0文字になったらbreak。 if(#text==0) then
break --この時点で繰り返された分だけriの値が保持される
end
end
end
local c=""
local font = ""
local f_x,f_y,c_x,yMax = 0,0,{},0
-----------------------------------------------------
for k=1,ri do
local s
if(fbk==1) then --半角系統の文字処理 if(string.byte(TEk,1)==46 or (48<=string.byte(TEk,1) and string.byte(TEk,1)<=58)) then --半角数字文字 f_x,f_y = hnfont2,hnfont3 elseif(0<=string.byte(TEk,1) and string.byte(TEk,1)<=127) then --半角記号文字 elseif(161<=string.byte(TEk,1) and string.byte(TEk,1)<=223) then --半角カナ f_x,f_y = hkfont2,hkfont3 end
else --全角系統(2バイト文字)の処理
if(0x88<=string.byte(TEk,1) or (string.byte(TEk,1)==0x81 and (string.byte(TEk,2)==0x57 or string.byte(TEk,2)==0x58 or string.byte(TEk,2)==0x59))) then --全角漢字 f_x,f_y = acfont2,acfont3 else
if(string.byte(TEk,1)==0x83 and (0x40<=string.byte(TEk,2) and string.byte(TEk,2)<=0x96)) then --全角カナ f_x,f_y = akfont2,akfont3 elseif((string.byte(TEk,1)==0x82 and (0x9f<=string.byte(TEk,2) and string.byte(TEk,2)<=0xf1)) or (string.byte(TEk,1)==0x81 and ((0x40<=string.byte(TEk,2) and string.byte(TEk,2)<=0x56) or string.byte(TEk,2)==0x5b or string.byte(TEk,2)==0x60))) then --全角ひら f_x,f_y = ahfont2,ahfont3 else --全角記号全般の処理
end
end
end
yMax = math.max(unpack(fs))
obj.setfont(font,size*s,type,col)
obj.draw(x+add(c_x,k)+add(fb,k)*0.5*size*s+f_x , y+line*size*yMax+f_y)
s,font=nil,"" --文字サイズを破棄
f_x,f_y = 0,0
end
end
相変わらずスクリプトとしてごちゃごちゃしてるし使い勝手が悪いね
しかも前半はanmファイル想定なのに後半のはobjファイルから引っ張り出してきているというちぐはぐさ...
気が向いたらちゃんと作り直そうかな(←絶対作り直さない)