TCAX 字幕特效制作工具官方论坛 | ASS | TCAS | Python | Aegisub | Lua

 找回密码
 新人加入
查看: 7668|回复: 6
打印 上一主题 下一主题

[完整特效] [jiji]004_Clannad ~After Story OP1 [复制链接]

Rank: 5Rank: 5

跳转到指定楼层
楼主
发表于 2013-11-19 03:00:16 |只看该作者 |倒序浏览
本帖最后由 jijidata 于 2013-11-19 04:15 编辑
  1. from tcaxPy import *
  2. from s import *
  3. from gdiFont import *  #加入GDIfont模块
  4. import math
  5. import random

  6. def tcaxPy_Init():
  7.     global _FontFileName
  8.     global _FaceID
  9.     global _Fs
  10.     global _TextWidth
  11.     global _TextHeight
  12.     global _TextLength
  13.     global _TextAdvDiff
  14.     global _ResolutionX
  15.     global _FD
  16.     global _TextInitX
  17.     global _Ascender        # 字体上行高度
  18.     global _Descender        # 字体下行高度 通常为负数
  19.     global _H
  20.     _H = GetVal(val_FontSize)
  21.     _FontFileName = GetVal(val_FontFileName)
  22.     _FaceID       = GetVal(val_FaceID)
  23.     _Fs           = GetVal(val_FontSize)
  24.     _Ascender = GetVal(val_Ascender) #字体上行高度
  25.     _TextHeight   = GetVal(val_TextHeight)# 第i句卡拉OK歌词的j个字符的高度
  26.     _TextWidth    = GetVal(val_TextWidth)# 第i句卡拉OK歌词的j个字符的宽度
  27.     _TextLength   = GetVal(val_TextLength)# 第i句卡拉OK歌词的文字总长度
  28.     _TextAdvDiff  = GetVal(val_TextAdvanceDiff)# 从初始位置到第i句卡拉OK歌词的j个字符的水平步距
  29.     _TextInitX  = GetVal(val_TextInitX)
  30.     _ResolutionX  = GetVal(val_ResolutionX)
  31.     _FD           = 1000 / GetVal(val_FXFPS)
  32.     global GdiFont   #GDIfont
  33.     GdiFont = gfInitFont(GetVal(val_FontFaceName), _Fs, GetVal(val_Spacing), GetVal(val_SpaceScale), 0, False)   
  34.     global Font
  35.     Font = InitFont(GetVal(val_FontFileName), GetVal(val_FaceID), _Fs, GetVal(val_Spacing), GetVal(val_SpaceScale), 0xFFFFFF, 0, 0)


  36. def frxyz():
  37.     X1 = randint(-720,720)
  38.     X2 = randint(-720,720)
  39.     X3 = randint(-720,720)
  40.     return frx(X1)+fry(X2)+frz(X3)

  41. def tcaxPy_Main(_i, _j, _n, _BT, _ET, _SK, _KT, _X, _Y, _A, _TXT):
  42.     ASS_BUF = []                # 用于保存ASS特效
  43.     _7X = _X - int(_A / 2 + 0.5)              
  44.     _7Y = _Y - int(_H / 2 + 0.5)   

  45.             
  46.     if _i == 0:
  47.         ass_main(ASS_BUF,SubL(_BT+_j*5-_n*5,_BT+_SK,1),an(5)+b(1)+bord(0)+blur(0)+pos(_X,_Y)+alpha(255)+color1("000000")+t(0,5+_SK*1.28,alpha(0)) ,_TXT)#入场效果
  48.         ass_main(ASS_BUF,SubL(_BT+_SK,_BT+_SK+_KT+30,1),an(5)+bord(0)+blur(1)+color1("000000")+fad(0,200)+pos(_X,_Y)+org(_ResolutionX*0.5,0)+t(frz(-5)) ,_TXT)#表现方式
  49.         for j in range(5):
  50.             ass_main(ASS_BUF,SubL(_BT+_SK,_BT+_SK+_KT+90,2),an(1)+blur(2)+move(_X-20,_Y,_X+randint(-600,0),_Y+randint(-50,50))+t(fsc(0,0))+t(frxyz())+color3("000000")+fad(0,300)+fsc(40,40),"{\p3}m 0 0 l 50 49 l 100 0 l 51 50 l 100 100 l 50 51 l 0 100 l 49 50 l 0 0 m 45 45")
  51.     if _i == 1:
  52.         ass_main(ASS_BUF,SubL(_BT+_j*5-_n*5,_BT+_SK,1),an(5)+bord(1)+b(1)+blur(4)+pos(_X,_Y)+alpha(255)+color3("D080C7")+t(0,5+_SK*1.28,alpha(0)) ,_TXT)#入场效果
  53.         ass_main(ASS_BUF,SubL(_BT+_SK,_BT+_SK+_KT+30,1),an(5)+bord(1)+b(1)+blur(5)+color3("D080C7")+fad(0,200)+pos(_X,_Y)+org(_ResolutionX*0.5,0)+t(frz(-5)) ,_TXT)#表现方式
  54.         for j in range(20):
  55.             ass_main(ASS_BUF,SubL(_BT+_SK,_BT+_SK+_KT+90,2),an(1)+blur(4)+bord(1.5)+move(_X-20,_Y,_X+randint(-600,0),_Y+randint(-50,50))+t(fsc(0,0)+frxyz())+color3("D080C7")+fad(0,300),"{\p3}m 21 16 b 17 16 17 23 21 23 b 25 23 26 16 21 16 m 24 19 l 43 20 l 24 20 m 18 19 l 0 20 l 18 20 m 20 16 l 21 0 l 22 16 m 20 23 l 21 40 l 22 23")
  56.     if _i == 2:
  57.         ass_main(ASS_BUF,SubL(_BT+_j*5-_n*5,_BT+_SK,1),an(5)+bord(1.5)+b(1)+blur(4)+pos(_X,_Y)+alpha(255)+color3("A14840")+t(0,5+_SK*1.28,alpha(0)) ,_TXT)#入场效果
  58.         ass_main(ASS_BUF,SubL(_BT+_SK,_BT+_SK+_KT+30,1),an(5)+bord(1.5)+b(1)+blur(5)+color3("A14840")+fad(0,200)+pos(_X,_Y)+org(_ResolutionX*0.5,0)+t(frz(-5)) ,_TXT)#表现方式
  59.         for j in range(20):
  60.             ass_main(ASS_BUF,SubL(_BT+_SK,_BT+_SK+_KT+90,2),an(1)+blur(1)+bord(1.5)+move(_X-20,_Y,_X+randint(-600,0),_Y+randint(-50,50))+t(fsc(0,0)+frxyz())+color3("5D4740")+fad(0,300),"{\p3}m 21 16 b 17 16 17 23 21 23 b 25 23 26 16 21 16 m 24 19 l 43 20 l 24 20 m 18 19 l 0 20 l 18 20 m 20 16 l 21 0 l 22 16 m 20 23 l 21 40 l 22 23")
  61.     if _i == 3:
  62.         ass_main(ASS_BUF,SubL(_BT+_j*5-_n*5,_BT+_SK,1),an(5)+bord(1)+b(1)+blur(4)+pos(_X,_Y)+alpha(255)+color3("A14840")+t(0,5+_SK*1.28,alpha(0)) ,_TXT)#入场效果
  63.         ass_main(ASS_BUF,SubL(_BT+_SK,_BT+_SK+_KT+30,1),an(5)+bord(1.5)+b(1)+blur(5)+color3("A14840")+fad(0,200)+pos(_X,_Y)+org(_ResolutionX*0.5,0)+t(frz(-5)) ,_TXT)#表现方式
  64.         for j in range(20):
  65.             ass_main(ASS_BUF,SubL(_BT+_SK,_BT+_SK+_KT+90,2),an(1)+blur(4)+bord(1.5)+move(_X-20,_Y,_X+randint(-600,0),_Y+randint(-50,50))+t(fsc(0,0)+frxyz())+color3("76BDB2")+fad(0,300),"{\p3}m 21 16 b 17 16 17 23 21 23 b 25 23 26 16 21 16 m 24 19 l 43 20 l 24 20 m 18 19 l 0 20 l 18 20 m 20 16 l 21 0 l 22 16 m 20 23 l 21 40 l 22 23")
  66.     if _i > 3 and _i < 8:
  67.         ass_main(ASS_BUF,SubL(_BT+_j*15-_n*15,_BT+_SK,1),an(5)+bord(1.5)+b(1)+blur(3)+fax(-3)+fsc(10,30)+move(_X+20,_Y-60,_X,_Y,0,600)+color3("00FFFF")+t(0,600,fax(0)+fsc(100,100)) ,_TXT)#入场效果
  68.         ass_main(ASS_BUF,SubL(_BT+_SK,_BT+_SK+_KT+20,1),an(5)+bord(1.5)+b(1)+blur(3)+color3("00FFFF")+pos(_X,_Y)+t(fsc(0,0)) ,_TXT)#表现方式
  69.         points = gfGetPoints(GdiFont, _TXT)  #GDIfont

  70.         PIX = PixFromPoints(points)   #GDIfont
  71.    
  72.         InitPosX = _X - int(_A / 2 + 0.5) + PIX[0][0]        # 第一个像素的X轴坐标
  73.         InitPosY = _Y - int(_Fs / 2 + 0.5) + PIX[0][1]        # 第一个像素的Y轴坐标
  74.         for h in range(PIX[1][1]):                                # 开始纵向扫描
  75.             PosY  = InitPosY + h                                      # 当前像素Y轴坐标
  76.             for w in range(PIX[1][0]):                        # 开始横向扫描
  77.                 PosX = InitPosX + w
  78.                 X = PosX-randint(-50,50)
  79.                 Y = PosY-randint(-50,50)                        # 当前像素X轴坐标
  80.                 idx  = 4 * (h * PIX[1][0] + w)                # 脚标
  81.                 PixR = PIX[2][idx + 0]                        # 当前像素的红色分量
  82.                 PixG = PIX[2][idx + 1]                        # 当前像素的绿色分量
  83.                 PixB = PIX[2][idx + 2]                        # 当前像素的蓝色分量
  84.                 PixA = PIX[2][idx + 3]                        # 当前像素的透明度
  85.                 if PixA != 0:                                # 如果当前像素不为透明则进行如下操作
  86.                     ass_main(ASS_BUF, SubL(_BT+_SK-10,_BT+_SK+_KT+randint(0,80),1, Pix_Style),an(7)+move(PosX,PosY,PosX-randint(-20,20),PosY+30+randint(-20,20))+fad(0,300+randint(-100,100))+alpha(255-PixA)+blur(1)+shad(0)+bord(0)+color1("00FFFF"), "{\p4}m 7 0 b 2 0 1 4 1 6 b 1 8 2 12 7 12 b 12 12 13 8 13 6 b 13 4 12 0 7 0 ")
  87.                     
  88.         for j in range(math.ceil(_KT)):
  89.             J = [math.ceil(_KT)]
  90.             step1 = (_KT*10*(j-1)/(max(J)*10-1))
  91.             XC1= _X+_A*(j+1)/max(J)-_A
  92.             YC1= _Y+_Fs*(j-1)/max(J)*(-1)**_j*0.3
  93.             XC2= _X-randint(90,160)
  94.             YC2= _Y+randint(-40,40)
  95.             CurveMove = move(XC1,YC1,XC2,YC2)
  96.             ass_main(ASS_BUF,SubL(_BT+_SK+step1,_BT+_SK+_KT+step1+80,2),an(5)+blur(4)+bord(0.5)+vc1("00FFFF","00FFFF","FFFFFF","FFFFFF")+fad(0,300)+frxyz()+color3("00FFFF")+CurveMove,"{\p3}m 21 16 b 17 16 17 23 21 23 b 25 23 26 16 21 16 m 24 19 l 43 20 l 24 20 m 18 19 l 0 20 l 18 20 m 20 16 l 21 0 l 22 16 m 20 23 l 21 40 l 22 23")
  97.     if _i > 7:
  98.         va3 = "\\3va(&HAF&,&HAF&,&H00&,&H00&)"
  99.         ass_main(ASS_BUF,SubL(_BT-80+_j*3,_BT+_SK,1),an(5)+bord(1.5)+b(1)+blur(6)+moves4(_X+randint(-50,-40),_Y+randint(-50,15),_X,_Y+randint(-75,75),_X+150,_Y++randint(-150,150),_X,_Y,0,400),_TXT)#入场效果
  100.         ass_main(ASS_BUF,SubL(_BT+_SK,_BT+_SK+_KT,1),an(5)+bord(1.5)+b(1)+pos(_X,_Y)+t(0,_KT*4,fr(randint(-4,4))+fsc(140,140)+color3("FFFFFF")+bord(5)+blur(8))+t(_KT*4,_KT*10,fr(0)+fsc(100,100)+va3+bord(2)+blur(5)) ,_TXT)
  101.         for k in range (10):
  102.             start = _BT+_SK-_KT
  103.             end = start+70
  104.             blink = alt(start,end, t = 30 , FX1 = alpha(255), FX2 = alpha(0), offset = 0, a1 = None,a2 = None)
  105.             sx = randint(-50,50)
  106.             sy = randint(-120,-70)
  107.             sy2 = sy + randint(120,180)
  108.             ass_main(ASS_BUF,SubL(start ,end,2),an(5)+blur(4)+bord(0.5)+shad(0)+fad(300,300)+frxyz()+color("FFFFFF")+color3("BCB4FB")+fsc(randint(120,170),randint(120,170))+move(_X+sx,_Y+sy,_X+sx,_Y+sy2)+blink,"{\p3}m 30 23 b 24 23 24 33 30 33 b 36 33 37 23 30 23 m 35 27 l 61 28 l 35 29 m 26 27 l 0 28 l 26 29 m 29 23 l 30 0 l 31 23 m 29 33 l 30 57 l 31 33")
  109.         if _i == 13 and _j > 11:
  110.             for j in range(20):
  111.                 ass_main(ASS_BUF,SubL(_BT+_SK+randint(-20,-10),_BT+_SK+_KT+randint(50,70),2),an(5)+blur(random.uniform(1, 4))+bord(random.uniform(0,1))+shad(0)+fs(0)+fad(300,300)+move(_X+randint(-10,10),_Y-randint(-10,10),_X+randint(-100,100),_Y+randint(-70,70))+t(fs(0)+frxyz())+color1("00FFFF")+color3("00FFFF"),"{\p2}m 21 -2 b 18 -1 13 7 14 7 l 14 5 b 12 8 12 14 12 14 l 14 16 l 12 15 b 11 20 14 23 14 23 l 12 22 b 12 23 14 25 15 25 l 14 25 b 15 26 16 27 16 27 b 17 28 19 33 20 36 l 21 36 b 20 34 18 30 17 26 b 19 25 20 22 22 20 l 20 20 l 22 18 l 21 18 b 23 15 23 13 23 10 l 22 8 l 23 8 b 24 8 23 4 23 3 l 21 4 l 22 1 l 21 -2 m 20 3 b 17 8 16 16 17 22 b 16 23 15 7 20 3")

  112.             
  113.             
  114.     return (ASS_BUF, None)
