2012年2月15日星期三

TJS教學---switch statements,switch 陳述式

(k ゚∀゚)<上一次介紹了if 陳述式,switch 陳述式是另一個方式來決定要執行哪一個陳述句,不過不同的是,它只是比較變數是否等於某數值或字串,並不能進行小於或大於等比較,以下是switch 陳述式的用法。

switch(變數或運算式){
    case 數值1:
        陳述句1;
        break;
    case 數值2:
        陳述句2;
        break;
    case 數值3:
        陳述句3;
        break;
    default:
        陳述句4;
}

為什麼switch裡面是個變數或運算式,而不是條件式?>( ゚ω゚ s)

(k ゚∀゚)<這是好問題,if和switch其中一個不同之處是,if是利用條件式傳回來的值,即是true或false,從而是否執行下一句陳述句,而switch則是取得變數的值後,再跟下列的case的數值作比對,當兩者的值是相同的話,就會跳到這個位置並執行之後的陳述句,直到遇到break後才離開switch。

如果找不到相同的數值會怎麼樣?>( ゚ω゚ s)

(k ゚∀゚)<當沒有任何數值是符合的話,程式會跳到default並執行之後的陳述句,但default是可以省略的,如果沒有default的話,程式會跳出switch的範圍。

(k ゚∀゚)<還有留意一下case最後是冒號,並不是分號。

(k ゚∀゚)<先看看以下的範例。

var choice=System.inputString("","請輸入您的選擇(A,B,C或D)","");

switch(choice){
    case "A":
        System.inform("答案錯誤");
        break;
    case "B":
        System.inform("答案錯誤");
        break;
    case "C":
        System.inform("答案正確");
        break;
    case "D":
        System.inform("答案錯誤");
        break;
    default:
        System.inform("輸入的值不正確");
}

(k ゚∀゚)<當我們輸入"A"、"B"、"C"或"D"時,吉里吉里會比對每個case的值,當兩者的值是相同的話,就會執行之後的陳述句,若果輸入其他的值,如"N"、"a"或12等,由於吉里吉里找不到任何符合的值,它就會執行default之後的陳述句。

原來如此!>( ゚ω゚ s)

話說回來,你說如果case的值符合的話,就會執行之後的陳述句,直到遇到break後才離開switch,那麼我不寫break的話會發生什麼事?>( ゚ω゚ s)

(k ゚∀゚)<嗯,由於沒遇到break,吉里吉里會繼續執行以下的陳述句,看看以下的範例。

var choice=2;

switch(choice){
    case 1:
        System.inform("陳述句1");
    case 2:
        System.inform("陳述句2");
    case 3:
        System.inform("陳述句3");
    case 4:
        System.inform("陳述句4");
}

(k ゚∀゚)<若果執行以上的範例,我們將會看到什麼?

顯示"陳述句2"?>( ゚ω゚ s)

(k ゚∀゚)<除了顯示"陳述句2"之外,由於沒有break,所以還會顯示"陳述句3"和"陳述句4"。

(k ゚∀゚)<這是新手有時會犯錯的地方,因忘記放上break,所以出現一些非預期的結果,但有時候亦可以利用這特性來處理某些情況,看看以下的範例。

var month=System.inputString("","請輸入月份","");
var day;

switch(month){
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        day=31;
  break;
    case 4:
    case 6:
    case 9:
    case 11:
        day=30;
  break;
    case 2:
        day=28;
  break;
}

System.inform(month+"月的日數是"+day);

(k ゚∀゚)<在上述的範例裡,當月份是1、3、5、7、8、10、12時,就會把day指定為31,當月份是4、6、9、11時,就會把day指定為30,當月份是2時,就會把day指定為28。

(k ゚∀゚)<適當地使用switch可以增加可讀性,令程式容易理解和管理,不過switch無法處理一些複雜的情況,或者是進行小於或大於等比較,這時就需要使用到if。

(k ゚∀゚)<今次就介紹到這裡吧,下次再見。

5 則留言:

  1. 你好
    抱歉打擾一下
    我想問如果我想角色用特效(Wave等等}
    如何不影響到背景
    每次用Wave的時候
    人物背影等等都會一起動

    還有人物轉換動作時
    怎樣才會不變得'生硬'?
    感謝

    回覆刪除
    回覆
    1. 還有如何只令人物震盪(quake)

      刪除
    2. 之前曾經我提及過[trans]有layer這個屬性,
      這可以切換指定的圖層,
      但使用起來是十分困難,
      因為切換時有可能會有非預期的效果。

      而quake只能對畫面進行搖晃而並非針對圖層,
      所以無法指定某圖層進行搖晃的。

      刪除
    3. 謝謝回答
      那人物表情轉換
      更自然
      (就是不要舜間轉掉,有0.幾秒的時間緩衝)
      因為人物突然跳出來這點和表情動作轉太快
      影響了觀感

      刪除
    4. 基本上用[trans]來切換就可以控制切換時間和效果,
      令人物轉換時不會太突然。

      刪除