面向AE編程之生成隨機(jī)十六進(jìn)制數(shù)字塊

心血來潮,想發(fā)一點(diǎn)教程。
眾所周知,AE表達(dá)式提供了非常強(qiáng)大的功能,幾乎任何帶秒表圖標(biāo)的屬性都可以插入表達(dá)式進(jìn)行控制,只需通過按住alt鍵點(diǎn)擊秒表圖標(biāo)即可。這個(gè)系列主要是關(guān)于個(gè)人AE表達(dá)式的一些心得,主要面向初心者,希望能起到拋磚引玉的作用,讓更多人了解AE表達(dá)式。本人沒有系統(tǒng)學(xué)過javascript,如有錯(cuò)誤敬請(qǐng)指出。
(以上為廢話)
AE的文本圖層,有一個(gè)源文本屬性,不僅可以通過關(guān)鍵幀設(shè)置不同時(shí)刻的文字內(nèi)容(可以用這個(gè)功能打軸),還能通過代碼來生成文本。
于是我們可以輸入以下代碼:

這樣就能實(shí)現(xiàn)這一功能了。本教程在這一刻就可以結(jié)束了。
然而僅僅只會(huì)復(fù)制表達(dá)式是不夠的,需要了解其中的原理,才能充分發(fā)揮表達(dá)式的威力。
第一行的seedRandom函數(shù),它的作用是用第一個(gè)參數(shù),為之后的所有隨機(jī)函數(shù)設(shè)置隨機(jī)種子。隨機(jī)種子就是計(jì)算機(jī)生成隨機(jī)數(shù)的依據(jù)。玩MC的同學(xué)應(yīng)該知道生成地圖時(shí)所用的種子,假如你輸入的種子是一樣的,那生成的地圖也是一模一樣的。
那為什么要添加這一行呢?首先,AE在每一幀,都會(huì)重新運(yùn)行一次表達(dá)式,如果不設(shè)置隨機(jī)種子,AE默認(rèn)每一幀都會(huì)生成不同的隨機(jī)種子。文本框內(nèi)的數(shù)字每一幀都會(huì)刷新,對(duì)視力無疑是極大的傷害。于是,我們需要隔幾幀再刷新一次。
要實(shí)現(xiàn)這個(gè)功能,需要用到時(shí)間(time)和取整(Math.floor)函數(shù)。
time輸出的是小數(shù),它等于從合成開始到當(dāng)前時(shí)間所經(jīng)過的秒數(shù)。

Math.floor函數(shù)是向下取整。這樣Math.floor(time)輸出的就是不帶小數(shù)的秒數(shù),它的值每過1秒才會(huì)改變。

源文本屬性輸入Math.floor(time)的結(jié)果
順帶一提,ae的表達(dá)式輸入框左邊有一個(gè)小箭頭,里面有很多常用的函數(shù)和屬性。點(diǎn)擊一下就能顯示在文本框中,這樣就不用手打所有的函數(shù)名了。

于是我們可以通過將time乘20,這樣Math.floor(time*20)的值每1/20秒改變一次,將這個(gè)參數(shù)傳入seedRandom函數(shù),這樣之后生成的隨機(jī)數(shù)每過1/20秒才會(huì)改變。
(當(dāng)然也可以用色調(diào)分離時(shí)間設(shè)置圖層幀率為20幀)
seedRandom函數(shù)還有第二個(gè)參數(shù),它只能取真(true)或假(false)。如果取true,則每過一幀都會(huì)設(shè)定新的隨機(jī)種子;如果為false,則隨機(jī)種子的取值只由第一個(gè)參數(shù)決定,不受時(shí)間影響。這里顯然要設(shè)置為false。
這一行代碼可以用來設(shè)置隨機(jī)數(shù)改變的頻率,應(yīng)用次數(shù)非常高,有必要的話請(qǐng)務(wù)必記下。
接下來便是代碼的核心部分。首先看循環(huán)內(nèi)部的這一行代碼:
mytext變量內(nèi),存儲(chǔ)的是將要顯示的文本內(nèi)容。+=符號(hào)表示的是,每過一個(gè)循環(huán),就將符號(hào)右側(cè)的內(nèi)容拼接到mytext內(nèi)容的末尾。
array[Math.floor(random(16))]可能看起來比較抽象,但我們可以從內(nèi)而外一層一層地來看。
random函數(shù)是ae自帶的一個(gè)產(chǎn)生隨機(jī)數(shù)的函數(shù),random(16)可以產(chǎn)生0-16范圍內(nèi)(大于0,小于16)的隨機(jī)小數(shù)。然后經(jīng)過向下取整,就能得到0-15范圍內(nèi)的隨機(jī)整數(shù)了。
array是在開頭定義的一個(gè)字符串,內(nèi)容是"0123456789ABCDEF"。對(duì)于字符串變量,在后面添加方括號(hào),方括號(hào)內(nèi)的數(shù)值就表示取第幾個(gè)字符。要注意,序號(hào)是從0開始數(shù)的。比如array[0]="0",array[4]="4",array[15]="F"。
將0-15范圍內(nèi)的隨機(jī)數(shù)傳入中括號(hào),就能在array內(nèi)隨機(jī)取一個(gè)字符。連續(xù)取兩個(gè)字符,再拼接一個(gè)‘ ’(表示空格),這就是每次循環(huán)所做的事情。
內(nèi)側(cè)的循環(huán)打印每一行,內(nèi)側(cè)循環(huán)結(jié)束后打印換行符,從下一行開始。如此當(dāng)外側(cè)的循環(huán)也結(jié)束后,就得到了一個(gè)隨機(jī)的十六進(jìn)制數(shù)字陣列。最后的text.sourceText=mytext,就能將變量內(nèi)的值顯示出來,這樣就大功告成了。

最后提一嘴,ae內(nèi)的表達(dá)式雖然與javascript有很高的相似性,但還是有一些不同之處,比如變量在初始化時(shí)不需要聲明var或let(可能會(huì)造成求值錯(cuò)誤,所以不推薦),一些函數(shù)的用法也有細(xì)微的差別??梢圆殚唄ttps://helpx.adobe.com/cn/after-effects/using/expression-language-reference.html了解更多函數(shù)的用法。
以上。