| 
UID24积分1778帖子99主题5论坛币3492 威望8 EP值1453 MP值11 阅读权限100注册时间2011-8-5在线时间137 小时最后登录2014-6-18
 
  
 | 
| 本帖最后由 showjim 于 2013-2-4 10:55 编辑 
 第三课:脚本教程2
 
 序
 这里将讲解一个NyuFX的代码实例。效果为字体粒子化和Mask的使用。
 代码&字幕下载:
  tutorial_2.zip
(2.31 KB, 下载次数: 54, 售价: 1 论坛币) 
 
 正文
 此代码为NyuFX内置模板实例,我在这对其稍微讲解。
 此代码由三个子函数和一个main组成,虽然main没明写……复制代码function roumaji(line, l)
        l.style = "p"        --像素点不需要边宽并且设定7为对其方式
        for si, syl in ipairs(line.syls) do
                l.end_time = line.start_time + syl.end_time + 400
                for pi, pixel in ipairs( convert.text_to_pixels(syl.text, line.styleref) ) do
                        local x, y = pixel.x + math.round(syl.left), pixel.y + math.round(syl.top)
                        local alpha = (pixel.a == 255) and "" or ("\\1a" .. convert.a_to_ass(pixel.a))  ---此句用于获取像素的透明信息
                        l.start_time = line.start_time - line.infade / 2 * math.random(100) / 100
                        local start_offset = (line.start_time + syl.start_time) - l.start_time  ---设定像素其实移动时间
                        l.text = string.format("{\\move(%d,%d,%d,%d,%d,%d)\\fad(0,400)%s\\p1}m 0 0 l 1 0 1 1 0 1"
                                                                , x, y, x + math.random(-10,10), y + math.random(-10,10), start_offset, start_offset + syl.duration + 400
                                                                , alpha) ---1.这个string是用来指定像素点在特定时间范围内从原位置运动到末裔随机点; 2.此处要特别注意alpha,这个是用来还原字体边角。
                        io.write_line(l)
                end
        end
end
--此处基本同上
function kanji(line, l)
        l.style = "p"
        for si, char in ipairs(line.chars) do
                l.end_time = line.start_time + char.end_time + 400
                for pi, pixel in ipairs( convert.text_to_pixels(char.text, line.styleref) ) do
                        local x, y = pixel.x + math.round(char.left), pixel.y + math.round(char.top)
                        local alpha = (pixel.a == 255) and "" or ("\\1a" .. convert.a_to_ass(pixel.a))
                        l.start_time = line.start_time - line.infade / 2 * math.random(0,100) / 100
                        local start_offset = (line.start_time + char.start_time) - l.start_time
                        l.text = string.format("{\\move(%d,%d,%d,%d,%d,%d)\\fad(0,400)%s\\p1}m 0 0 l 1 0 1 1 0 1", x, y, x + math.random(-10,10), y + math.random(-10,10), start_offset, start_offset + char.duration + 400, alpha)
                        io.write_line(l)
                end
        end
end
function sub(line, l)
        --Text
        l.start_time = line.start_time - line.infade/2
        l.end_time = line.end_time + line.outfade/2
        l.text = string.format("{\\fad(%d,%d)\\bord0\\1c&H101010&}%s", line.infade/2, line.outfade/2, line.text)
        io.write_line(l) ---
        
        --Mask,这个对用TCAX的应该很熟悉
        local mask = shape.move( convert.text_to_shape(line.text, line.styleref), line.left*8, line.top*8) --字体会以原8倍大小转化成ASSDraw代码
        local shine = shape.ellipse(20, 20) --生成一个椭圆型
        l.style = "p"
        l.start_time = line.start_time
        l.end_time = line.end_time
        l.text = string.format("{\\move(%.3f,%.3f,%.3f,%.3f)\\blur4\\clip(4,%s)\\p1}%s", line.left - 20, line.top + (line.height - 20) / 2, line.right, line.top + (line.height - 20) / 2, mask, shine)
        io.write_line(l)
end
for li, line in ipairs(lines) do
        if line.styleref.alignment >=7 then
                roumaji( line, table.copy(line) )
        elseif line.styleref.alignment <=3 then
                sub( line, table.copy(line) )
        else
                kanji( line, table.copy(line) )
        end
        io.progressbar(li / #lines)  --此为让NyuFX的UI显示生成进度
end
它们分别为roumaji()、sub()、kanji()和最后的for循环(相当于main了)。
 代码解释如注释,这里讲解代码里的一些NyuFX的关键字的重点用法:
 
 1. convert.text_to_pixels :
 代码里调用如下:convert.text_to_pixels(syl.text, line.styleref),syl.text指音节里的字,line.styleref指此行的字体样式。
 
 2. \\clip(4,%s):这个出现在sub函数中,%s指代之前定义的mask,而“4”代表缩放比。
 
 代码效果预览:
 http://www.tudou.com/programs/view/ixTBqEH_NSo/
 | 
 
1
查看全部评分
 |