复制代码
依旧是移植之前写的template模板,有少许修改,中间那部分的曲线有少许瑕疵,衔接不完美,于是想着由于tcax支持像素字就加了试试效果,看看能不能糊弄覆盖过去,嘛~也大概差不多,找机会会修复的..

预览:
http://pan.baidu.com/s/1y27Mq



1

查看全部评分

Rank: 5Rank: 5

沙发
发表于 2013-11-22 00:42:37 |只看该作者
  1. # tcc file version

  2. < tcc file version = 1.000 >

  3. # mode configuration

  4. < inherit ass header = false >
  5. < k mode = syllable >
  6. < text layout = horizontal >
  7. < tcaxpy init = true >
  8. < tcaxpy user = false >
  9. < tcaxpy fin = false >

  10. # py settings
  11. < py file = jiji-004.py >    < beg line = 1 >    < end line = 0 >





  12. < k-timed ass file = Clannad ~After Story_k.ass >
  13. < font file = DFMrm3.ttc >    < font face id = 2 >    < font size = 40 >
  14. < fx width = 1280 >    < fx height = 720 >    < fx fps = 23.976 >
  15. < alignment = 2 >
  16. < x offset = 10 >    < y offset = 20 >
  17. < spacing = 0 >    < space scale = 1.000 >



  18. # style settings

  19. < font face name = "" >
  20. < bord = 1 >    < shad = 0 >
  21. < primary color = FFFFFF >    < secondary color = 000000 >    < outline color = A14840 >    < back color = 000000 >
  22. < primary alpha = 0 >    < secondary alpha = 240 >    < outline alpha = 0 >    < back alpha = 240 >

  23. # additional settings

  24. < blur = 0.000 >
