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

 找回密码
 新人加入
查看: 5258|回复: 7

[完整特效] [J]035_Gundam_Seed_OP2特效脚本 (附完整工程) [复制链接]

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-5-10 12:52:49 |显示全部楼层
说明: 该特效算是一个最简单的TCAS粒子特效示例, 可以利用最新版(1.1.9 SP1)中新增的tcas_parse函数来提高预览效率, 只需做如下改动, 去掉67和81行的注释, 将第80行的TCAS_BUF改成buf, 即可. (做此改动后, 需要升级到1.1.9 SP1才可以执行)
Gundam_Seed_OP2.rar (1.88 MB, 下载次数: 2302)
  1. from tcaxPy import *
  2. from util.magick import *

  3. def tcaxPy_Init():
  4.     global _Fs
  5.     global _FD          # 一帧的持续时间, 约40毫秒
  6.     global Font         # 首要字体
  7.     global FontAll      # 加粗字体
  8.     global PIX_img
  9.     _Fs = GetVal(val_FontSize)
  10.     _FD = 1000 / GetVal(val_FXFPS)
  11.     _FontFileName = GetVal(val_FontFileName)
  12.     _FaceID = GetVal(val_FaceID)
  13.     Font = InitFont(_FontFileName, _FaceID, _Fs, GetVal(val_Spacing), GetVal(val_SpaceScale), 0xFFFFFF, 0, 0)
  14.     FontAll = InitFont(_FontFileName, _FaceID, _Fs, GetVal(val_Spacing), GetVal(val_SpaceScale), 0xFFFFFF, 4, 0)
  15.     PIX_img = PixPos(PixBlur(PixStrip(ImagePix(abspath('flare1.png'), 8, 8)), 1), 0, 0)

  16. def tcaxPy_Fin():
  17.     FinFont(Font)
  18.     FinFont(FontAll)

  19. # 用户修订版的tcaxPy_Main函数, 保留原始tcaxPy_Main风格是为了减少额外记忆量, 实际上该函数形式可以非常多样化
  20. def tcaxPy_Main_Fake(_i, _j, _n, _start, _end, _elapk, _k, _x, _y, _a, _txt, param):
  21.     ASS_BUF  = []        # 保存ASS特效
  22.     TCAS_BUF = []        # 保存TCAS特效
  23.     ##### 主要特效编写操作 ####
  24.     dx = _x - int((_a + GetVal(val_Spacing)) / 2 + 0.5)     # 一个固定操作, 将an5的坐标转换为an7
  25.     dy = _y - int(_Fs / 2 + 0.5)    # ASS特效默认采用an5坐标, TCAS特效则采用an7坐标
  26.     ###
  27.     PIX_t = TextPix(Font, _txt)
  28.     PIX = TextPix(FontAll, _txt)
  29.     PIX_s = PixColorMul(PixBlur(PIX, 20), 1, 1, 1, 0.8)
  30.     PIX = CombinePixs(PIX_s, PIX_t)
  31.     BigPixAdd(param[0], PIX, dx, dy, 0)
  32.     PIX0 = PIX
  33.     # 一些时间的计算
  34.     T0 = 10 * _start - 10 * _FD + 1 * _j * _FD
  35.     T1 = T0 + 4 * _FD
  36.     T2 = 10 * _end + 5 * _FD - 2 * (_n - _j - 1) * _FD
  37.     T3 = T2 + _FD * 4
  38.     # IN 进入方式
  39.     #PIX = PIX0
  40.     img = pmgToImage(a2rgb(PIX))
  41.     img.shade(0, 45, True)
  42.     PIX1 = PixPos(pmgToPix(img), PIX[0][0], PIX[0][1])
  43.     PIX2 = PixColorMul(PixMask(PIX1, PIX), 1, 0, 0, 1)
  44.     tcas_keyframe(TCAS_BUF, PixBlur(PixColorMul(PIX2, 1, 1, 1, 0.2), 10), PIX2, T0, T1, dx, dy, 1, 0)
  45.     # MAIN 存在方式
  46.     #PIX = PIX0
  47.     num = int((10 * (_start + _elapk) - T1) / _FD + 0.5) + 1
  48.     for i in range(num):
  49.         img = pmgToImage(a2rgb(PIX))
  50.         img.shade(i * 10, randint(44, 56), True)
  51.         PIX1 = PixPos(pmgToPix(img), PIX[0][0], PIX[0][1])
  52.         PIX2 = PixColorMul(PixMask(PIX1, PIX), 1, i / num, 0, 1)
  53.         tcas_main(TCAS_BUF, PIX2, T1 + i * _FD, T1 + (i + 1) * _FD, dx, dy, 0)
  54.     # OUT 消失方式
  55.     #tcas_keyframe(TCAS_BUF, PIX2, PixColorMul(PixBlur(PIX2, 16), 1, 1, 1, 0), T1 + num * _FD, 10 * (_start + _elapk + _k * 2), dx, dy, 2, 0)
  56.     #PIX = PIX0
  57.     dx2 = dx + PIX_t[0][0] - int(PIX_img[1][0] / 2 + 0.5)
  58.     dy2 = dy + PIX_t[0][1] - int(PIX_img[1][1] / 2 + 0.5)
  59.     inix = dx2 - randint(15, 30)
  60.     tab_posx = (inix + randint(-40, 40), inix + randint(-130, 130), inix + randint(-130, 130), inix + randint(-40, 40))
  61.     tab_posy = (dy2 + _Fs + randint(-15, 20), _y + randint(-100, 100), _y + randint(-110, 110), dy2 + randint(-15, 20))
  62.     maxi = int(tab_posy[0] - tab_posy[3]) + 90
  63.     pos_cur = Bezier3(maxi, tab_posx[0] + randint(-15, 15), tab_posy[0], tab_posx[3] + randint(-15, 15), tab_posy[3], tab_posx[1] + randint(-20, 20), tab_posy[1], tab_posx[2] + randint(-20, 20), tab_posy[2])
  64.     #buf = []
  65.     points = PixPoints(PIX_t)
  66.     pt_num = len(points)
  67.     for ii in range(pt_num//12):
  68.         i = randint(0, pt_num - 1)
  69.         w = points[i][0]
  70.         h = points[i][1]
  71.         idx = 4 * (h * PIX_t[1][0] + w)
  72.         x = dx2 + points[i][0]
  73.         y = dy2 + points[i][1]
  74.         indice = randint(0, maxi - 1)
  75.         x_fin = pos_cur[indice][0] + randint(-5, 5)
  76.         y_fin = pos_cur[indice][1] + randint(-5, 5)
  77.         bezier2Move(TCAS_BUF, 10 * (_start + _elapk), 10 * (_start + _elapk + randint(0, _k * 2 + 120)), x, y, x_fin, y_fin)
  78.     #TCAS_BUF.extend(tcas_parse(buf, 1280, 720, 23.976, 3))

  79.     ##### 将结果返回给tcax进行处理 #####
  80.     return (ASS_BUF, TCAS_BUF)

  81. def tcaxPy_User():
  82.     file_name = GetVal(val_OutFile) + '.tcas'
  83.     fx_width = GetVal(val_ResolutionX)
  84.     fx_height = GetVal(val_ResolutionY)
  85.     fx_fps = GetVal(val_FXFPS)
  86.     TCAS_FILE = CreateTcasFile(file_name, fx_width, fx_height, fx_fps)
  87.     # basic metrics
  88.     fontSize   = GetVal(val_FontSize)
  89.     marginX    = GetVal(val_OffsetX)
  90.     marginY    = GetVal(val_OffsetY)
  91.     spacing    = GetVal(val_Spacing)
  92.     lineNum    = GetVal(val_nLines)
  93.     textNum    = GetVal(val_nTexts)
  94.     start      = GetVal(val_BegTime)
  95.     end        = GetVal(val_EndTime)
  96.     kar        = GetVal(val_KarTime)
  97.     elapKar    = GetVal(val_KarTimeDiff)
  98.     text       = GetVal(val_Text)
  99.     textLength = GetVal(val_TextLength)
  100.     advance    = GetVal(val_TextAdvance)
  101.     advDiff    = GetVal(val_TextAdvanceDiff)
  102.     # main loop
  103.     for i in range(lineNum):
  104.         initPosX = marginX
  105.         initPosY = marginY
  106.         BIG_PIX = InitBigPix()
  107.         for j in range(textNum[i]):
  108.             if text[i][j] == '' or text[i][j] == ' ' or text[i][j] == ' ':
  109.                 continue
  110.             posX = initPosX + advDiff[i][j] + advance[i][j] / 2
  111.             posY = initPosY + fontSize / 2
  112.             foo_bar = 0     # 实际上想传什么样的参数, 完全由我们自己决定, 数量也不受限制
  113.             param = [BIG_PIX, foo_bar]
  114.             ASS_BUF, TCAS_BUF = tcaxPy_Main_Fake(i, j, textNum[i], start[i], end[i], elapKar[i][j], kar[i][j], posX, posY, advance[i][j], text[i][j], param)
  115.             WriteTcasFile(TCAS_FILE, TCAS_BUF)
  116.             Progress(i, j)
  117.         PIX_mask = ConvertBigPix(BIG_PIX)
  118.         num = textNum[i] + 6
  119.         PIX_i = ImagePix(abspath('flare1.png'), PIX_mask[1][0], PIX_mask[1][1])
  120.         for ii in range(num):
  121.             TCAS_BUF = []
  122.             PIX = PixPos(PIX_i, PIX_mask[0][0] + PIX_i[1][0] * (-0.5 + (ii + 1) / num), PIX_mask[0][1])
  123.             PIX = PixMask(PIX, PIX_mask)
  124.             PIX = PixColorMul(PIX, 1, 1, 1, sqrFactor(-0.5 + ii / num))
  125.             tcas_main(TCAS_BUF, PIX, start[i] * 10 - 6 * _FD + ii * _FD, start[i] * 10 - 6 * _FD + (ii + 1) * _FD, 0, 0, 1)
  126.             WriteTcasFile(TCAS_FILE, TCAS_BUF)
  127.             #progress(ii + 1, num)
  128.     FinTcasFile(TCAS_FILE)

  129. def sqrFactor(x):
  130.     return -4 * (x - 0.5) * (x + 0.5)

  131. def linearFactor(x):
  132.     if x < 0:
  133.         return 2 * x + 1
  134.     else:
  135.         return -2 * x + 1

  136. def a2rgb(PIX):
  137.     buf = list(PIX[2])
  138.     width = PIX[1][0]
  139.     height = PIX[1][1]
  140.     for h in range(height):
  141.         for w in range(width):
  142.             index = 4 * (h * width + w)
  143.             buf[index] = buf[index + 3]
  144.             buf[index + 1] = buf[index + 3]
  145.             buf[index + 2] = buf[index + 3]
  146.             buf[index + 3] = 255
  147.     return (PIX[0], PIX[1], tuple(buf))

  148. def bezier2Move(TCAS_BUF, ts, te, xs, ys, xe, ye):
  149.     xc = (xs + xe) // 2 + RandSign() * randint(20, 50)
  150.     yc = (ys + ye) // 2 + RandSign() * randint(10, 30)
  151.     num = int((te - ts) / _FD + 0.5) + 2
  152.     pos_cur = Bezier2(num, xs, ys, xe, ye, xc, yc)
  153.     for i in range(num):
  154.         rt = random()
  155.         PIX = PixColorMul(PixColorShift(PIX_img, 200, 0, 0, 0), 0.5 + rt, random(), 1 - rt, 0.5 + 0.5 * (num - i) / num)
  156.         tcas_keyframe(TCAS_BUF, PIX, PixColorMul(PIX, 1, 1, 1, 0), ts + i * _FD, ts + (i + randint(4, 12)) * _FD, pos_cur[i][0], pos_cur[i][1], 1, 0)
复制代码
1

查看全部评分

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-5-10 13:17:34 |显示全部楼层

Rank: 4

发表于 2012-5-10 14:16:03 |显示全部楼层
粒子系统挺碉堡的

Rank: 5Rank: 5

发表于 2012-5-11 21:22:21 |显示全部楼层
奶大,汝好强大...

Rank: 1

发表于 2012-7-14 19:59:26 |显示全部楼层
我完全的新手中的小白。看不懂啊,怎么办?

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-7-16 18:30:26 |显示全部楼层
anycall 发表于 2012-7-14 19:59
我完全的新手中的小白。看不懂啊,怎么办?

去看教程呗

Rank: 1

发表于 2013-8-6 22:19:48 |显示全部楼层
可惜預覽都沒掉了

Rank: 4

发表于 2017-3-7 15:59:57 |显示全部楼层
怎么用呢?
您需要登录后才可以回帖 登录 | 新人加入

GitHub|TCAX 主页

GMT+8, 2024-3-29 14:27

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部
RealH