2012年9月5日星期三

KAG內部教學(進階篇)---Auto and Skip

(建議在閱讀本篇教學之前,請先閱讀KAG教學---flag,變數(1)TJS教學---function,函式(1))

(k ゚∀゚)<今次講解一下一個AVG類遊戲常見的功能Auto跟Skip,雖然吉里吉里功能列上有Auto跟Skip,不過相信大家不太喜歡缺乏美觀的玩意。

嗯,平常見到的遊戲都是對話框旁邊附有Auto跟Skip的按鈕,的確不太想用功能列上的功能。>( ゚ω゚ s)

(k ゚∀゚)<所以今次就說一下如何使用Auto跟Skip的功能,雖然KAG沒有任何tag去直接使用Auto跟Skip的功能,不過可以利用MainWindow.tjs裡定義的函式去使用它們。

(k ゚∀゚)<我們先講Auto功能,Auto功能的函式主要有enterAutoMode()跟cancelAutoMode(),正如字面上的意義,它們是用來進入和離開Auto模式。

那該怎樣做才可以使用它們。>( ゚ω゚ s)

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

按一下啟動Auto模式[l][r]
[eval exp="kag.enterAutoMode()"]
第一行[l][r]
第二行[l][r]
第三行[l][r]
關閉Auto模式
[eval exp="kag.cancelAutoMode()"]
[l][r]
第一行[l][r]
第二行[l][r]
第三行

(k ゚∀゚)<由於是用TJS寫的函式,KAG裡可以利用exp屬性來執行它們,執行enterAutoMode()時吉里吉里就會啟動Auto模式,當執行cancelAutoMode()時則離開Auto模式。

不過我有時候想播放OP或ED等影片,要強制離開Auto模式,但又不知玩家是否進行Auto模式,那麼這時執行cancelAutoMode()會不會有問題?>( ゚ω゚ s)

(k ゚∀゚)<不會啦,就算不是在Auto模式下執行cancelAutoMode()也沒有任何問題,不過若果大家想知道玩家是否進行了Auto模式,可以透過autoMode這變數來判斷,當autoMode的值為true時,代表正在進行Auto模式,看看以下的範例。

按一下啟動Auto模式[l][r]
[eval exp="kag.enterAutoMode()"]
autoMode的值為
[emb exp="kag.autoMode"]
[l][r]
關閉Auto模式
[eval exp="kag.cancelAutoMode()"]
[l][r]
autoMode的值為
[emb exp="kag.autoMode"]

我有問題,若果我將autoMode設定為true,吉里吉里會不會啟動Auto模式?>( ゚ω゚ s)

(k ゚∀゚)<答案是會的,不過絕對不建議這樣做,因為enterAutoMode()跟cancelAutoMode()除了將autoMode的值改變之外,還進行其他東西,所以Auto功能請用enterAutoMode()跟cancelAutoMode()。

一說到Auto模式,有時候有些遊戲可以由玩家設定Auto模式的顯示速度,那如何在吉里吉里上設定它?>( ゚ω゚ s)

(k ゚∀゚)<在功能列上,吉里吉里提供了五種Auto模式的顯示速度給玩家選擇,它們可以透過Config.tjs裡autoModeLineWaits跟autoModePageWaits來設定換行跟換頁所等待時間,其單位為毫秒。

但我可不想玩家用功能列來設定,我想自行製作一個設定介面給玩家,有沒有辦法做到?>( ゚ω゚ s)

(k ゚∀゚)<其實Auto模式的顯示速度可以直接透過autoModeLineWait跟autoModePageWait來設定,留意它們跟Config.tjs裡autoModeLineWaits跟autoModePageWaits不同的,autoModeLineWait跟autoModePageWait是直接修改換行跟換頁所等待時間,autoModeLineWaits跟autoModePageWaits則是設定功能列上所給予這五種顯示速度的值。

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

按一下啟動Auto模式[l][r]
[eval exp="kag.enterAutoMode()"]
[eval exp="kag.autoModeLineWait=200"]
[eval exp="kag.autoModePageWait=500"]
現在換行所等待時間為0.2秒[r]
換行跟換頁所等待時間則為0.5秒[p][cm]
第一行[l][r]
第二行[l][r]
第三行[p][cm]
[eval exp="kag.autoModeLineWait=1000"]
[eval exp="kag.autoModePageWait=2500"]
現在換行所等待時間為1秒[r]
換行跟換頁所等待時間則為2.5秒[p][cm]
第一行[l][r]
第二行[l][r]
第三行[p][cm]
關閉Auto模式
[eval exp="kag.cancelAutoMode()"]

