2011年10月16日星期日

KAG教學---巨集,Macro

(k ゚∀゚)<今次為大家介紹的是巨集(Macro),對於簡化內容是一個超重要的東西之一。

(k ゚∀゚)<巨集(Macro)可以把多個tag標籤結合成一個,可以簡化了一些經常重複某一功能或某一段部分的內容。

那麼跟之前介紹的副程式(Subroutine)有什麼分別?這兩個看起來好像一樣。>( ゚ω゚ s)

(k ゚∀゚)<在吉里吉里裡,兩者的差別頗大,副程式(Subroutine)一般用在內容較長的情況,而巨集(Macro)經常是用於整合多個tag標籤,一般情況下,其行數也會相對地較少。

(k ゚∀゚)<除此之外, 吉里吉里的巨集可以用來定義新的tag標籤,所以我們可以透過巨集改善劇本的可讀性。

(k ゚∀゚)<當我們定義一個新的巨集時,可使用[macro]和[endmacro],並且把巨集的內容寫在[macro]和[endmacro]之間,以下是範例。

;巨集定義
[macro name="newtag"]
[font color=0xFF0000]
顯示紅色的文字
[resetfont]
[endmacro]

(k ゚∀゚)<我們可以使用name這屬性來設定巨集的名稱,而呼叫巨集時我們直接寫上巨集的名稱,以下是範例。

;巨集定義
[macro name="newtag"]
[font color=0xFF0000]
顯示紅色的文字
[resetfont]
[endmacro]
;呼叫巨集
[newtag]


















原來那麼容易就可以製作自己的tag標籤,不過有辦法在新定義的tag標籤加入屬性嗎?>( ゚ω゚ s)

(k ゚∀゚)<當然可以,看看以下的範例。

;巨集定義
[macro name="newtag"]
[font color=%newcolor]
顯示紅色的文字
[resetfont]
[endmacro]
;呼叫巨集
[newtag newcolor=0x00FF00]


















(k ゚∀゚)<在上述的範例裡,我們定義巨集時加入了一個newcolor的屬性,而當在巨集裡使用到這屬性內的數值時,我們可以在寫上"%屬性名稱",要留意屬性名稱必須是小寫,當我們使用這巨集時,必須一同寫上其屬性。

必須要寫上這個屬性嗎?吉里吉里不是有很多tag標籤的屬性,本身就有預設值嗎?>( ゚ω゚ s)

(k ゚∀゚)<我們的確可以直接給予預設值,看看以下的範例。

;巨集定義
[macro name="newtag"]
[font color=%newcolor|0xFF0000]
顯示紅色的文字
[resetfont]
[endmacro]
;呼叫巨集
[newtag newcolor=0x00FF00]
[r]
[newtag]


















(k ゚∀゚)<在上述的範例裡,巨集裡屬性數值的旁邊加上了預設值,並且在兩者之間加上豎線(|)這個符號,當我們使用時忽略了這屬性,吉里吉里就會使用到預設值。

但是在上述的範例裡,若果我想將所有[font]的屬性加入到巨集,豈不是很複雜嗎?>( ゚ω゚ s)

(k ゚∀゚)<若果我們需要把另一個tag標籤的所有屬性加入到巨集,有一個十分簡單的方法,看看以下的範例。

;巨集定義
[macro name="newtag"]
[font *]
顯示紅色的文字
[resetfont]
[endmacro]
;呼叫巨集
[newtag color=0xFF0000 size=40]


















(k ゚∀゚)<只要在tag標籤上加上星號(*),吉里吉里就會把這tag標籤的所有屬性加入到巨集,減省不少編寫的工序。

(k ゚∀゚)<若果我們能夠有效地使用巨集,除了增加劇本可讀性,甚至可以把編劇和程式分離出來,程式員把複雜的程式寫在巨集裡,編劇只要知道巨集名稱和其屬性,簡單地寫上一句就可以使用,不用理解裡面的是如何運作,亦不論裡面的是KAG還是TJS,編劇也能簡單地使用。

(k ゚∀゚)<而所有自定的巨集建議寫在劇本的一開始,例如寫在first.ks裡。

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

9 則留言:

  1. 其實我想做個macro標題
    [macro name=T]
    [title name=XXX Y]
    [endmacro]
    不過XXX是固定標題,則Y是隨著劇情而換的標題
    所以呢,我打了XXX的標題后,應該怎麽放Y的代碼?

    回覆刪除
    回覆
    1. 這就要看您這個Y是如何決定的,
      例如,如果我想T有一個屬性name來輸入Y這個標題,
      我可以這樣寫,
      [macro name=T]
      [title name=&("XXX-"+mp.name)]
      [endmacro]
      若果是利用label名稱來Y決定這個標題,
      我可以這樣寫,
      [macro name=T]
      [title name=&("XXX-"+kag.pcflags.currentPageName)]
      [endmacro]
      所以這完全取決於您這個Y是如何決定的。

      刪除
    2. label的該如何使用呢?
      我的是這樣的,然後出錯誤了
      (字符串常数/正则表达式/八进制值未完结时到达了脚本终端)

      *www|Testing
      [t]
      難道不能直接放入T麽?

      然後關於mp.name這該如何使用?
      [T name=Y]麽?

      刪除
    3. label的用法沒有錯,好像以下的模樣,

      [macro name=T]
      [title name=&("XXX-"+kag.pcflags.currentPageName)]
      [endmacro]
      *www|Testing
      [T]

      留意這種方法裡,XXX這字串不能有空格。
      至於有屬性name的例子,用法並沒有錯。

      刪除
    4. 成功了~~>w<

      不過沒的空格真傷心>_<
      大大是否可以介紹空格的代碼呢?沒的話就不用緊了

      刪除
    5. 不能有空格主要是&這玩意不能有空格,
      所以迴避方法十分簡單,
      把連接的部分移到其他地方做就行了,
      就好像以下的模樣。

      [macro name=T]
      [eval exp="tf.tilte='XXX '+kag.pcflags.currentPageName"]
      [title name=&tf.tilte]
      [endmacro]

      *test|Testing
      [T]

      刪除
    6. 哦哦哦大大我已經不知道要該如何膜拜你了!什麽樣的代碼都會(跪了……
      謝謝大大~!!

      刪除
  2. @macro name=C
    [cm]
    [locate x=-100 y=-280]
    [button graphic="choose" target=%ch enterse="se1" clickse="se2"]
    [eval exp="drawButtonCaption(kag.fore.messages[0].links[0].object, '(填要顯示的字)', 24)"]
    @endmacro

    類似之前的問題,只是呢,如何把mp.name放進“(填要顯示的字)”?

    回覆刪除
    回覆
    1. 直接把“(填要顯示的字)”取代為mp.name就可以,
      即是以下的模樣,
      [eval exp="drawButtonCaption(kag.fore.messages[0].links[0].object, mp.name, 24)"]

      刪除