2013-12-20 61 views
-2

我正在寫一個AE表達式,它會基於同一圖層上的效果的關鍵幀值吐出一個數字。也就是說,如果是1,值是100,如果是2,值是101,如果是3,99,等等。這是我已經得到了工作內容:After Effects:如果變量的返回值等於一組數字的一部分

x = effect("Mouth")("Slider"); 

if (x == 7 || x == 11 || x == 16) { 
103 
} else if (x == 6 || x == 10 || x == 15 || x == 25 || x == 26){ 
102 
} else if (x == 5 || x == 9 || x == 12 || x == 14 || x == 19 || x == 24 || x == 27 || x == 28){ 
101 
} else { 
100 
} 

當然還有一個更優雅的方式做這個?我試過寫它

if (x == 7 || 11 || 16) 

但告訴After Effects X絕對等於「這個」或「那個」只是讓它認爲它也等於「一切」。哎呀。

回答

0

這是一個有點怪異(可以說是優雅?),但如果你只是尋找的東西更緊湊,你可以這樣做:

x = effect("Mouth")("Slider"); 

if (",7,11,16,".indexOf(","+x+",") != -1) { 
103 
} else if (",6,10,15,25,26,".indexOf(","+x+",") != -1) { 
102 
} else if (",5,9,12,14,19,24,27,28,".indexOf(","+x+",") != -1) { 
101 
} else { 
100 
} 

但不要忘了,在兩端的逗號!

我想過使用ECMA的array.indexOf(x),但它在AE的JS表達式中不受支持。 [編輯:錯寫了'offsetOf']

0

以下是另外兩種可以使用的方法。您可以更多地壓縮此代碼,但爲了便於閱讀,我將其展開。

對於較短的列表,您可以使用開關/外殼並使多個選項執行相同的代碼。像這樣:

thingToTest = effect("Mouth")("Slider"); 

switch (thingToTest) { 
    case 7: 
    case 11: 
    case 16: 
     result = 103; 
     break; 
    case 6: 
    case 10: 
    case 15: 
    case 25: 
    case 26: 
     result = 102; 
     break; 
    case 5: 
    case 9: 
    case 12: 
    case 14: 
    case 19: 
    case 24: 
    case 27: 
    case 28: 
     result = 101; 
     break; 
    default: 
     result = 100; 
     break; 
} 

問題是,如果您有很多可能的結果來檢查,可能會變得相當笨拙。在這種情況下,我會讓每個結果案例的值都是一個數組並循環遍歷它們。

thingToTest = effect("Mouth")("Slider"); 

mySet1 = [7, 11, 16]; 
mySet2 = [6, 10, 15, 25, 26]; 
mySet3 = [5, 9, 12, 14, 19, 24, 27, 28]; 

result = 100; // Default 

foundIt = 0; 

for (i = 0; i < mySet1.length; i++) { 
    if (mySet1[i] == thingToTest) { 
     result = 103; 
     foundIt = 1; 
     break; 
    } 
} 

if(foundIt) { 
    for (i = 0; i < mySet2.length; i++) { 
     if (mySet2[i] == thingToTest) { 
      result = 102; 
      foundIt = 1; 
      break; 
     } 
    } 
} 

if(foundIt) { 
    for (i = 0; i < mySet3.length; i++) { 
     if (mySet3[i] == thingToTest) { 
      result = 101; 
      foundIt = 1; 
      break; 
     } 
    } 
} 

result; 

將連續組置於條件語句中,如果已經找到匹配,則不通過這些數組迭代來提高性能。爲了提高效率,首先測試最長的數字列表的內容是有意義的,因爲它更有可能包含匹配。

這些解決方案可能不盡如此緊湊,但絕對可擴展。

相關問題