之前弄过一个文字滚动的效果,时间久远,都不记得当时怎么弄的了。感谢曾能鼎同学提出来这个方法有bug,所以重新尝试下这个效果。
新建文字层,命名为sourceText,关掉显示,给Source Text添加:
"文 字 滚 动 效 果"
(每个字之间有空格)
再次新建文字层,命名为“text”,给Source Text添加表达式:
t = thisComp.layer("sourceText").text.sourceText; s = t.split(" ");
这是调取"文 字 滚 动 效 果",然后以空格为依据将其分解,并组成数列[“文”、“字”、“滚”、“动”、“效”、“果”]
我们知道,在这个数列中,“文”的索引是0,“字”的索引是1, …… ,“果”的索引是5 。
利用数列调取的方法,可以知道,s[0]为“文”, s[1]为“字” , …… ,s[5]为“果” 。
引入一个变量n,如果n能够在0~5之间循环,那么s[n]就可以实现从“文”到“果”的滚动了。
怎样实现呢?
可以利用求余运算,% 。
n = Math.floor(time)%s.length
AE里的时间有小数点后的值,这里须用数字作为索引,所以先要用“Math.floor()”取整,然后调取数列s的长度,这个例子里,数列里有6个值,长度为6。这样就可以得到0~5的循环,s[n]就是从数列中第一个值开始,往后依次调取,并以此循环。
加快变化的速度,需要在time后乘以一个数。为方便控制,给名为“sourceText”的文字层添加一个slider control,并命名为freq,将上面表达式改为:
freq = thisComp.layer("sourceText").effect("freq")("Slider"); t = thisComp.layer("sourceText").text.sourceText; s = t.split(" "); n = Math.floor(time*freq)%s.length; s[n]
freq暂时设为4 。
再增加一个滑块控制,命名为spacrY,给文字层“text”的y轴添加表达式:
spaceY = thisComp.layer("sourceText").effect("spaceY")("Slider"); x = transform.position[0]; y = transform.position[1] - spaceY*index; [x,y]
spaceY暂时设为8 。
command/ctrl + D 复制“text”,得到这样效果:
所有层都是从s[0]开始,往后循环,这并不是我们要的效果。
我们希望的是复制出来的层能够错开,也就是:
一层从0开始:0、1、2、3、4、5
一层从1开始:1、2、3、4、5、0
一层从2开始:2、3、4、5、0、1
…………
依此类推。
那么怎么才能实现呢?
让每次复制出来的层有变化,就需要调取图层的索引,也就是加入index
如果给n加上index,就能够产生变化。但是我们发现,索引为2的层,数列的循环索引变成了:
2、3、4、5、6、7、2、3、4、5、6、7、2、3……
然而我们这个例子里,数列只有6个值,索引最多到5,当取值到s[6]、s[7]的时候AE就会报错,因为数列里并不存在索引为6或7的值。(这也是之前老办法的bug所在)
修正到方法就是加上一个条件判断:
j = n + index; if(j <= s.length -1){ f = j; }else{ f = j - s.length; } s[f]
也就是超过5的时候减去6,这样索引循环变成了:
2、3、4、5、6-6=0、7-6=1、2、3、4、5、6-6=0、7-6=1、2、3……
也就是变成了从2开始的0~5的循环。
index为3的时候,就成了:
3、4、5、6-6=0、7-6=1、8-6=2、3、4、5、6-6=0、7-6=1、8-6=2、3……
也就是从3开始的0~5的循环。
复制图层,就得到每复制一层,刚好错开一个字的效果。
这里还有一个问题,当复制图层过多,index超过数列长度的时候,也会报错,所以index值在这里也要有循环,还是利用求余运算:
freq = thisComp.layer("sourceText").effect("freq")("Slider"); t = thisComp.layer("sourceText").text.sourceText; s = t.split(" "); n = Math.floor(time*freq)%s.length; j = n + index%s.length; if(j <= s.length -1){ f = j; }else{ f = j - s.length; } s[f]
也就是复制出来的图层:
index为6时,j = n + 0;
index为7时,j = n + 1;
index为8时,j = n + 2;
index为9时,j = n + 3;
index为10时,j = n + 4;
……
形成循环。
这样,无论复制多少层,都是没有问题的。
截取其中一帧可以看到,图层之间,刚好错开一个字:
这样,实现了横向的滚动,以及纵向的滚动。
替换掉文字,就能得到本文开头位置“效果预览”里的效果了。
复杂到头晕..
s = t.split("\r");之前滚动教程中用的"\r" 表示依据换行符分割字符串储存为阵列单位。键入这个表达式以后。把文本对象替换成了带换行的文本。但是程序提示表达式错误。试了很久也不知道是哪里出错。想请教一下博主。
@1585888313528: 你试一下 \n 或者 〈br/〉( “〈”和“〉”改成英文)。新版的AE表达式引擎变了,这片文章中的表达式在新版ae中也报错,暂时未找到原因。