复制代码
tcc
1

查看全部评分

Rank: 4

板凳
发表于 2013-12-26 22:29:03 |只看该作者
刚学这个脚本,新手问:为什么我用这个脚本出现下面的错误:
TCAX version 1.2.0 [2012-08-03] [Anniversary]
(C) Copyright 2009-2012 milkyjing

Traceback (most recent call last):
  File "E:\studio\Subtitles\tcaxDon\theDawn\part2.py", line 52, in tcaxPy_Main
    ass_main(ASS_BUF,SubL(_BT+_j*5-_n*5,_BT+_SK,1),an(5)+b(1)+bord(0)+blur(0)+po
s(_X,_Y)+alpha(255)+color1("000000")+t(0,5+_SK*1.28,alpha(0)) ,_TXT)#入场效果
TypeError: b() takes no arguments (1 given)
Fatal Error: failed to execute the tcaxPy_Main() function in the 1(th) user tcax
py script.
INFO: Task failed!


温馨提醒: 如果不清楚造成本错误的原因, 请保留本窗口截图以及当前特效工程,
访问 http://tcax.rhacg.com/forum.php?mod=forumdisplay&fid=38 发帖以获取帮助.

请按任意键继续. . .
Snap1.jpg

Rank: 5Rank: 5

地板
发表于 2013-12-26 23:51:03 |只看该作者
dawntop 发表于 2013-12-26 22:29
刚学这个脚本,新手问:为什么我用这个脚本出现下面的错误:
TCAX version 1.2.0 [2012-08-03] [Anniversar ...

b参数是个给定值
其实是主程序tcaxPy.py有点小错误,奶大说会在下个版本解决,我直接在里面修改了
解决方法看这里:
http://www.tcax.org/forum.php?mo ... &extra=page%3D1

Rank: 4

5#
发表于 2013-12-31 16:40:00 |只看该作者
Thank you.

Rank: 4

6#
发表于 2015-7-15 16:51:23 |只看该作者
from s import错误

Rank: 4

7#
发表于 2015-8-11 16:19:29 |只看该作者
from s import错误,怎么解决呢?

Rank: 4

8#
发表于 2021-8-20 21:11:05 |只看该作者
本帖最后由 Seekladoom 于 2021-8-20 23:09 编辑

第110行的blink目的是想做类似AutoTags一样的效果吗?
  1. blink = alt(start,end, t = 30 , FX1 = alpha(255), FX2 = alpha(0), offset = 0, a1 = None,a2 = None)
复制代码

常用自定义函数AutoTags及其变种的介绍
http://www.tcax.org/forum.php?mod=viewthread&tid=1230


Python版的AutoTags:
  1. import math

  2. class autotag:
  3.         def __init__(self, intervalo1=0, intervalo2=0, dato1="",
  4.                                 dato2="", pause=0, delay=0, line_dur=0):
  5.                
  6.                 self.intervalo1 = intervalo1
  7.                 self.intervalo2 = intervalo2
  8.                 self.dato1 = dato1
  9.                 self.dato2 = dato2
  10.                 self.pause = pause
  11.                 self.delay = delay
  12.                
  13.                 self.resultado = ""
  14.                 self.suerte = ""
  15.                 self.contador = 0
  16.                 self.line_dur = line_dur
  17.       
  18.         def autotags(self):
  19.                 count = math.ceil(self.line_dur / self.intervalo1)
  20.                
  21.                 for i in range(count):
  22.                         if i % 2 == 0:
  23.                                 self.suerte = self.dato1
  24.                         else:
  25.                                 self.suerte = self.dato2
  26.                        
  27.                         self.resultado += "\\t({0}, {1}, {2})".format(i*self.intervalo1, (i+1)*self.intervalo1, self.suerte)
  28.                
  29.                 return self.resultado
  30.       
  31.         def autotags1(self):
  32.                 count = math.ceil(self.line_dur / (self.intervalo1+self.pause))
  33.                
  34.                 for i in range(count):
  35.                         if i % 2 == 0:
  36.                                 self.suerte = self.dato1
  37.                         else:
  38.                                 self.suerte = self.dato2
  39.                        
  40.                         self.resultado += "\\t({0}, {1}, {2})".format(i*(self.intervalo1+self.pause), (i+1)*self.intervalo1+i*self.pause, self.suerte)
  41.                
  42.                 return self.resultado
  43.       
  44.         def autotags2(self):
  45.                 count = math.ceil(self.line_dur / self.intervalo1)
  46.                
  47.                 for i in range(count):
  48.                         if i % 2 == 0:
  49.                                 self.suerte = self.dato1
  50.                         else:
  51.                                 self.suerte = self.dato2
  52.                        
  53.                         self.resultado += "\\t({0}, {1}, {2})".format(i*self.intervalo1+self.delay, (i+1)*self.intervalo1+self.delay, self.suerte)
  54.                
  55.                 return self.resultado
  56.       
  57.         def autotags3(self):
  58.                 count = 2 * math.ceil(self.line_dur / (self.intervalo1 + self.intervalo2))
  59.                 d = math.ceil((self.intervalo2 - self.intervalo1) / count)
  60.                 t = [0]
  61.                
  62.                 for i in range(count):
  63.                        
  64.                         t.append(t[i] + self.intervalo1 + i * d)
  65.                        
  66.                         if i % 2 == 0:
  67.                                 self.suerte = self.dato1
  68.                         else:
  69.                                 self.suerte = self.dato2
  70.                        
  71.                         self.resultado += "\\t({0}, {1}, {2})".format(t[i], t[i+1], self.suerte)
  72.                
  73.                 return self.resultado
复制代码

Rank: 4

9#
发表于 2021-8-20 21:37:55 |只看该作者
本帖最后由 Seekladoom 于 2021-8-20 23:56 编辑

在这个帖子中找到了,果然是类似AutoTags的闪烁字幕效果:
主要是MOD的tag 不是很實用 自己都沒怎麼用過


代码如下:
  1. def alt(BT,ET, t = 100 , FX1 = alpha(255), FX2 = alpha(0), offset = 0, a1 = None,a2 = None):         #交替t效果 默认闪烁
  2.     n = 1
  3.     T = ''
  4.     for i in range(int(t)+ int(offset),(ET-BT)*10,int(t)):
  5.         if n % 2 != 0 :   
  6.             X1 = [str(i-t),str(i),a1,FX1]
  7.             T1 = '\\t('+','.join(str(x) for x in X1 if x != None)+ ')'
  8.             T += T1
  9.         else:
  10.             X2 = [str(i-t),str(i),a2,FX2]
  11.             T2 = '\\t('+','.join(str(x) for x in X2 if x != None)+ ')'
  12.             T += T2
  13.         n += 1   
  14.     return T
复制代码
注:这个def alt我尝试直接添加到tcaxPy.py文件中去,结果跑tcax命令行时就出现了这样的提示:
【图1】
alpha未定义.png

然而alpha在tcaxPy.py文件是有定义的,具体如下图所示:
图2
问题分析?.png

搞清楚原因了,def alt必须放到def alpha后面(如图2,def alpha在第645行,def alt在第660行)才不会出现name 'alpha' is not defined(名称alpha未定义)的情况。
因为def alt本身是一个带有多个变量的复合函数,其中用到的变量对应的函数(比如alpha变量对应的def alpha)若是被放到def alt后面的位置就会无法顺利读取,导致出现name 'alpha' is not defined(名称alpha未定义)的情况。

之前图1的情况就是因为def alt被放在了第450行,而def alpha在第600多行的位置才发生的。

这里附上我在mccoy39082的基础上(tcax.py Version 8.0.0.2)修改过的tcaxPy.py文件(mccoy39082帖子下的2楼回复),各位朋友直接放进tcax的根目录下替换原先的tcaxPy.py文件即可:
tcaxPy.py (46.86 KB, 下载次数: 2705)


如此一来也可以省去from s import *这行代码了,根据上面摸索出来的规则就可以把s.py的内容转移到tcaxPy.py文件中并进行测试了。
您需要登录后才可以回帖 登录 | 新人加入

GitHub|TCAX 主页

GMT+8, 2024-11-22 00:20

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部
RealH