(k ゚∀゚)<在上述的範例裡,我們利用autoModeLineWait跟autoModePageWait來設定所等待時間,而其值將會儲存到datasc.ksd裡,以便開啟遊戲時進行初始化。

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

(k ゚∀゚)<我們再講Skip功能,KAG預設了五種模式,並利用skipMode這變數來決定現在是哪個模式,skipMode的值由0至4,分別代表不同模式。

(k ゚∀゚)<當skipMode為0,代表停止Skip模式,我們可以利用cancelSkip()來停止Skip模式,cancelSkip()會將skipMode重新設定為0。

(k ゚∀゚)<當skipMode為1,代表執行Skip模式,直到要遇到等待滑鼠點擊的位置,例如是[l]或[p]等,就會停止Skip模式,我們可以利用skipToClick()來進入這個Skip模式。

有什麼時候會使用到它?>( ゚ω゚ s)

(k ゚∀゚)<這個雖然我們甚少在製作Skip功能時使用,不過倒是經常看得到它的存在。

嗯?有嗎?我好像沒看過……>( ゚ω゚ s)

(k ゚∀゚)<在文字顯示途中如果我們按下滑鼠,文字就會立即全部顯示,這其實是使用了skipToClick()。

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

(k ゚∀゚)<當skipMode為2,代表執行Skip模式,直到要遇到等待換頁的位置,就會停止Skip模式,我們可以利用skipToPage()來進入這個Skip模式。不過實際上沒什麼機會使用到……

(k ゚∀゚)<當skipMode為3,代表執行Skip模式,直到要遇到未讀的部分或[s]等,才會停止Skip模式,我們可以利用skipToStop()來進入這個Skip模式,功能列上的「次の選択肢/未読まで進む」選項就會用這功能。

啊呀!這就是我想要的確東西!!>( ゚ω゚ s)

(k ゚∀゚)<嗯,這就是一般在遊戲裡看到的Skip功能,但所謂的未讀部分,其實是利用label標籤來判斷,當遇到從未通過label標籤,就會停止Skip模式。

(k ゚∀゚)<當skipMode為4,代表執行Skip模式,如果按住鍵盤上Skip相關的鍵,例如Enter或Space鍵,就會繼續Skip模式,我們可以利用skipToStop2()來進入這個Skip模式。

(k ゚∀゚)<同樣地,不太建議直接修改skipMode變數來設定Skip模式,盡可能用函式來設定Skip模式。

(k ゚∀゚)<以下是綜合上述內容的列表,大家可以參考一下。

skipMode的值效果 離開條件函式
0停止Skip模式cancelSkip()
1進入Skip模式等待滑鼠點擊的位置,如[l]或[p]等skipToClick()
2進入Skip模式等待換頁的位置,例如[p]等skipToPage()
3進入Skip模式未讀的部分或[s]等skipToStop()
4進入Skip模式不按住鍵盤上Skip相關的鍵skipToStop2()

(k ゚∀゚)<以下是實際應用的範例。

按一下啟動Skip模式[l][r]
[eval exp="kag.skipToStop()"]
第一行[l][r]
第二行[l][r]
第三行[l][r]
關閉Skip模式
[eval exp="kag.cancelSkip()"]
[l][r]
第一行[l][r]
第二行[l][r]
第三行

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

3 則留言:

  1. 意外收穫GET!!
    感謝更新~!(ノ≧∀≦)ノ
    剛好解決了OPED的問題。
    另,要讓玩家通了一條綫后才能skipOP/ED
    就用:
    [if exp="sf.Item<10"]
    [eval exp="kag.cancelSkip()"]
    [eval exp="kag.cancelAutoMode()"]
    [else]
    [eval exp="kag.skipToStop()"]
    [endif]
    是這樣嗎?

    回覆刪除
    回覆
    1. 其實不用動用到那些函式,
      [wv]有一個屬性叫canskip,
      可以設定[wv]可否被略過,
      若果是true,當玩家點擊滑鼠時,不會等待影片播放完就結束。

      刪除
  2. 您好,請問能演示一下
    “在文字顯示途中如果我們按下滑鼠,文字就會立即全部顯示,這其實是使用了skipToClick()”
    嗎?
    還有,請問kirikiri能做到設間斷點並且逐條指令地調試嗎?

    回覆刪除