-3

同じレイヤー上のエフェクトのキーフレーム値に基づいて数値を吐き出す AE エクスプレッションを作成しています。つまり、1 の場合、値は 100、2 の場合、値は 101、3 の場合、99 などです。

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 に「これ」または「あれ」と絶対的に等しいと伝えると、「すべて」とも等しいと想定されるだけです。ああ。

4

2 に答える 2

0

他に使用できる 2 つの方法を次に示します。このコードはさらに圧縮できますが、読みやすくするために広げたままにしています。

短いリストの場合、スイッチ/ケースを使用して、複数のオプションで同じコードを実行できます。そのようです:

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;

連続するグループを条件付きステートメントに入れると、一致が既に見つかっている場合にそれらの配列を反復処理しないため、パフォーマンスがわずかに向上します。効率のために、最初に最も長い数字のリストの内容に対してテストするのが理にかなっています。これは、一致する可能性が高いためです。

これらのソリューションはそれほどコンパクトではないかもしれませんが、確実に拡張可能です。

于 2015-02-04T20:52:14.667 に答える
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' を書きました]

于 2013-12-23T19:08:45.437 に答える