tag:blogger.com,1999:blog-73027660910839050802024-03-20T03:49:16.589+08:00NOCBOL ~本店營業中~kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.comBlogger99125tag:blogger.com,1999:blog-7302766091083905080.post-52309358684131782422012-12-10T05:18:00.000+08:002012-12-10T05:18:40.772+08:00KAG內部教學(進階篇)---Yes/No Dialog(1)<a name='more'></a><b>(建議在閱讀本篇教學之前,請先閱讀</b><a href="http://kibitz2550.blogspot.com/2011/08/kag-flag1.html">KAG教學---flag,變數(1)</a><b>、</b><a href="http://kibitz2550.blogspot.hk/2012/07/tjs-function1.html">TJS教學---function,函式(1)</a><b>)</b> <br />
<br />
(k ゚∀゚)<當我們嘗試在吉里吉里上執行讀檔或存檔時,吉里吉里顯示確認視窗來問是否真的想讀檔或存檔,這可以避免誤觸某些功能。然而,我們在某些情況下也想顯示一個確認視窗來確認玩家是否真的執行下去,我們可以用askYesNo()來進行詢問。<br />
<br />
那個askYesNo()是什麼來的,是KAG裡的玩意?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<askYesNo()是在system資料夾的YesNoDialog.tjs檔案裡定義出來的,以下是使用askYesNo()的範例。<br />
<br />
<pre class="sampletable">[eval exp="askYesNo('您是否想繼續執行下去','確認')"]
</pre><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYj_77JjjKBXHFeffIwGjnmJfgTXh2tQEZyJB4kJ0ovus0lZ56wYtvPf28h6cN57nTmFoypAjd6DjvAwZk8rlAvoqwQTrGYkUHF8Vop139RXIOaQaoYdwvqqfUmD59I6eZjzUWzmI3rtvu/s1600/krkr_ch61_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYj_77JjjKBXHFeffIwGjnmJfgTXh2tQEZyJB4kJ0ovus0lZ56wYtvPf28h6cN57nTmFoypAjd6DjvAwZk8rlAvoqwQTrGYkUHF8Vop139RXIOaQaoYdwvqqfUmD59I6eZjzUWzmI3rtvu/s1600/krkr_ch61_1.png" /></a></div><br />
<br />
(k ゚∀゚)<askYesNo()可以指定兩個引數,第一個是指定確認視窗上顯示的文字,第二個是指定確認視窗上的標題,如果不指定第二個引數,預設是顯示「確認」。<br />
<br />
(k ゚∀゚)<由於吉里吉里的確認視窗都是透過這個YesNoDialog.tjs去定義出來,所以這意味著修改它就改變了所有確認視窗的設定。<br />
<br />
不過為什麼我按哪一個都沒有反應?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<這是當然啦,因為我們還沒有寫當玩家確認完後應該要做什麼。<br />
<br />
(k ゚∀゚)<當玩家在確認視窗上按下Yes或No後,askYesNo()就會回傳true或false,true代表按下Yes,false代表按下No。<br />
<br />
(k ゚∀゚)<而我們可以透過askYesNo()的回傳值來決定之後該做什麼,看看以下的範例。<br />
<br />
<pre class="sampletable">[eval exp="tf.result=askYesNo('您是否想繼續執行下去','確認')"]
[if exp="tf.result"]
您按的是Yes
[else]
您按的是No
[endif]</pre><br />
(k ゚∀゚)<在上述的範例裡,我們利用變數result來儲存askYesNo()的回傳值,這就可以分辨玩家是按下Yes還是No。<br />
<br />
雖然askYesNo()可以指定確認視窗上顯示的文字,不過這個「はい」跟「いいえ」有沒有辦法改變?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<修改方法可能有點麻煩,因為我們要直接修改YesNoDialog.tjs的內容。<br />
<br />
(k ゚∀゚)<在YesNoDialog.tjs裡,我們可以修改yesButton.caption跟noButton.caption的值,例如如果我們將yesButton.caption跟noButton.caption的值分別修改成"是"跟"否",確認視窗就會變成以下的模樣。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuOXdkYNsurSVZ9z4me4NDKUxo3g8Z4gaKKmOzMZpEdPh_R6tmta0ACFWHhXakdkaMZTO7i-esepE36wAbdwkAJtdyQ13NOqJI_Dfqfk9QKfwMX23flEtt21q-YIdviGOybJ_-UpKpcEGd/s1600/krkr_ch61_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuOXdkYNsurSVZ9z4me4NDKUxo3g8Z4gaKKmOzMZpEdPh_R6tmta0ACFWHhXakdkaMZTO7i-esepE36wAbdwkAJtdyQ13NOqJI_Dfqfk9QKfwMX23flEtt21q-YIdviGOybJ_-UpKpcEGd/s1600/krkr_ch61_2.png" /></a></div><br />
<br />
哦!看起來終於有點像樣!>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<不過由於是直接修改YesNoDialog.tjs的內容,所以其效果對所有確認視窗都會有影響,這點必須要留意。<br />
<br />
(k ゚∀゚)<今次暫時說到這裡吧……<br />
<br />
不要,我還想知道如何修改整個確認視窗,我一直都覺得這個確認視窗太簡陋了。>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<這些麻煩的東西就留待下一次再說吧,下次再見。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com0tag:blogger.com,1999:blog-7302766091083905080.post-60038885228596501592012-10-21T04:40:00.000+08:002012-10-21T04:41:10.015+08:00吉里吉里教學---發佈前要做的最後一件事,封裝<a name='more'></a>遊戲已經完成了,終於可以準備發佈出來。>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<你該不會想這樣發佈出來,你的立繪跟音樂檔案等等都大刺刺地放置在data資料夾內,玩家只要開啟data資料夾豈不是就看到那些檔案。<br />
<br />
唔……確實有點令人在意,平常看到的遊戲好像也沒有任何一個是這樣做……>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<嗯,一般來說,我們都會那些檔案封裝起來。<br />
<br />
封裝?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<即是將所有檔案整合成一個檔案,一方面可以令玩家不會看到些不想被他們看到的檔案,另一方面就算別人想偷取立繪跟音樂檔案等等檔案,也相對地比較困難。<br />
<br />
不能完全防止別人拿走我的檔案嗎?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<當然不可能,任何方法都不能保證百分之百可以防止的。不過在一般情況下,這樣做已經十分足夠了。<br />
<br />
(k ゚∀゚)<我們可以利用tools資料夾內的krkrrel.exe,它可以將data資料夾裡的檔案封裝成xp3或exe檔案,不過在一般情況下,我們都會將它封裝成xp3檔案,因為其好處比較多。<br />
<br />
(k ゚∀゚)<當開啟krkrrel.exe的時候,應該會看到以下的模樣。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinmiQCYixGkagFWMX8v-JNYUhdpyYpPLVzFdiuiRuuEJjSMUqg9Vhqd2sl5tPZKRabQ3pngVmc0DVpIRfRAVIIGb1i3CGLN488DAwhSJFNYkkvLTPHknqemHn2Vriq1-uVQn8e9-q0V4Sl/s1600/krkr_ch60_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="294" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinmiQCYixGkagFWMX8v-JNYUhdpyYpPLVzFdiuiRuuEJjSMUqg9Vhqd2sl5tPZKRabQ3pngVmc0DVpIRfRAVIIGb1i3CGLN488DAwhSJFNYkkvLTPHknqemHn2Vriq1-uVQn8e9-q0V4Sl/s1600/krkr_ch60_1.png" width="320" /></a></div><br />
<br />
(k ゚∀゚)<這時我們可以選擇想封裝的data資料夾,按下確定之後就會看到以下的模樣。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi82DJPe3gKhKImDORF9uXFeBD5y-m0H-QFJi8CdGcrrXH0XOD3oKLbA3RVHfA1RpcmfdFaQXDVzI5zgJvuq0NBvmFJWjNZ3MdrnrvOonewb08sdAKK69Ad0CTHifw6Y_o_xRzT2xzK0z2F/s1600/krkr_ch60_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="223" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi82DJPe3gKhKImDORF9uXFeBD5y-m0H-QFJi8CdGcrrXH0XOD3oKLbA3RVHfA1RpcmfdFaQXDVzI5zgJvuq0NBvmFJWjNZ3MdrnrvOonewb08sdAKK69Ad0CTHifw6Y_o_xRzT2xzK0z2F/s1600/krkr_ch60_2.png" width="320" /></a></div><br />
<br />
(k ゚∀゚)<這裡可以設定的東西有很多,不過我們只需要設定將檔案封裝成exe檔案還是xp3檔案就可以。<br />
<br />
兩者有什麼分別?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<exe檔案是指將data資料夾裡的檔案跟原本krkr.exe這個執行檔封裝成一起,不過若果這樣做,krkr.exe的檔案大小會增加不少,而且根據吉里吉里官方文件所說,一些防毒軟體似乎會將它誤認成有害的軟體,因此除非你對單一檔案有強烈需求,否則將它們分開比較好。<br />
<br />
(k ゚∀゚)<xp3檔案是指將data資料夾裡的檔案封裝成一個叫data.xp3的檔案,xp3檔案的好處是我們可以透過另一個xp3檔案來修正內容,若果在我們已經發佈了遊戲後才發現有檔案內容錯誤,我們可以將要更新的檔案再封裝一個叫patch.xp3的檔案。<br />
<br />
我示是太明白,有沒有一些例子?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<嗯,假如我們發現first.ks的內容有錯誤,那麼我們只要將含有更後新的first.ks的資料夾封裝一個叫patch.xp3的檔案,吉里吉里載入檔案時就會覆蓋了原本在data.xp3裡的first.ks,這樣做就不用再將整個data資料夾封裝,patch檔案的大小亦不會太大。<br />
<br />
如果我在發佈patch.xp3這修正檔之後才發現又有檔案內容錯誤,那麼該怎麼辦?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<我們可以用patch2.xp3來修正,再有錯誤可以用patch3、patch4……等來修正,當吉里吉里在patch裡找到同名的檔案,就會選擇用數字較大的patch檔,如果patch.xp3和patch2.xp3裡都有一個叫first.ks的檔案,吉里吉里就會選擇用數字較大的patch2.xp3。<br />
<br />
(k ゚∀゚)<當我們選了封裝種類後,可以去選「作成」,若果是選擇exe檔案的話,我們會得到一個exe檔案,這個exe檔案就是之前的krkr.exe,只要執行exe檔案就可以開始遊戲。若果是選擇xp3檔案的話,我們會得到一個xp3檔案,只要將它跟krkr.exe放在一起,krkr.exe就可以順利執行。<br />
<br />
這樣就不再需要data資料夾裡的檔案了嗎?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<是的,因為原本的檔案內容已經封裝到xp3檔案或exe檔案裡,data資料夾裡的檔案已經沒有必要了,你可以將data資料夾裡的檔案當成備份,發佈遊戲只需要那些xp3檔案和exe檔案就可以。<br />
<br />
(k ゚∀゚)<今次介紹到這裡,下次再見。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com6tag:blogger.com,1999:blog-7302766091083905080.post-50728217748247791622012-09-17T05:05:00.000+08:002012-10-21T04:29:22.131+08:00吉里吉里教學---更換吉里吉里圖示<a name='more'></a>好啦,差不多製作完成了……>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<你在幹什麼?<br />
<br />
製作圖示,我想更換吉里吉里這兩條魚的圖示,將它更換自己遊戲的圖示。>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<原來如此。<br />
<br />
話雖如此,不過我不太懂得如何更換吉里吉里的圖示。>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<方法很容易的,我們可以利用在tools資料夾的krkrconf.exe來更換吉里吉里圖示,當開啟krkrconf.exe後會看到以下的模樣。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLghkBIl62Nn-Zh7gciMW3L56RgIaKwa3N-edPZ3I7Udx7-cY1zL04E5qjWqMPa7QcTaGK52rxswtQNENRb7He-aKMflGT7OeCUE_xQhywHLMuFKELN411u5gstbvU2Cx2hwKnob1wjsPD/s1600/krkr_ch59_1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLghkBIl62Nn-Zh7gciMW3L56RgIaKwa3N-edPZ3I7Udx7-cY1zL04E5qjWqMPa7QcTaGK52rxswtQNENRb7He-aKMflGT7OeCUE_xQhywHLMuFKELN411u5gstbvU2Cx2hwKnob1wjsPD/s320/krkr_ch59_1.png" width="320" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
(k ゚∀゚)<然後選擇遊戲內的吉里吉里執行檔,就會看到以下的模樣。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDDr-6bNOlqdORLCVnsaux3WRnB4kn0gfV__ln4_Wfe6jxhvu6xc_YGTPiVRtI1f1ncve1QvQoC8m-_JoMMNd-LU4kL6KvqaxVGE2jwjsZtLsav0LxZlx9q5UETcEr1dlyB8iYsDcW9pp5/s1600/krkr_ch59_2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="214" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDDr-6bNOlqdORLCVnsaux3WRnB4kn0gfV__ln4_Wfe6jxhvu6xc_YGTPiVRtI1f1ncve1QvQoC8m-_JoMMNd-LU4kL6KvqaxVGE2jwjsZtLsav0LxZlx9q5UETcEr1dlyB8iYsDcW9pp5/s320/krkr_ch59_2.png" width="320" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
(k ゚∀゚)<在「アイコン」部分,我們可以按下「参照」去選擇圖示檔(*.ico),最後再按下「OK」就行了,如果成功儲存設定的話,就會顯示「設定を保存しました」。<br />
<br />
唔……不過為什麼我的則彈出了錯誤提示,不給我更換圖示……?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<因為圖示的格式有限制的,圖示檔最好是256色,大小為32x32或16x16,這樣差不多一定可以成功,不過當然大家可以嘗試其他格式,但不一定成功更換圖示的。<br />
<br />
(k ゚∀゚)<今次介紹到這裡,下次再見。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com4tag:blogger.com,1999:blog-7302766091083905080.post-15391856326555942272012-09-05T22:25:00.000+08:002012-09-05T22:31:44.596+08:00KAG內部教學(進階篇)---Auto and Skip<a name='more'></a><b>(建議在閱讀本篇教學之前,請先閱讀</b><a href="http://kibitz2550.blogspot.com/2011/08/kag-flag1.html">KAG教學---flag,變數(1)</a><b>、</b><a href="http://kibitz2550.blogspot.hk/2012/07/tjs-function1.html">TJS教學---function,函式(1)</a><b>)</b> <br />
<br />
(k ゚∀゚)<今次講解一下一個AVG類遊戲常見的功能Auto跟Skip,雖然吉里吉里功能列上有Auto跟Skip,不過相信大家不太喜歡缺乏美觀的玩意。<br />
<br />
嗯,平常見到的遊戲都是對話框旁邊附有Auto跟Skip的按鈕,的確不太想用功能列上的功能。>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<所以今次就說一下如何使用Auto跟Skip的功能,雖然KAG沒有任何tag去直接使用Auto跟Skip的功能,不過可以利用MainWindow.tjs裡定義的函式去使用它們。<br />
<br />
(k ゚∀゚)<我們先講Auto功能,Auto功能的函式主要有enterAutoMode()跟cancelAutoMode(),正如字面上的意義,它們是用來進入和離開Auto模式。<br />
<br />
那該怎樣做才可以使用它們。>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<先看看以下的範例。<br />
<br />
<pre class="sampletable">按一下啟動Auto模式[l][r]
[eval exp="<span style="color: red;">kag.enterAutoMode()</span>"]
第一行[l][r]
第二行[l][r]
第三行[l][r]
關閉Auto模式
[eval exp="<span style="color: red;">kag.cancelAutoMode()</span>"]
[l][r]
第一行[l][r]
第二行[l][r]
第三行
</pre><br />
(k ゚∀゚)<由於是用TJS寫的函式,KAG裡可以利用exp屬性來執行它們,執行enterAutoMode()時吉里吉里就會啟動Auto模式,當執行cancelAutoMode()時則離開Auto模式。<br />
<br />
不過我有時候想播放OP或ED等影片,要強制離開Auto模式,但又不知玩家是否進行Auto模式,那麼這時執行cancelAutoMode()會不會有問題?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<不會啦,就算不是在Auto模式下執行cancelAutoMode()也沒有任何問題,不過若果大家想知道玩家是否進行了Auto模式,可以透過autoMode這變數來判斷,當autoMode的值為true時,代表正在進行Auto模式,看看以下的範例。<br />
<br />
<pre class="sampletable">按一下啟動Auto模式[l][r]
[eval exp="kag.enterAutoMode()"]
autoMode的值為
[emb exp="<span style="color: red;">kag.autoMode</span>"]
[l][r]
關閉Auto模式
[eval exp="kag.cancelAutoMode()"]
[l][r]
autoMode的值為
[emb exp="<span style="color: red;">kag.autoMode</span>"]
</pre><br />
我有問題,若果我將autoMode設定為true,吉里吉里會不會啟動Auto模式?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<答案是會的,不過絕對不建議這樣做,因為enterAutoMode()跟cancelAutoMode()除了將autoMode的值改變之外,還進行其他東西,所以Auto功能請用enterAutoMode()跟cancelAutoMode()。<br />
<br />
一說到Auto模式,有時候有些遊戲可以由玩家設定Auto模式的顯示速度,那如何在吉里吉里上設定它?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<在功能列上,吉里吉里提供了五種Auto模式的顯示速度給玩家選擇,它們可以透過Config.tjs裡autoModeLineWaits跟autoModePageWaits來設定換行跟換頁所等待時間,其單位為毫秒。<br />
<br />
但我可不想玩家用功能列來設定,我想自行製作一個設定介面給玩家,有沒有辦法做到?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<其實Auto模式的顯示速度可以直接透過autoModeLineWait跟autoModePageWait來設定,留意它們跟Config.tjs裡autoModeLineWaits跟autoModePageWaits不同的,autoModeLineWait跟autoModePageWait是直接修改換行跟換頁所等待時間,autoModeLineWaits跟autoModePageWaits則是設定功能列上所給予這五種顯示速度的值。<br />
<br />
(k ゚∀゚)<看看以下的範例。<br />
<br />
<pre class="sampletable">按一下啟動Auto模式[l][r]
[eval exp="kag.enterAutoMode()"]
[eval exp="<span style="color: red;">kag.autoModeLineWait=200</span>"]
[eval exp="<span style="color: red;">kag.autoModePageWait=500</span>"]
現在換行所等待時間為0.2秒[r]
換行跟換頁所等待時間則為0.5秒[p][cm]
第一行[l][r]
第二行[l][r]
第三行[p][cm]
[eval exp="<span style="color: red;">kag.autoModeLineWait=1000</span>"]
[eval exp="<span style="color: red;">kag.autoModePageWait=2500</span>"]
現在換行所等待時間為1秒[r]
換行跟換頁所等待時間則為2.5秒[p][cm]
第一行[l][r]
第二行[l][r]
第三行[p][cm]
關閉Auto模式
[eval exp="kag.cancelAutoMode()"]
</pre><br />
(k ゚∀゚)<在上述的範例裡,我們利用autoModeLineWait跟autoModePageWait來設定所等待時間,而其值將會儲存到datasc.ksd裡,以便開啟遊戲時進行初始化。<br />
<br />
原來如此……>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<我們再講Skip功能,KAG預設了五種模式,並利用skipMode這變數來決定現在是哪個模式,skipMode的值由0至4,分別代表不同模式。<br />
<br />
(k ゚∀゚)<當skipMode為0,代表停止Skip模式,我們可以利用cancelSkip()來停止Skip模式,cancelSkip()會將skipMode重新設定為0。<br />
<br />
(k ゚∀゚)<當skipMode為1,代表執行Skip模式,直到要遇到等待滑鼠點擊的位置,例如是[l]或[p]等,就會停止Skip模式,我們可以利用skipToClick()來進入這個Skip模式。<br />
<br />
有什麼時候會使用到它?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<這個雖然我們甚少在製作Skip功能時使用,不過倒是經常看得到它的存在。<br />
<br />
嗯?有嗎?我好像沒看過……>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<在文字顯示途中如果我們按下滑鼠,文字就會立即全部顯示,這其實是使用了skipToClick()。<br />
<br />
原來如此……>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<當skipMode為2,代表執行Skip模式,直到要遇到等待換頁的位置,就會停止Skip模式,我們可以利用skipToPage()來進入這個Skip模式。不過實際上沒什麼機會使用到……<br />
<br />
(k ゚∀゚)<當skipMode為3,代表執行Skip模式,直到要遇到未讀的部分或[s]等,才會停止Skip模式,我們可以利用skipToStop()來進入這個Skip模式,功能列上的「次の選択肢/未読まで進む」選項就會用這功能。<br />
<br />
啊呀!這就是我想要的確東西!!>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<嗯,這就是一般在遊戲裡看到的Skip功能,但所謂的未讀部分,其實是利用label標籤來判斷,當遇到從未通過label標籤,就會停止Skip模式。<br />
<br />
(k ゚∀゚)<當skipMode為4,代表執行Skip模式,如果按住鍵盤上Skip相關的鍵,例如Enter或Space鍵,就會繼續Skip模式,我們可以利用skipToStop2()來進入這個Skip模式。<br />
<br />
(k ゚∀゚)<同樣地,不太建議直接修改skipMode變數來設定Skip模式,盡可能用函式來設定Skip模式。<br />
<br />
(k ゚∀゚)<以下是綜合上述內容的列表,大家可以參考一下。<br />
<br />
<table><tbody>
<tr class="heading"> <td>skipMode的值</td><td>效果</td> <td>離開條件</td><td>函式</td> </tr>
<tr class="odd"><td>0</td><td>停止Skip模式</td><td></td><td>cancelSkip()</td></tr>
<tr class="even"><td>1</td><td>進入Skip模式</td><td>等待滑鼠點擊的位置,如[l]或[p]等</td><td>skipToClick()</td></tr>
<tr class="odd"><td>2</td><td>進入Skip模式</td><td>等待換頁的位置,例如[p]等</td><td>skipToPage()</td></tr>
<tr class="even"><td>3</td><td>進入Skip模式</td><td>未讀的部分或[s]等</td><td>skipToStop()</td></tr>
<tr class="odd"><td>4</td><td>進入Skip模式</td><td>不按住鍵盤上Skip相關的鍵</td><td>skipToStop2()</td></tr>
</tbody></table><br />
(k ゚∀゚)<以下是實際應用的範例。<br />
<br />
<pre class="sampletable">按一下啟動Skip模式[l][r]
[eval exp="<span style="color: red;">kag.skipToStop()</span>"]
第一行[l][r]
第二行[l][r]
第三行[l][r]
關閉Skip模式
[eval exp="<span style="color: red;">kag.cancelSkip()</span>"]
[l][r]
第一行[l][r]
第二行[l][r]
第三行
</pre><br />
(k ゚∀゚)<今次介紹到這裡,下次再見。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com3tag:blogger.com,1999:blog-7302766091083905080.post-64351825964736673862012-08-27T06:53:00.000+08:002012-08-30T04:03:09.438+08:00吉里吉里教學---Config.tjs設定(3)<br />
<a name='more'></a>(k ゚∀゚)<今次繼續介紹Config.tjs 裡各種設定,為了方便尋找,我會每個分開來介紹,一部分太複雜的會之後個別再介紹。<br />
<br />
(k ゚∀゚)<今次主要介紹關於文字圖層的設定。<br />
<br />
----------------------------------------------------------------------------------------------------------------<br />
<br />
<h3>layerType</h3>(k ゚∀゚)<這個是設定文字圖層顯示模式,分別有ltAddAlpha跟ltAlpha兩種模式,ltAddAlpha支援KAG3 3.23 beta 5之後的版本,執行上比ltAlpha快一點,不過文字圖層的背景圖片則必須是支援ltAddAlpha格式,這必須要留意的。<br />
<br />
那ltAlpha有什麼用?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<ltAlpha則可以相容之前的版本,所以正常情況下,我們都會選用ltAddAlpha模式`。<br />
<br />
<h3>frameGraphic</h3>(k ゚∀゚)<這個是設定文字圖層的背景圖片,我們可以指定背景圖片的檔案,效果相當於[position]的frame屬性。<br />
<br />
<h3>frameColor</h3>(k ゚∀゚)<這個是設定文字圖層的背景顏色,並以0xRRGGBB形式表示顏色的值,效果相當於[position]的color屬性。<br />
<br />
<h3>frameOpacity</h3>(k ゚∀゚)<這個是設定文字圖層的背景透明度,數值由0至255,數值是0代表完全透明,255代表完全不透明,效果相當於[position]的opacity屬性。<br />
<br />
<h3>marginL,marginT,marginR,marginB</h3>(k ゚∀゚)<這個是設定左邊界、上邊界、右邊界和下邊界的空白位置的距離,效果相當於[position]的margint, marginb, marginl, marginr等屬性。<br />
<br />
<h3>ml,mt,mw,mh</h3>(k ゚∀゚)<這個是設定文字圖層的初期位置和大小,效果相當於[position]的left,top,width,height等屬性。<br />
<br />
<h3>defaultAutoReturn</h3>(k ゚∀゚)<雖然字面上看起來好像是自動換行,但絕對不是大家所想的功能,其實是設定當文字顯示到文字圖層的末端時,就會自動換行,文字圖層沒有足夠空間去顯示文字,文字圖層就會自動換頁,當值為true時,就會執行這功能。<br />
<br />
<h3>marginRCh</h3>(k ゚∀゚)<這個是設定文字圖層右邊(縱行模式是下方)預留多少空白空間,其值是指文字數量,例如marginRCh=2是指文字圖層右邊預留2個文字的大小的空白位置。<br />
<br />
<h3>defaultFontSize</h3>(k ゚∀゚)<這個是設定文字圖層的文字大小,效果相當於[deffont]的size屬性。<br />
<br />
<h3>defaultLineSpacing</h3>(k ゚∀゚)<這個是設定文字圖層的行間距,效果相當於[defstyle]的linespacing屬性。<br />
<br />
<h3>defaultPitch</h3>(k ゚∀゚)<這個是設定文字圖層的字間寬度,數值是正數時寬度會增加,負數時寬度會減少,效果相當於[defstyle]的pitch屬性。<br />
<br />
<h3>userFace</h3>(k ゚∀゚)<這個是設定文字圖層的字體。字體名稱必須清楚正確。可指定多種字體,有優先順序(由左到右),效果相當於[deffont]的face屬性。不過留意這設定是由系統變數記錄下來,因此當修改後建議刪除savedata資料夾內的datasc.ksd檔案。<br />
<br />
<h3>defaultChColor</h3>(k ゚∀゚)<這個是設定文字圖層的文字顏色,並以0xRRGGBB形式表示顏色的值,效果相當於[deffont]的color屬性。<br />
<br />
<h3>defaultBold</h3>(k ゚∀゚)<這個是設定文字圖層的文字是否粗體,其值為true時設定為粗體,效果相當於[deffont]的bold屬性。<br />
<br />
<h3>defaultRubySize</h3>(k ゚∀゚)<這個是設定文字圖層的注音文字大小,以pixel為單位,效果相當於[deffont]的rubysize屬性。<br />
<br />
<h3>defaultRubyOffset</h3>(k ゚∀゚)<這個是設定文字圖層的注音文字位置,以pixel為單位,效果相當於[deffont]的rubyoffset屬性。<br />
<br />
<h3>defaultAntialiased</h3>(k ゚∀゚)<這個是設定文字是否進行平滑化處理,其值為true時就會進行平滑化。<br />
<br />
<h3>defaultShadowColor</h3>(k ゚∀゚)<這個是設定文字陰影顏色,並以0xRRGGBB形式表示顏色的值,效果相當於[deffont]的shadowcolor屬性。<br />
<br />
<h3>defaultEdgeColor</h3>(k ゚∀゚)<這個是設定文字邊緣線顏色,並以0xRRGGBB形式表示顏色的值,效果相當於[deffont]的edgecolor屬性。<br />
<br />
<h3>defaultShadow</h3>(k ゚∀゚)<這個是設定文字邊緣線陰影,數值為true時設定為有陰影,效果相當於[deffont]的shadow屬性。<br />
<br />
<h3>defaultEdge</h3>(k ゚∀゚)<這個是設定文字邊緣線,數值為true時設定為有邊緣線,效果相當於[deffont]的edge屬性。<br />
<br />
<h3>lineBreakGlyph,pageBreakGlyph</h3>(k ゚∀゚)<這個是設定等待換行跟等待換頁時所顯示的圖案,我們可以指定圖片的檔案,不過留意不要加上副檔名,效果相當於[glyph]的line和page屬性。<br />
<br />
<h3>glyphFixedPosition</h3>(k ゚∀゚)<這個是設定等待換行跟等待換頁時圖案的位置是否固定,其值為true時就會固定位置,效果相當於[glyph]的fix屬性。<br />
<br />
<h3>glyphFixedLeft,glyphFixedTop</h3>(k ゚∀゚)<這個是設定等待換行跟等待換頁時圖案的位置,glyphFixedLeft是設定距離左端的位置,glyphFixedTop則是設定距離上端的位置,效果相當於[glyph]的left和top屬性。<br />
<br />
<h3>defaultLinkColor</h3>(k ゚∀゚)<這個是設定滑鼠放在選項時的背景顏色,以0xRRGGBB形式表示顏色的值,效果相當於[link]的color屬性。<br />
<br />
<h3>defaultLinkOpacity</h3>(k ゚∀゚)<這個是設定滑鼠放在選項時背景顏色的透明度,數值由0至255,數值是0代表完全透明,255代表完全不透明。<br />
<br />
<h3>vertical</h3>(k ゚∀゚)<這個是設定文字以直書形式顯示,其值為true時代表以直書形式顯示,效果相當於[position]的vertical屬性。<br />
<br />
<h3>draggable</h3>(k ゚∀゚)<這個是設定文字圖層可否被拖曳,其值為true時文字圖層就可被拖曳,效果相當於[position]的draggable屬性。<br />
<br />
----------------------------------------------------------------------------------------------------------------<br />
<br />
我發現其實有不少設定都是KAG已有的功能,那到底用KAG還是Config.tjs來設定好?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<Config.tjs主要是將一些設定進行初始化,而KAG則適合中途修改設定,不過當然也可以所有都使用KAG來將設定進行初始化,這基本上是個人習慣的問題。<br />
<br />
(k ゚∀゚)<今次就介紹到這裡,下次才把剩下的部分介紹完。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com0tag:blogger.com,1999:blog-7302766091083905080.post-20488315756150879572012-08-12T07:03:00.000+08:002012-08-12T07:07:12.937+08:00KAG教學(補充篇)---字型設定與渲染字型,文字顯示(5)<a name='more'></a>(k ゚∀゚)<還記不記得之前曾經介紹[font]和[deffont]裡的face屬性可以改變字型,今次的主題是在吉里吉里使用字型的問題。<br />
<br />
不是只要在face屬性上寫上字型名稱就可以嗎?到底有什麼問題?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<當我們在face屬性上寫上字型名稱時,其實吉里吉里是用玩家本身電腦所擁有的字型,那麼若果玩家的電腦沒有這字型,我們可以怎麼辦?<br />
<br />
用其他常見的字型來取代?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<這方法當然可行,face屬性可指定多種字型,如果沒有這字體就可用另一個字型取代,不過相信大家多少都希望某種字型吧。<br />
<br />
(k ゚∀゚)<解決方法有兩種,第一種是將字型檔案增添到遊戲裡,也就是遊戲本身自帶所使用的字型檔案,並不用理會玩家本身電腦是否擁有所需的字型。<br />
<br />
是不是直接把字型檔案放入data資料夾就可以?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<不是的,除了把字型檔案放入data資料夾之外,還必須將字型檔案載入到吉里吉里裡。<br />
<br />
(k ゚∀゚)<吉里吉里的檔案裡有一個叫addFont.dll這插件,這就是用來載入字型檔案,看看以下的範例。<br />
<br />
<pre class="sampletable">[loadplugin module=addFont.dll]
[eval exp="System.addFont('字型檔案名稱', true)"]
</pre><br />
(k ゚∀゚)<在上述的範例裡,只要將ttf和otf等字型檔案放入data資料夾裡,之後再利用System.addFont()去將字型檔案載入到吉里吉里裡,留意填寫的字型檔案名稱必須有副檔名。<br />
<br />
不過有時候吉里吉里好像無法辨認到字型檔案,那麼就算將字型檔案載入到吉里吉里裡,吉里吉里都無法用正確的字型去顯示文字,那該怎麼辦?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<這時我們可以用另一個方法來解決字型問題,就是去渲染字型,經過渲染的字型會產生一個吉里吉里專用字型檔案,什麼亂碼或字型的問題基本上是可以完全解決。<br />
<br />
我不太明白,為什麼那麼好的方便不一開始就介紹呢……?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<因為渲染字型的限制十分多,吉里吉里專用字型檔案是儲存著一個指定字型大小的字型,例如我要用到字型大小為24的新細明體,當我要用到字型大小為16的新細明體時,雖然同樣是新細明體,不過我卻要製作另一個吉里吉里專用字型檔案。<br />
<br />
(k ゚∀゚)<若要製作吉里吉里專用字型檔案,可以利用在tools資料夾裡的krkrfont.exe,當開啟krkrfont.exe時,應該會看到以下的模樣。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrJRSV2yc7d2x2nYU6fo84PcO_ZGg6xOcU6Gp9WXv6swAnw7A4K8Ko-QoETgZuwtwmCIwxYeKN8gOpbx5J447RWv4FDpXIG06bH62g4uS9EBV7OLe5Z8c1mbDwW9HdiOTvEylgx6IgQKcm/s1600/krkr_ch58_1.png" imageanchor="1"><img border="0" height="230" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrJRSV2yc7d2x2nYU6fo84PcO_ZGg6xOcU6Gp9WXv6swAnw7A4K8Ko-QoETgZuwtwmCIwxYeKN8gOpbx5J447RWv4FDpXIG06bH62g4uS9EBV7OLe5Z8c1mbDwW9HdiOTvEylgx6IgQKcm/s320/krkr_ch58_1.png" width="320" /></a><br />
<br />
(k ゚∀゚)<我們首先選「すべての TrueType フォントを表示」,這樣的話所有電腦已安裝的字型都會顯示在選單裡,之後在選單裡選擇要渲染的字型,之後在「サイズ(文字高さ)」裡寫上字型大小。<br />
<br />
那選單下面的又是什麼東西?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<這是字型設定,我們可以設定平滑化或粗體等,而再下面兩個選項可以不用改動它們。<br />
<br />
(k ゚∀゚)<當設定好後,可以按右邊的按鈕去預覽字型的模樣,當按下下面「作成」的按鈕,即可製作完成。<br />
<br />
哦?現在多了一個tft檔案,那麼之後該怎麼做?是不是將它放在data資料夾裡?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<是的。然後我們必須告訴吉里吉里到底這個tft檔案是用在哪一個字型上。<br />
<br />
吉里吉里不會自己去辨認?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<吉里吉里不會那樣做的,我們一定要利用[mappfont]去設定渲染的字型,看看以下的範例。<br />
<br />
<pre class="sampletable">[font face=字型名稱 size=字型大小]
[mappfont storage=檔案名稱]
</pre><br />
(k ゚∀゚)<當我們用[mappfont]去設定渲染字型時,吉里吉里會將現時的字型設定記錄下來,當遇到相同的字型設定,吉里吉里就會用設定好的渲染字型來顯示文字。<br />
<br />
可不可以說得簡單一點,我完全不明白你說什麼?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<唔……那看看以下的範例。<br />
<br />
<pre class="sampletable">[font face="Impact" size=24]
[mappfont storage="impact_24.tft"]
現在正測試字型
</pre><br />
(k ゚∀゚)<在上述的範例裡,吉里吉里會將字型名稱Impact、大小為24等設定記錄下來,之後每遇到字型名稱是Impact、大小為24的字型設定時,吉里吉里就會使用impact_24.tft這字型檔案來顯示文字。<br />
<br />
(k ゚∀゚)<如果仔細地看的話,大家可能發現[font]的設定和tft檔案並沒有直接關係的,就算impact_24.tft裡根本不是Impact的字型、大小不是24,吉里吉里照樣會用impact_24.tft來顯示文字,顯示文字的字型則是完全根據tft檔案來設定,這點必須要留意。<br />
<br />
(k ゚∀゚)<大致上介紹得差不多,下次再見吧!kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com2tag:blogger.com,1999:blog-7302766091083905080.post-48573332662928579782012-07-18T05:37:00.000+08:002012-07-18T05:37:08.619+08:00TJS教學---array,陣列(2)<a name='more'></a>(k ゚∀゚)<上一次只是簡單介紹了陣列,今次我們再深入瞭解一些有關陣列的事情。<br />
<br />
其實上一次已經有問題想問,如果沒有進行初始化,陣列裡一開始的值是什麼﹖>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<如果陣列裡的元素沒有進行初始化,那麼它便是void,我們可以看看以下的範例。<br />
<br />
<pre class="sampletable">var arr=new Array();
arr[2]=1;
System.inform("arr[0]的值是"+arr[0]+"\n其資料型態是"+typeof arr[0]);
</pre>
<br />
(k ゚∀゚)<在上述的範例裡,由於我們沒有將arr[0]和arr[1]初始化,所以它們的值是void。<br />
<br />
(k ゚∀゚)<有時我們想知道陣列的長度,可以利用count屬性來取得陣列的長度,看看以下的範例。<br />
<br />
<pre class="sampletable">var arr=[1,2,3];
System.inform(<span style="color: red;">arr.count</span>);
</pre>
<br />
(k ゚∀゚)<在上述的範例裡,arr.count的值是3,代表這陣列的長度是3,即是有3個元素。<br />
<br />
(k ゚∀゚)<再看看以下的範例。<br />
<br />
<pre class="sampletable">var arr=new Array();
<span style="color: red;">arr[2]=1;</span>
System.inform(<span style="color: red;">arr.count</span>);
</pre>
<br />
(k ゚∀゚)<今次arr.count的值是什麼?<br />
<br />
是不是1?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<不是,雖然我們只是對arr[2]進行初始化,不過不代表陣列的長度是1,實際上這陣列的長度是3,只不過arr[0]和arr[1]的值是void而已。<br />
<br />
(k ゚∀゚)<有時候我們將新的值存放到陣列裡,可以考慮使用add(),add()可以將新的元素加到陣列的最後部分。<br />
<br />
(k ゚∀゚)<看看以下的範例。<br />
<br />
<pre class="sampletable">var arr=[1,2,3]);
<span style="color: red;">arr.add(4);</span>
System.inform(arr[3]);
</pre>
<br />
這陣列現在是不是[1,2,3,4]?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<對呀,原本的陣列只是[1,2,3],當執行arr.add(4)時,吉里吉里會將4加入到陣列的最後部分,所以會變成[1,2,3,4]。<br />
<br />
(k ゚∀゚)<而若果我們想將新的值插入到陣列的某處,可以考慮使用insert(),insert()有兩個參數,第一個是指定位置,第二個是想插入到陣列的值,看看以下的範例。<br />
<br />
<pre class="sampletable">var arr=[1,2,3]);
<span style="color: red;">arr.insert(1,4);</span>
System.inform(arr[1]);
</pre>
<br />
(k ゚∀゚)<當執行insert(1,4)時,吉里吉里會將4插入到arr[1]的位置,所以arr[1]會變成4。<br />
<br />
那麼原本在這個位置的值怎麼樣,被覆蓋了嗎?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<不是的,原本的值會移到後面,所以執行後陣列會變成[1,4,2,3]。<br />
<br />
(k ゚∀゚)<有插入當然也有移除,當我們想移除某位置的元素,可以利用erase(),它有一個參數,就是指定其位置,看看以下的範例。<br />
<br />
<pre class="sampletable">var arr=[1,2,3]);
<span style="color: red;">arr.erase(1);</span>
System.inform(arr[1]);
</pre>
<br />
(k ゚∀゚)<當執行erase(1)時,吉里吉里會將arr[1]的值刪除掉,所以arr會變成[1,3]。<br />
<br />
(k ゚∀゚)<除了透過位置來移除元素,我們還可利用remove()來某個值的元素,remove()有兩個參數,第一個是指定要移除的值,第二個是設定是否刪除所有符合的元素,如果是true的話,所有符合的元素都會被刪除,如果是false的話,只有第一個符合的元素會被刪除。看看以下的範例。<br />
<br />
<pre class="sampletable">var arr=[1,1,2,2,3,3];
<span style="color: red;">arr.remove(1,true);</span>
System.inform(arr[0]);
</pre>
<br />
(k ゚∀゚)<當執行remove(1,true)時,吉里吉里會將所有值為1的元素全部刪除,所以arr會變成[2,2,3,3]。<br />
<br />
(k ゚∀゚)<但好像以下的範例……<br />
<br />
<pre class="sampletable">var arr=[1,1,2,2,3,3];
<span style="color: red;">arr.remove(1,false);</span>
System.inform(arr[0]);
</pre>
<br />
(k ゚∀゚)<當執行remove(1,false)時,吉里吉里只會將第一個符合的元素刪除,所以arr會變成[1,2,2,3,3]。<br />
<br />
原來如此。>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<最後介紹一下clear(),當我們希望將陣列裡所有元素都刪除,這時就可考慮用clear(),clear()會將現時在陣列裡的所有元素都刪除,看看以下的範例。<br />
<br />
<pre class="sampletable">var arr=[1,2,3];
<span style="color: red;">arr.clear();</span>
</pre>
<br />
(k ゚∀゚)<當執行clear(),arr裡的元素都被刪除,變成一個空陣列。<br />
<br />
(k ゚∀゚)<今次就介紹到這裡吧,下次再見。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com0tag:blogger.com,1999:blog-7302766091083905080.post-46199238616871349312012-07-15T06:12:00.000+08:002012-10-05T04:35:49.475+08:00TJS教學---function,函式(1)<a name='more'></a>(k ゚∀゚)<隨著我們寫的程式越來越大型,程式碼越來越多,我們有需要想辦法去將一個程式碼分割成多個部分,令程式碼的結構更有組織,這時我們可考慮使用函式(function)。<br />
<br />
(k ゚∀゚)<函式是將一段程式碼獨立成一個個體,當我們需要時就可以呼叫它,函式有很多好處,其中一個就是函式可以重複呼叫,特別是一些經常重複的程式碼,我們只要寫一次就重複多次使用。<br />
<br />
你說了那麼多,但我還是不太了解什麼是函式>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<其實我們早就已經看過函式這種玩意,記不記得我們經常使用的System.inform(),實際上它算是函式,它可能花了一大段程式碼才執行到這效果,不過由於它被寫成了函式,我們只需要寫下短短的一行來呼叫它,取代這一大段的程式碼,同時我們就算不知道這函式是如何辦到這效果,我們亦可以毫無影響地使用它,這就是函式的好處。<br />
<br />
(k ゚∀゚)<當然除了使用別人寫出來的函式,我們也要懂得如何撰寫函式,宣告函式的方式就像以下的模樣。<br />
<br />
<pre class="sampletable">function 函式名稱(參數1,參數2,參數3,....){
//函式主體
return 回傳值;
}
</pre><br />
看起來十分複雜……>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<那麼看看以下的簡單範例。<br />
<br />
<pre class="sampletable">function sum(x,y){
return x+y;
}
</pre><br />
(k ゚∀゚)<在上述的範例裡,我們宣告了一個叫sum的函式,它的目的只是簡單地把兩個數值相加,函式名稱的命名規則基本上跟變數的命名一樣,而這函式有兩個參數叫x和y,參數其實是區域變數(local variable),是一個只有函式才能「看得到」的變數,函式以外的地方是無法使用的,而當我們呼叫函式時必須給予參數一個值。<br />
<br />
那麼sum(x,y)下面的東西是什麼?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<這是函式主體,也就是定義函式要做什麼的地方。<br />
<br />
這句return是什麼來的,我從未看過這玩意。>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<這句return是定義這函式會傳回來的值,我們稱之為回傳值(return value),函式會把這個值傳回來,return x+y即是將x+y的值回傳,留意一個函式可以接受多個參數,不過函式只會回傳一個回傳值。<br />
<br />
我們宣告了這個叫sum的函式,但我怎樣才可使用它?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<嗯,就像以下的模樣。<br />
<br />
<pre class="sampletable">var result=<span style="color: red;">sum(2,3)</span>;
System.inform("2+3="+result);
function sum(x,y){
return x+y;
}
</pre><br />
(k ゚∀゚)<由於sum()有兩個參數,當我們呼叫sum()時,必須指定兩個值給這兩個參數,在上述的範例裡,我們將2和3傳給sum(),而這兩個值將x和y這兩個變數初始化,最後sum()將會回傳5這個值。<br />
<br />
咦?為什麼函式在宣告前已經可以呼叫?平時如果變數在宣告前使用的話,不是會發生錯誤嗎?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<沒問題,當我們呼叫函式,吉里吉里會自行尋找宣告的位置,即使函式在宣告前被呼叫,也不會發生錯誤。<br />
<br />
(k ゚∀゚)<而一個函式不一定有參數或回傳值,看看以下的範例。<br />
<br />
<pre class="sampletable">function printHelloWorld(){
System.inform("Hello World");
}
</pre><br />
(k ゚∀゚)<當不需要用到參數或回傳值,我們可以忽略它們。<br />
<br />
好像有點懂但又不太懂,好混亂……>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<那麼不如你自己嘗試寫一寫,假如我製作一個函式,它接受一個參數n,我希望它回傳1+2+3+...+n的值,那我該怎樣寫?<br />
<br />
唔……是不是這樣?>( ゚ω゚ s)<br />
<br />
<pre class="sampletable">function sum(n){
var result=0;
for(var i=1;i<=n;i++){
result+=i;
}
return result;
}
</pre><br />
(k ゚∀゚)<是的,而當我們呼叫它時該怎樣寫?<br />
<br />
是不是這樣?>( ゚ω゚ s)<br />
<br />
<pre class="sampletable">System.inform(sum(10));
function sum(n){
var result=0;
for(var i=1;i<=n;i++){
result+=i;
}
return result;
}
</pre><br />
(k ゚∀゚)<不錯,就是這樣了。<br />
<br />
我已經好混亂,可不可以不要再說。>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<嗯,今次教的題目的確有點難,那關於函式的東西下次再繼續吧。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com0tag:blogger.com,1999:blog-7302766091083905080.post-34358531951877944382012-07-03T05:44:00.000+08:002012-08-12T06:19:12.478+08:00TJS教學---dictionary,字典陣列(1)<a name='more'></a>(k ゚∀゚)<上一次介紹了陣列,今次則介紹跟陣列十分相似的東西,稱之為字典陣列(Dictionary)。<br />
<br />
字典?這不是用來查字的玩意嗎,為什麼吉里吉里需要這種東西?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<不是啦,雖然名稱叫字典陣列,但與現實中的字典沒有關係,只是概念上有點相似。<br />
<br />
(k ゚∀゚)<簡單來說,字典陣列是利用字串取代數值做索引的陣列,宣告字典陣列的方式就像以下的範例。<br />
<br />
<pre class="sampletable">var dic = new Dictionary();
</pre><br />
(k ゚∀゚)<在上述的範例裡,我們已經建立了一個字典陣列,是不是很簡單。<br />
<br />
不過怎樣使用它?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<而用法基本上跟陣列差不多,看看以下的範例。<br />
<br />
<pre class="sampletable">var npc=new Dictionary();
npc["name"]="NPC";
npc["age"]=17;
npc["occupation"]="學生";
System.inform("我的名字叫"+npc["name"]+"\n今年"+npc["age"]+"歲\n職業是一位"+npc["occupation"]);
</pre><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikww-Qbq6IdzIPiJZtyT_6LhreYv7prLt3kZjdMMgWMQuxQ83rOEBn1sZTgk4wF13XdLdC9PN2IQVgbXixtnD5sAclr3kSk21AmCqOsHk9OInw_vvDLoxMSg_v-lnG-GY4pD0r-T7StqqP/s1600/krkr_ch57_1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikww-Qbq6IdzIPiJZtyT_6LhreYv7prLt3kZjdMMgWMQuxQ83rOEBn1sZTgk4wF13XdLdC9PN2IQVgbXixtnD5sAclr3kSk21AmCqOsHk9OInw_vvDLoxMSg_v-lnG-GY4pD0r-T7StqqP/s1600/krkr_ch57_1.jpg" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
(k ゚∀゚)<使用字典陣列有一個好處,索引值不再是一些沒意義的整數。例如當我們看見npc["name"]時,很容易就聯想到這是有關於名稱的變數。<br />
<br />
原來如此。>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<我們亦可以另一個寫法來使用字典陣列,看看以下的範例。<br />
<br />
<pre class="sampletable">var npc=new Dictionary();
npc.name="NPC";
npc.age=17;
npc.occupation="學生";
System.inform("我的名字叫"+npc.name+"\n今年"+npc.age+"歲\n職業是一位"+npc.occupation);
</pre><br />
唔……這種寫法好像似曾相識……>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<嗯,我們其實在KAG裡已經經常用到字典陣列,其實所謂系統變數、遊戲變數、暫時變數,它們都只是字典陣列,只不過之前沒有特別去介紹它。<br />
<br />
(k ゚∀゚)<跟陣列一樣,我們亦可同時進行宣告和初始化,就像以下的範例。<br />
<br />
<pre class="sampletable">var npc=%["name"=>"NPC","age"=>17,"occupation"=>"學生"];
System.inform("我的名字叫"+npc.name+"\n今年"+npc.age+"歲\n職業是一位"+npc.occupation);
</pre><br />
(k ゚∀゚)<當初始化字典陣列的元素時,可以利用「名稱 => 值」的形式來進行初始化。<br />
<br />
(k ゚∀゚)<而且留意一般的陣列是使用[],字典陣列則是使用%[],不要將它們混淆。<br />
<br />
(k ゚∀゚)<今次介紹到這裡,下次再見。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com0tag:blogger.com,1999:blog-7302766091083905080.post-87525415873587363832012-06-22T06:41:00.000+08:002012-06-22T06:41:33.754+08:00KAGEX教學---換行與換頁,linemode<a name='more'></a>(k ゚∀゚)<不知道大家有沒有想過,很多時候我們用[l]與[r]來換行,用[p]與[cm]來換頁,為什麼吉里吉里不能用一些比較直觀的方式來換行和換頁呢。<br />
<br />
同意,如果可以省略它們就好了。>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<有鑑於此,KAGEX擴充了這方面的功能,我們可利用[linemode]來設定換行與換頁的模式。<br />
<br />
(k ゚∀゚)<[linemode]提供了五種換行與換頁的模式,其屬性mode可以設定用哪一個模式,不過留意當我們使用到[linemode]時,Config.tjs裡global.ignoreCR會強制改為true。<br />
<br />
(k ゚∀゚)<而且留意當執行[linemode]後,每當使用到[p]之後,吉里吉里會自動將文字圖層的文字消除。<br />
<br />
(k ゚∀゚)<首先介紹的模式是line,在line模式裡,當我們換行時,吉里吉里會自動換行,並且等待點擊,效果等同[r]和[l]以下是範例。<br />
<br />
<pre class="sampletable"><span style="color: red;">[linemode mode=line]</span>
這是範例
換到下一行
</pre>
<br />
這模式好像頗沒什麼情況會使用到……>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<……基本上,這適合一行一行的文字顯示的遊戲。不過到底什麼遊戲會用到,那就不太清楚了。<br />
<br />
(k ゚∀゚)<下一個模式是page,在page模式裡,當我們換行時,吉里吉里會自動換頁,並自動將文字圖層的文字消除,我們無須使用[p]和[er]來換頁,但如果需要換行的話,還是要利用[r]來換行,以下是範例。<br />
<br />
<pre class="sampletable"><span style="color: red;">[linemode mode=page]</span>
這是範例
換到下一行
</pre>
<br />
(k ゚∀゚)<這模式十分適合經常用在對話框種類的遊戲,這些遊戲經常要換頁,page模式可避免使用大量[p]和[cm]。<br />
<br />
原來如此,但若果我想使用[p]來換頁,會不會出現什麼問題?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<基本上在page模式裡,不太建議使用[p],因為容易引起混亂。<br />
<br />
(k ゚∀゚)<之後介紹的模式是vn,vn模式跟line模式有點相似,當我們換行時,吉里吉里會自動換行,並且等待點擊,效果等同[r]和[l]。<br />
<br />
(k ゚∀゚)<但跟line模式不同,當有空行的時候,吉里吉里會自動換頁,並自動將文字圖層的文字消除,效果等同[p]和[er],以下是範例。<br />
<br />
<pre class="sampletable"><span style="color: red;">[linemode mode=vn]</span>
這是範例
換到下一行
空行之後的下一行
</pre>
<br />
那豈不是不用再寫什麼[p]、[r]等來換行和換頁?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<vn模式是比較直觀,換行換頁都不需要任何指令。<br />
<br />
(k ゚∀゚)<下一個介紹的模式是tex,tex模式不太常使用,吉里吉里會忽略換行,不過當有空行的時候,吉里吉里會自動換頁,並自動將文字圖層的文字消除,以下是範例。<br />
<br />
<pre class="sampletable"><span style="color: red;">[linemode mode=tex]</span>
這是範例
換到下一行
空行之後的下一行
</pre>
<br />
(k ゚∀゚)<最後一個介紹的是free模式,free模式跟vn模式有點相似,當有空行的時候,吉里吉里會自動換頁,並自動將文字圖層的文字消除,不過當我們換行時,吉里吉里只會自動換行,並不會等待點擊,以下是範例。<br />
<br />
<pre class="sampletable"><span style="color: red;">[linemode mode=free]</span>
這是範例
換到下一行
空行之後的下一行
</pre>
<br />
這模式好像頗適合用在文章種類的遊戲。>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<是的,free模式適合一些經常要換行的遊戲,如果你的遊戲經常有一大段文章,free模式很適合你。<br />
<br />
(k ゚∀゚)<看來介紹也差不多了,下次再見。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com0tag:blogger.com,1999:blog-7302766091083905080.post-76733841319417342612012-06-15T21:30:00.001+08:002012-06-15T21:30:58.745+08:00KAG教學---陣列,變數(5)<a name='more'></a>(k ゚∀゚)<不知道大家有沒有想過,我們有時需要儲存大量的值,例如AVG遊戲利用變數來控制CG解禁與否。<br />
<br />
嗯,這的確需要大量變數來儲存這些值>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<不過這就有問題了,如果有一百個值豈不是需要一百個變數?還要為它們命名不同的名稱?<br />
<br />
這還真是令人煩惱的問題……>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<這情況有一個很好的解決方式,就是使用陣列(Array),陣列是一組變數,它們擁有相同的名稱,不過不同於變數,在KAG裡,我們必須告訴吉里吉里這變數是一個陣列,就像以下的範例。<br />
<br />
<pre class="sampletable">[eval exp="tf.arr=[]"]
</pre><br />
(k ゚∀゚)<又或者是以下的模樣。<br />
<br />
<pre class="sampletable">[eval exp="tf.arr=new Array()"]
</pre><br />
(k ゚∀゚)<上述兩種方式都是告訴吉里吉里這變數arr是一個陣列,現在我們可以利用這陣列來儲存大量的值。<br />
<br />
這陣列可以放多少個值?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<無論多少個也可以,吉里吉里裡的陣列是不需要決定其長度的。<br />
<br />
聽起來好像不錯,不過到底如何使用,既然它們的名稱都一樣,到底我要如何識別它們?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<陣列中的元素都有自己的索引(index),索引值由0開始,留意並不是由1開始,使用時就像以下的方式。<br />
<br />
<pre class="sampletable">[eval exp="<span style="color: red;">tf.arr=[]</span>"]
[eval exp="<span style="color: red;">tf.arr[0]=123</span>"]
[eval exp="<span style="color: red;">tf.arr[1]=1.1</span>"]
[eval exp="<span style="color: red;">tf.arr[2]='abc'</span>"]
arr[[0]裡的值是
[emb exp="tf.arr[0]"]
[r]
arr[[1]裡的值是
[emb exp="tf.arr[1]"]
[r]
arr[[2]裡的值是
[emb exp="tf.arr[2]"]
</pre><br />
(k ゚∀゚)<在上述的範例裡,arr這陣列有3個元素,分別被初始為123、1.1和"abc"。<br />
<br />
(k ゚∀゚)<我們亦可在告訴吉里吉里這變數是一個陣列之餘,同時進行初始化,就像以下的範例。<br />
<br />
<pre class="sampletable">[eval exp="<span style="color: red;">tf.arr=[123,1.1,'abc']</span>"]
arr[[0]裡的值是
[emb exp="tf.arr[0]"]
[r]
arr[[1]裡的值是
[emb exp="tf.arr[1]"]
[r]
arr[[2]裡的值是
[emb exp="tf.arr[2]"]
</pre><br />
(k ゚∀゚)<在上述的範例裡,吉里吉里會建立陣列,並初始化為123、1.1和"abc"。<br />
<br />
我還是不太懂如何使用,有沒有一些實際例子?>( ゚ω゚ s)<br />
<br />
<pre class="sampletable">[eval exp="tf.flag=[false,false,false]"]
[image storage="bg1" layer=base]
*start
[nowait]
[cm]
[image storage="fg1" layer=0 visible="&tf.flag[0]" pos=l]
[image storage="fg1" layer=1 visible="&tf.flag[1]" pos=c]
[image storage="fg1" layer=2 visible="&tf.flag[2]" pos=r]
[link exp="tf.flag[0]=!tf.flag[0]" target=*start]開關1[endlink]
[r]
[link exp="tf.flag[1]=!tf.flag[1]" target=*start]開關2[endlink]
[r]
[link exp="tf.flag[2]=!tf.flag[2]" target=*start]開關3[endlink]
[endnowait]
</pre><br />
(k ゚∀゚)<上述的範例是模擬一般AVG遊戲常見的flag,flag就好像開關一樣,控制開啟或關閉。不過說到底也只是一個變數,在上述的範例裡,我們建立一個叫flag的陣列,控制立繪顯示與否,當true時顯示立繪,當false時則不顯示立繪,在CG或BGM鑑賞模式介面製作時經常會應用到這方法。<br />
<br />
(k ゚∀゚)<今次介紹到這裡,下次再見。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com4tag:blogger.com,1999:blog-7302766091083905080.post-32066719092113311802012-06-04T04:55:00.000+08:002012-06-04T05:00:30.046+08:00KAG教學---可愛的滑鼠游標,cursor<a name='more'></a>你看看別人的遊戲有多麼漂亮的滑鼠游標,我也想在我的遊戲使用自製的滑鼠游標。>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<你說滑鼠游標嗎?吉里吉里可以設定滑鼠游標的模樣,不一定要使用預設的滑鼠游標。<br />
<br />
咦?吉里吉里可以做到?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<是的,我們可利用[cursor]來設定滑鼠游標的模樣,而滑鼠游標的檔案一般常見的是ani檔案或cur檔案,不過這裡並不教如何製作ani檔案或cur檔案了。<br />
<br />
(k ゚∀゚)<吉里吉里可以看到的滑鼠游標模樣其實只有4種,分別是標準、可點擊、等待和拖曳這4種。<br />
<br />
(k ゚∀゚)<標準是指通常的模樣,我們可利用default這屬性來設定它,看看以下的範例。<br />
<br />
<pre class="sampletable">[cursor <span style="color: red;">default="cursor1.ani"</span>]
</pre><br />
(k ゚∀゚)<我們在default這屬性上指定滑鼠游標的檔案名稱,留意必須加上副檔案,否則吉里吉里無法分辨的。<br />
<br />
(k ゚∀゚)<當滑鼠游標移到[link]或[button]等選項時,滑鼠游標會改變為可點擊的模樣,我們可利用pointed這屬性來設定它,看看以下的範例。<br />
<br />
<pre class="sampletable">[cursor <span style="color: red;">pointed="cursor1.ani"</span>]
[link]選項[endlink]
</pre><br />
原來如此,當滑鼠游標移到選項上,滑鼠游標的確改變了。>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<而當執行[l]或[p]時,滑鼠游標會改變等待點擊的模樣,我們可利用click這屬性來設定它。<br />
<br />
咦?為什麼平常好像沒有留意到這滑鼠游標的變化?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<因為這滑鼠游標的預設模樣跟通常狀態的是一樣,不過事實上可以改變它的,看看以下的範例。<br />
<br />
<pre class="sampletable">[cursor <span style="color: red;">click="cursor1.ani"</span>]
等待點擊的模樣[p][cm]
通常狀態的模樣
</pre><br />
(k ゚∀゚)<不過實際上我們甚少特別修改這游標,一般都設定將它跟通常狀態一樣。<br />
<br />
那麼快點介紹最後一個,到底是什麼拖曳?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<這個跟上一個相比,使用到的機會可以說是更少,拖曳是指透過[position]的draggable屬性,令文字圖層可以被拖曳,滑鼠游標會改變為可拖曳的模樣,我們可利用draggable這屬性來設定它,看看以下的範例。<br />
<br />
<pre class="sampletable">[cursor <span style="color: red;">draggable="cursor1.ani"</span>]
[image storage="bg1" page=fore layer=base]
[position page=fore layer=message0 left=0 top=320 height=160 width=640 draggable=true]
我是可拖曳的文字圖層
</pre><br />
不過我只是想在特殊的情況改變滑鼠游標,那麼如何回到原本預設的模樣?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<吉里吉里預設了常數代表Windows的滑鼠游標,有興趣可以看看<a href="http://www.blogger.com/blogger.g?blogID=7302766091083905080" hrelf="http://devdoc.kikyou.info/tvp/docs/kr2doc/contents/MouseCursors.html">マウスカーソル定数一覧</a>,裡面列出所有Windows的滑鼠游標和其常數名稱,看看以下的範例。<br />
<br />
<pre class="sampletable">[cursor default=&crDefault pointed=&crHandPoint click=&crDefault draggable=&crSizeAll]
</pre><br />
(k ゚∀゚)<在上述的範例裡,所有滑鼠游標變成了預設的模樣,留意常數前面記得要加上&這符號。<br />
<br />
(k ゚∀゚)<今次也差不多了,下一次再見吧。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com0tag:blogger.com,1999:blog-7302766091083905080.post-28900465430227491152012-05-26T06:06:00.000+08:002012-05-26T06:12:55.945+08:00KAG教學---吉里吉里可以輸入文字嗎,輸入欄<a name='more'></a>(k ゚∀゚)<若果有玩過RPG或養成遊戲,大家都有可能看過一些遊戲可設定主角的名稱,增加玩家對遊戲的代入感。<br />
<br />
我也想在我的遊戲增添這樣的功能,不過如何讓玩家輸入文字?吉里吉里有這樣的功能嗎?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<吉里吉里是可以製作輸入欄輸入文字,甚至也可以製作Checkbox給玩家勾選,並且把玩家輸入的值儲存到變數裡。<br />
<br />
(k ゚∀゚)<我們可以利用[edit]製作輸入欄,其屬性name可以指定將儲存在哪個變數,以下是範例。<br />
<br />
<pre class="sampletable">[image storage="bg1" layer=base page="fore"]
名字:
<span style="color: red;">[edit name="tf.name"]</span>
</pre><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfuUJv8oGnR5d1G0BePrYBScJ3Ta8aYJrvEkvc_kAErfKC_eEqwwKn-TjtkeEmQQBzrdXeFrjV7zT1DdTxRgr37fOTs501WPj-yuzfXzD_KLWWfU2cStvdaVZn_VHqLL9jz496v_cKLSGt/s1600/krkr_ch56_1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfuUJv8oGnR5d1G0BePrYBScJ3Ta8aYJrvEkvc_kAErfKC_eEqwwKn-TjtkeEmQQBzrdXeFrjV7zT1DdTxRgr37fOTs501WPj-yuzfXzD_KLWWfU2cStvdaVZn_VHqLL9jz496v_cKLSGt/s320/krkr_ch56_1.jpg" width="320" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
(k ゚∀゚)<在上述的範例裡,吉里吉里顯示了輸入欄給予玩家輸入文字,輸入欄的高度是根據文字大小而決定的。<br />
<br />
那麼現在是不是代表我在輸入欄輸入文字,變數tf.name就會把文字儲存起來?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<不是的,玩家輸入的文字並未儲存起來,這情況正如我們經常見到的程式一樣,往往在按下確定才讀取輸入欄輸入的文字。<br />
<br />
(k ゚∀゚)<而吉里吉里在執行[commit]時才真正將輸入欄的文字以字串的形式儲存在變數裡,以下是範例。<br />
<br />
<pre class="sampletable">[image storage="bg1" layer=base page="fore"]
名字:
[edit name="tf.name"]
[r]
[link target="*ok"]確定[endlink]
[s]
*ok
<span style="color: red;">[commit]</span>
[cm]
現在tf.name的值是
[emb exp="tf.name"]
</pre><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJJm-kK0yWi9Xe0vJqDxL2VhXp3o0Ryn0G443G01IT13Nyka1jJcpEZ6oQ396KPW0q06r_g2iIg_ZmJOEQ3XXyOmcpKb8Wip8dozrlDrHQwLw1Mtg4nATXoKwhBv3JNeyhTIuOYvHdAND5/s1600/krkr_ch56_2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJJm-kK0yWi9Xe0vJqDxL2VhXp3o0Ryn0G443G01IT13Nyka1jJcpEZ6oQ396KPW0q06r_g2iIg_ZmJOEQ3XXyOmcpKb8Wip8dozrlDrHQwLw1Mtg4nATXoKwhBv3JNeyhTIuOYvHdAND5/s320/krkr_ch56_2.jpg" width="320" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
(k ゚∀゚)<在上述的範例裡,當我們按下確定時,吉里吉里就會執行[commit],這時輸入欄的文字才會儲存到tf.name裡。<br />
<br />
原來如此……>( ゚ω゚ s)<br />
<br />
不過話說回來,我總覺這得輸入欄的外觀有點醜陋,而且跟遊戲介面的配色不太配合,有沒有辦法修改它?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<如果覺得輸入欄裡背景或文字的顏色不適合,可以利用bgcolor這屬性去修改輸入欄的背景顏色,並且利用color這屬性去修改輸入欄的文字顏色,看看以下的範例。<br />
<br />
<pre class="sampletable">[image storage="bg1" layer=base page="fore"]
名字:
[edit name="tf.name" <span style="color: red;">bgcolor=0xBBBBFF color=0xFFFFFF</span>]
</pre><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGsTPMLufZlvK6FZKr1RhJikUsuREeTGXLIrkTWBdCXcK9ykqh8E0E_kZW8BW4ZPvjOxeZ229t1td0U-GqoHMOVvW33JSyFM5JZit4wYhbRYGDuVSyaxNRjZ61JyD5S-_r7DwF3spUtnWM/s1600/krkr_ch56_3.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGsTPMLufZlvK6FZKr1RhJikUsuREeTGXLIrkTWBdCXcK9ykqh8E0E_kZW8BW4ZPvjOxeZ229t1td0U-GqoHMOVvW33JSyFM5JZit4wYhbRYGDuVSyaxNRjZ61JyD5S-_r7DwF3spUtnWM/s320/krkr_ch56_3.jpg" width="320" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
(k ゚∀゚)<在上述的範例裡,我們將背景顏色設定為0xBBBBFF,而文字顏色亦設定為白色。<br />
<br />
顏色已經調整得差不多,不過如果輸入欄裡背景可以再透明一點就好了……>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<透明度可以利用opacity屬性,其數值由0至255,數值是0代表完全透明,255代表完全不透明。以下是範例。<br />
<br />
<pre class="sampletable">[image storage="bg1" layer=base page="fore"]
名字:
[edit name="tf.name" bgcolor=0xBBBBFF color=0xFFFFFF <span style="color: red;">opacity=100</span>]
</pre><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmWkDCAxj7P3fasySowAixzOSv5L3UeCreow59WSKKNYFAurQ20YGMKoznvCkrIzai94C2_IhsK-2cW6WHE2LyM-p1bsElpydQv91PDbbx-5tajBO_-2WVYAuYXJ90L7jJuV6h2aAx9d0r/s1600/krkr_ch56_4.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmWkDCAxj7P3fasySowAixzOSv5L3UeCreow59WSKKNYFAurQ20YGMKoznvCkrIzai94C2_IhsK-2cW6WHE2LyM-p1bsElpydQv91PDbbx-5tajBO_-2WVYAuYXJ90L7jJuV6h2aAx9d0r/s320/krkr_ch56_4.jpg" width="320" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
(k ゚∀゚)<在上述的範例裡,輸入欄的透明度為100,跟預設的模樣更加透明。<br />
<br />
(k ゚∀゚)<我們還可調整輸入欄的長度和限制可輸入的最多字數,length屬性可以設定輸入欄的長度,以pixel為單位,maxchars屬性限制最多的字數,以下是範例。<br />
<br />
<pre class="sampletable">[image storage="bg1" layer=base page="fore"]
名字:
[edit name="tf.name" bgcolor=0xBBBBFF color=0xFFFFFF opacity=100 <span style="color: red;">length=150 maxchars=5</span>]
</pre><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ8qzX6JnEM8K1Ze6o1_dC-7JCJiJq0WWqiPf6eqYNPf-zBiFYh4eV2Ubjsyk9WSkZsGN3bV2o3Hg-F6yd8EsWv4hXLPXkU3u-gilxgR52_D5piYvtwUU2IQHj3amTFgUtXr4G3pA0NyE1/s1600/krkr_ch56_5.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ8qzX6JnEM8K1Ze6o1_dC-7JCJiJq0WWqiPf6eqYNPf-zBiFYh4eV2Ubjsyk9WSkZsGN3bV2o3Hg-F6yd8EsWv4hXLPXkU3u-gilxgR52_D5piYvtwUU2IQHj3amTFgUtXr4G3pA0NyE1/s320/krkr_ch56_5.jpg" width="320" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
(k ゚∀゚)<在上述的範例裡,輸入欄的長度為150,亦限制最多字數為5。<br />
<br />
(k ゚∀゚)<除了輸入欄,我們還可製作Checkbox給玩家勾選,簡單來說,就是那個網頁表格裡可以複選的方塊。<br />
<br />
不過Checkbox是可以複選的,如果是單選呢,吉里吉里有沒有類似Radiobox的東西?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<吉里吉里並沒有Radiobox等去進行單選,不過可以透過選項來取代。<br />
<br />
(k ゚∀゚)<我們可利用[checkbox]來製作Checkbox,其屬性name可以指定將儲存在哪個變數,以下是範例。<br />
<br />
<pre class="sampletable">[image storage="bg1" layer=base page="fore"]
請選擇您喜歡的寵物:
[r]
<span style="color: red;">[checkbox name="tf.cat"]</span>
貓
<span style="color: red;">[checkbox name="tf.dog"]</span>
狗
</pre><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhInlJIZVlOmYPqzPa9Rrq2djIiZA5ZYM5ViLPu5WUBBhzYGfKco8TdhPv0Is3fikgcbQvKhcdU9Ebb1ezJPrZnpjueOSQ2g-1MYG6XF4rdm1fKOjJkIKlv6OXJctWmurx4VzvQ8QRK9QPI/s1600/krkr_ch56_6.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhInlJIZVlOmYPqzPa9Rrq2djIiZA5ZYM5ViLPu5WUBBhzYGfKco8TdhPv0Is3fikgcbQvKhcdU9Ebb1ezJPrZnpjueOSQ2g-1MYG6XF4rdm1fKOjJkIKlv6OXJctWmurx4VzvQ8QRK9QPI/s320/krkr_ch56_6.jpg" width="320" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
不過如果選了之後,變數的值到底是什麼?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<如果勾選了的話,變數的值便是1,否則便是0。<br />
<br />
(k ゚∀゚)<跟輸入欄一樣,顏色和透明度也可以改變,可以利用bgcolor這屬性去修改背景顏色,利用color這屬性去修改文字顏色,並且利用opacity屬性去修改透明度。<br />
<br />
(k ゚∀゚)<以下是範例。<br />
<br />
<pre class="sampletable">[image storage="bg1" layer=base page="fore"]
請選擇您喜歡的寵物:
[r]
[checkbox name="tf.cat" <span style="color: red;">bgcolor=0xBBBBFF color=0xFFFFFF opacity=100</span>]
貓
[checkbox name="tf.dog" <span style="color: red;">bgcolor=0xBBBBFF color=0xFFFFFF opacity=100</span>]
狗
</pre><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0eZHTJ_fkPSxXwcGLcXUcadEGkXprMsycOcMky2K8q2-ies9P9mwHjl27Sl3lc65_62P_vrB99YU5UWFykGQQK16Sy6l8LsTJVBEGdq784OcasUxjs_Zh-LggBvmeUtLBKwe62H_DxESs/s1600/krkr_ch56_7.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0eZHTJ_fkPSxXwcGLcXUcadEGkXprMsycOcMky2K8q2-ies9P9mwHjl27Sl3lc65_62P_vrB99YU5UWFykGQQK16Sy6l8LsTJVBEGdq784OcasUxjs_Zh-LggBvmeUtLBKwe62H_DxESs/s320/krkr_ch56_7.jpg" width="320" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
(k ゚∀゚)<為了更加了解它們的用法,再來一個實際的範例。<br />
<br />
<pre class="sampletable">[image storage="bg1" layer=base page="fore"]
名字:
[edit name="tf.name" bgcolor=0xBBBBFF color=0xFFFFFF opacity=100 length=150 maxchars=5]
[r]
請選擇您喜歡的寵物:
[checkbox name="tf.cat" bgcolor=0xBBBBFF color=0xFFFFFF opacity=100]
貓
[checkbox name="tf.dog" bgcolor=0xBBBBFF color=0xFFFFFF opacity=100]
狗
[r]
[link target="*ok"]確定[endlink]
[s]
*ok
[commit]
[cm]
您的名字是
[emb exp="tf.name"]
[r]
[if exp="tf.cat&&tf.dog"]
您喜歡的寵物是貓和狗
[elsif exp="tf.cat"]
您喜歡的寵物是貓
[elsif exp="tf.dog"]
您喜歡的寵物是狗
[endif]
</pre><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhuGf5RoljMR0me6OMLY2PFPb37x-BFzowON_si1YCYJYbDe1AX-h4PwBDRwbMf_ispNbq0CBSOYe1NzNwWt13gkw1WBSzYe1Nt3nulFviahdzCgCbhDm-LDTV6lafFmxKgj1-qKzVXyNY/s1600/krkr_ch56_8.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhuGf5RoljMR0me6OMLY2PFPb37x-BFzowON_si1YCYJYbDe1AX-h4PwBDRwbMf_ispNbq0CBSOYe1NzNwWt13gkw1WBSzYe1Nt3nulFviahdzCgCbhDm-LDTV6lafFmxKgj1-qKzVXyNY/s320/krkr_ch56_8.jpg" width="320" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
(k ゚∀゚)<這次介紹差不多了,下次再見。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com3tag:blogger.com,1999:blog-7302766091083905080.post-56930639158684715172012-05-14T04:51:00.002+08:002012-05-14T04:58:21.950+08:00KAG教學---回到標題畫面,startanchor和gotostart<a name='more'></a>(k ゚∀゚)<一般來說,AVG遊戲都會提供一個回到標題畫面的按鈕,令玩家可以返回標題畫面,雖然可以用[jump]來返回標題畫面,不過有另一個比較適合的方法,就是[gotostart]。<br />
<br />
(k ゚∀゚)<玩家可以在功能列返回標題畫面,正如以下的例圖。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjysKtPOIqOJF6RArPAF7zbsaLUkbb1dWJVxtpudxtWLEGflzAb3jEN68fC00OF8_NEdbVQH4EMTYyNPYtAu1PI1Li6lh-ib_adsRDkPRs62dqchoYXJJE6Z1fBkGfCYu_Wl5IKDzecZN5H/s1600/krkr_ch55_1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjysKtPOIqOJF6RArPAF7zbsaLUkbb1dWJVxtpudxtWLEGflzAb3jEN68fC00OF8_NEdbVQH4EMTYyNPYtAu1PI1Li6lh-ib_adsRDkPRs62dqchoYXJJE6Z1fBkGfCYu_Wl5IKDzecZN5H/s320/krkr_ch55_1.jpg" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
不過為什麼好像不能按下去?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<因為[gotostart]的功能其實是透過讀檔,回到[startanchor]的位置,所以如果沒有[startanchor],[gotostart]就無法進行。<br />
<br />
(k ゚∀゚)<所以在解釋[gotostart]之前,我們先看看[startanchor]如何使用,以下是範例。<br />
<br />
<pre class="sampletable">*start|
[startanchor]
位置已經被記錄下去[p][cm]
嘗試按下在功能列的「最初に戻る」
</pre>
<br />
為什麼我如果不加入label標籤,[startanchor]好像不能記錄位置?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<[startanchor]實際上是利用存檔來儲存label位置,當按下在功能列的「最初に戻る」時,吉里吉里其實是讀檔,這有別於[jump]、[call]等,label標籤是用來存檔的。<br />
<br />
(k ゚∀゚)<[startanchor]有一個叫enabled的屬性,可以設定[gotostart]和功能列的「最初に戻る」有效與否,不過甚少有機會使用到吧……因為功能列的「最初に戻る」有效與否可以由Config.tjs的goToStartMenuItem.visible修改的。<br />
<br />
(k ゚∀゚)<而[gotostart]的功能就像按下在功能列的「最初に戻る」一樣,回到[startanchor]所儲存的位置,[gotostart]有一個叫ask的屬性,設定是否詢問玩家返回最初位置與否,預設值是false,即是不會詢問的。<br />
<br />
(k ゚∀゚)<以下是範例。<br />
<br />
<pre class="sampletable">*start|
[startanchor]
位置已經被記錄下去[p][cm]
再按一下就會返回最初位置[p][cm]
[gotostart]
</pre>
<br />
話說回來,如果是回到標題畫面,不可以使用[jump]嗎?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<使用[gotostart]的好處是因為它利用存檔來儲存label位置,這意味著遊戲會重新載入遊戲變數,遊戲變數變成一開始的狀態,但若果使用[jump],由於是由遊戲中途返回標題畫面,遊戲變數原本可能已經儲存了一些值,所以必須把所有變數進行初始化。<br />
<br />
(k ゚∀゚)<今次也差不多了,下一次再見吧。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com0tag:blogger.com,1999:blog-7302766091083905080.post-75548314788546384682012-05-08T22:54:00.002+08:002012-05-08T22:55:24.543+08:00TJS教學---array,陣列(1)<a name='more'></a>一個變數可以儲存一個值,如果有一百個值豈不是要宣告一百個變數,如果有一萬個值豈不是要宣告一萬個變數?>( ゚ω゚ s)<br />
<br />
光是宣告豈不是已經要寫一萬行,我該怎麼辦,難道要複製貼上嗎?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<我們的確不可能為了宣告一萬個變數而寫一萬行,而且還為它們命名不同的名稱。<br />
<br />
(k ゚∀゚)<我們當然有不用那麼麻煩的方法,就是使用陣列(Array),陣列是一組變數,它們擁有相同的名稱,宣告陣列的方式就像以下的範例。<br />
<br />
<pre class="sampletable">var 陣列名稱=new Array();
</pre><br />
跟之前宣告變數有很大的差別……>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<這其實是建立了一個Array類別的物件,不過大家可以先理解成建立了一組變數,它們的名稱都是相同。<br />
<br />
這陣列可以放多少個值?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<無論多少個也可以,吉里吉里裡的陣列是不需要宣告時決定陣列長度的。<br />
<br />
聽起來好像不錯,不過到底如何使用,既然它們的名稱都一樣,到底我要如何識別它們?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<陣列中的元素都有自己的索引(index),索引值由0開始,留意並不是由1開始,使用時就像以下的方式。<br />
<br />
<pre class="sampletable">陣列名稱[索引值]
</pre><br />
我還不太懂得如何用陣列?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<可以看看以下的範例。<br />
<br />
<pre class="sampletable">var array=new Array();
array[0]=123;
array[1]=1.1;
array[2]="abc";
</pre><br />
(k ゚∀゚)<在上述的範例裡,array這陣列有3個元素,分別被初始為123、1.1和"abc"。<br />
<br />
(k ゚∀゚)<我們亦可同時進行宣告和初始化,就像以下的範例。<br />
<br />
<pre class="sampletable">var array=[123,1.1,"abc"];
</pre><br />
(k ゚∀゚)<在上述的範例裡,吉里吉里會建立陣列,並初始化為123、1.1和"abc"。<br />
<br />
有沒有一些實際例子?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<可以看看以下的範例。<br />
<br />
<pre class="sampletable">var month=[31,28,31,30,31,30,31,31,30,31,30,31];
var date=new Date();
System.inform("現在是"+date.getMonth()+"月,這月份共有"+month[date.getMonth()-1]+"日。");
</pre><br />
(k ゚∀゚)<這個date可以取得系統時間,不過大家可以先不用理會它,詳細的以後會再介紹。<br />
<br />
(k ゚∀゚)<在上述的範例裡,我們用date.getMonth()取得了現在的月份,而我們有一個陣列month,裡面順序地儲存了每個月的日數,利用month[date.getMonth()-1]來取得相關的日數。<br />
<br />
為什麼是date.getMonth()-1而不是date.getMonth()?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<因為是索引值由0開始,所以1月的日數是儲存在month[0],2月的日數是儲存在month[1],如此類推,月份和索引值是相差1的。<br />
<br />
(k ゚∀゚)<今次介紹到這裡,下次再見。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com0tag:blogger.com,1999:blog-7302766091083905080.post-82238269604088306602012-04-25T00:44:00.000+08:002012-04-25T00:48:03.017+08:00KAG教學---終於有OP和ED,影片播放(1)<a name='more'></a>(k ゚∀゚)<今次介紹如何播放影片,遊戲裡最常見的情況是播放OP、ED等影片,而吉里吉里除了支援avi、wmv和mpg檔案之外,還可以播放swf檔案,即是flash,不過吉里吉里對flash的支援其實不太好,所以不建議用swf檔案來播放影片。<br />
<br />
播放影片要不要任何插件,會不會像播放背景音樂一樣載入插件?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<雖然某些檔案需要利用到krflash.dll和krmovie.dll這兩個插件,不過我們不需要刻意載入,吉里吉里會自動載入的。<br />
<br />
(k ゚∀゚)<KAG裡有[playvideo]來播放影片,當然[playvideo]裡有storage屬性,用來指定影片檔案名稱,而且需要加上副檔名。<br />
<br />
是不是以下這樣?>( ゚ω゚ s)<br />
<br />
<pre class="sampletable">[playvideo storage="video1.wmv"]
</pre>
<br />
為什麼只有聲音,沒有畫面的……>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<這種事情我之前也有提及過,除了文字圖層message0之外,其他圖層都預設為不顯示,而播放影片用的圖層亦一樣預設為不顯示。<br />
<br />
(k ゚∀゚)<實際使用時應該是以下的模樣。<br />
<br />
<pre class="sampletable">按一下播放影片[p][cm]
[video visible=true]
[playvideo storage="video1.wmv"]
[wv]
影片播放完畢
</pre>
<br />
(k ゚∀゚)<[video]是用來調整播放影片的相關設定,visible屬性可以設定顯示與否。<br />
<br />
(k ゚∀゚)<而[wv]則是等待影片播放完畢,[wv]還有一個屬性canskip,可以設定[wv]可否被略過,若果是true,當玩家點擊滑鼠時,[wv]被略過,不會等待影片播放結束。<br />
<br />
不過影片的高度和寬度好像不太適合,有沒有辦法修改?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<[video]裡有height和width兩個屬性來調整影片的高度和寬度,它們均以pixel為單位。以下是範例。<br />
<br />
<pre class="sampletable">按一下播放影片[p][cm]
[video visible=true height=480 width=640]
[playvideo storage="video1.wmv"]
[wv]
影片播放完畢
</pre>
<br />
(k ゚∀゚)<基本上上述的方法在一般情況下已經足夠了,例如播放OP、ED等影片,不過吉里吉里還有些播放影片的功能,這些就留待下一次再介紹。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com0tag:blogger.com,1999:blog-7302766091083905080.post-43782202027781933052012-04-14T04:51:00.000+08:002012-04-14T04:51:46.105+08:00TJS教學---break and continue,break與continue<a name='more'></a>(k ゚∀゚)<之前我們介紹了三種迴圈,分別是while、for和do-while迴圈,這些迴圈都可以處理不少常見迴圈的情況,不過有時候我們中途想離開迴圈或跳到下一次迴圈,這時我們可利用break與continue來控制。<br />
<br />
break? 之前介紹switch時不是有提及過? 我記得是用來離開switch的。>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<對呀,而在迴圈裡,break是用來立刻離開最接近的迴圈,以下是範例。<br />
<br />
<pre class="sampletable">var message="";
for(var count=0;count<10;count++){
<span style="color: red;">if(count==5)
break;</span>
message+=count+" ";
}
System.inform(message);
</pre><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8FT_fFMhkC6BUcZeoPUa1Kzji5X5v4_ZJobwTmLQb4OKmNnkbye1t5be5fmN8zydv8Ka2YN7qlRQxbYnwHUP715TXfpUPPtGnBuA97GGiZEKJxb8z3gi55Xjn3clftUML-mk8kYs9KReN/s1600/krkr_ch54_1.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8FT_fFMhkC6BUcZeoPUa1Kzji5X5v4_ZJobwTmLQb4OKmNnkbye1t5be5fmN8zydv8Ka2YN7qlRQxbYnwHUP715TXfpUPPtGnBuA97GGiZEKJxb8z3gi55Xjn3clftUML-mk8kYs9KReN/s1600/krkr_ch54_1.JPG" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
(k ゚∀゚)<在上述的範例裡,當count的值是5,break就被執行,並且離開迴圈,所以只會顯示到0至4的數字。<br />
<br />
我在意你說break會立刻離開最接近的迴圈,何謂最接近的迴圈?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<最接近的迴圈是指break上方看到最接近的迴圈,看看以下的範例。<br />
<br />
<pre class="sampletable">var message="";
for(var row=1;row<10;row++){
for(var col=0;col<10;col++){
<span style="color: red;">if(col==5)
break;</span>
message+=col+" ";
}
message+="\n";
}
System.inform(message);
</pre><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY6rwFBMdqZ1j0ABsxsjwGlZOlPlE6XLH5YKsw5Jt3e6lDlZmni3DO_GQ2eD0kAJgeeL5lbwLpDX-yjK4j1V2IdIGSeoXjPnTM-tHyVTH3ZwK1f0QmJCG3g70uTM1kICvNM5ZyKQa2anHl/s1600/krkr_ch54_2.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY6rwFBMdqZ1j0ABsxsjwGlZOlPlE6XLH5YKsw5Jt3e6lDlZmni3DO_GQ2eD0kAJgeeL5lbwLpDX-yjK4j1V2IdIGSeoXjPnTM-tHyVTH3ZwK1f0QmJCG3g70uTM1kICvNM5ZyKQa2anHl/s1600/krkr_ch54_2.JPG" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
(k ゚∀゚)<在上述的範例裡,當col的值是5,break就被執行,並且離開內部的迴圈,不過外部的迴圈並不會離開。<br />
<br />
(k ゚∀゚)<continue則是馬上執行下一次迴圈,看看以下的範例。<br />
<br />
<pre class="sampletable">var message="";
for(var count=0;count<10;count++){
<span style="color: red;">if(count==5)
continue;</span>
message+=count+" ";
}
System.inform(message);
</pre><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeTPGYo90r05AWVCoUDOzMjb___rRQuFtUq0QqZRzmKZKce_pSTCWkO2sqFqp_N8GlX_xttL6tuFCch7Q9moC9Z2yMCc5DG2BLYl__8JHZla5xuWCReZo0qUizgAg7JikRnQMLP1lxBf7t/s1600/krkr_ch54_3.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeTPGYo90r05AWVCoUDOzMjb___rRQuFtUq0QqZRzmKZKce_pSTCWkO2sqFqp_N8GlX_xttL6tuFCch7Q9moC9Z2yMCc5DG2BLYl__8JHZla5xuWCReZo0qUizgAg7JikRnQMLP1lxBf7t/s1600/krkr_ch54_3.JPG" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
(k ゚∀゚)<在上述的範例裡,當count的值是5,continue就被執行,並且馬上執行下一次迴圈,則不會message+=col+" "這一句,所以結果會顯示到0至4、6至9的數字,缺少了5這數字。<br />
<br />
原來如此!>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<再看看以下的範例。<br />
<br />
<pre class="sampletable">var message="";
for(var count=0;count<10;count++){
<span style="color: red;"> if(count==5)
continue;
if(count==8)
break;</span>
message+=count+" ";
}
System.inform(message); </pre><br />
唔……結果是不是顯示"0 1 2 3 4 6 7"?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<是的,當count的值是5,continue就被執行,所以沒有5這數字,當count的值是8,break就被執行,並離開迴圈,所以數字只會顯示到7就停下來,以下是結果。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhbPweyI4cWl-IEWoR9m9WscLXz47ljMklRn9aAIkkEQkk-Yp6C2L4GGkULJkQx0M4uMWam1tn_94unH3jnGrWCe3R3yN6_k7pUIVKBXg92i0vN0PSUzUsx1-ff4JJTsJGnDDViL7uoxia/s1600/krkr_ch54_4.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhbPweyI4cWl-IEWoR9m9WscLXz47ljMklRn9aAIkkEQkk-Yp6C2L4GGkULJkQx0M4uMWam1tn_94unH3jnGrWCe3R3yN6_k7pUIVKBXg92i0vN0PSUzUsx1-ff4JJTsJGnDDViL7uoxia/s1600/krkr_ch54_4.JPG" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
(k ゚∀゚)<今次介紹到這裡,下次再見。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com0tag:blogger.com,1999:blog-7302766091083905080.post-52945411732940157802012-04-08T04:04:00.000+08:002012-04-08T04:04:56.254+08:00TJS教學---do-while loop,do-while 迴圈<a name='more'></a>之前我們嘗試利用while迴圈來確保使用者已經輸入了資料,不過我發現相同的程式碼出現了兩次,這豈不是令程式碼變得複雜了嗎?有沒有辦法解決它?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<由於while迴圈不一定被執行,所以我們在while迴圈前面先輸入一次,有問題的話就會進入while迴圈,要再輸入一次,就好像以下的範例。<br />
<br />
<pre class="sampletable">var message=System.inputString("","請輸入名字","");
while(message === void || message == ""){
message=System.inputString("","請輸入名字","");
}
System.inform("您的名字是"+message);</pre><br />
(k ゚∀゚)<這範例或許看不出來,但如果while迴圈裡有大量程式碼,重複部分就變得很多了,所以我們現在介紹do-while迴圈。<br />
<br />
(k ゚∀゚)<while迴圈和do-while迴圈的不同之處是,while迴圈在進行迴圈之前會判斷條件式是否成立,do-while迴圈在執行迴圈本體之後才會判斷條件式是否成立,以下是其用法和流程圖。<br />
<br />
<pre class="sampletable">do{
陳述句1;
陳述句2;
}while(條件式);</pre><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE_xUEip21wXCDSvVm9MrMcJVoThD4zXKhg-9erZ-VS_TYoFqeNexHSx2d5OgXCcSiBmhF_yDEQdXakz_OpmnzVq0isXaPHuLJM0ATFoln9GpHgYImOvs2fHSGn28x72IO8W_D9O0ib2NM/s1600/krkr_ch53_1.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE_xUEip21wXCDSvVm9MrMcJVoThD4zXKhg-9erZ-VS_TYoFqeNexHSx2d5OgXCcSiBmhF_yDEQdXakz_OpmnzVq0isXaPHuLJM0ATFoln9GpHgYImOvs2fHSGn28x72IO8W_D9O0ib2NM/s320/krkr_ch53_1.JPG" width="221" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
跟while迴圈的差距好像很大。>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<其實不是的,雖然兩者的模樣有不少差距,除了判斷條件式的位置有差別之外,while迴圈和do-while迴圈是一樣的,不過要留意do-while迴圈的while後面有分號作為結束,這是不少人會經常犯錯的部分。<br />
<br />
(k ゚∀゚)<如果將上述的範例轉換do-while迴圈,就會好像以下的範例。<br />
<br />
<pre class="sampletable">var message;
do{
message=System.inputString("","請輸入名字","");
}while(message === void || message == "");
System.inform("您的名字是"+message);</pre><br />
(k ゚∀゚)<do-while迴圈的好處是迴圈本體一定被執行至少一次,這對輸入資料的動作非常有用的,因為我們檢查資料是否正確之前,必須至少輸入了資料一次,這時do-while迴圈就幫助了不少。<br />
<br />
(k ゚∀゚)<今次介紹到這裡,下次再見。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com0tag:blogger.com,1999:blog-7302766091083905080.post-80035578763251381522012-04-06T03:53:00.001+08:002012-04-06T03:54:16.495+08:00TJS教學---for loop,for 迴圈<a name='more'></a>(k ゚∀゚)<上次我們介紹了while迴圈,今次我們則介紹for迴圈,先看看以下的用法。<br />
<br />
<pre class="sampletable">for(初始化;條件式;更新){
陳述句1;
陳述句2;
}
</pre><br />
(k ゚∀゚)<使用for迴圈的特別之處是它把迴圈的初始化、條件式和更新的部分都放在同一位置,程式碼的可讀性增加,看起來更加整齊,而且由於放在同一位置,管理也會十分方便,以下是流程圖。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiajrtxQcdKo6iaSkxROYjbshO2l3fTBQpyNmPIcKNayrvdC4EAtxgmJRj-N1mPofkDq0mY5J90UPerUnL_XVpOuVGmGV02XQJ-Y9-lf1-RltRse5SVtwkIHakgneweqM4AJVBC5orfq27e/s1600/krkr_ch52_1.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiajrtxQcdKo6iaSkxROYjbshO2l3fTBQpyNmPIcKNayrvdC4EAtxgmJRj-N1mPofkDq0mY5J90UPerUnL_XVpOuVGmGV02XQJ-Y9-lf1-RltRse5SVtwkIHakgneweqM4AJVBC5orfq27e/s320/krkr_ch52_1.JPG" width="180" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
除此之外,while迴圈和for迴圈有沒有其他差別?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<兩者的用法也是差不多,以下是一個while迴圈的範例。<br />
<br />
<pre class="sampletable">var count=1;
var message="";
while(count<=10){
message+=count+" ";
count++;
}
System.inform(message);
</pre><br />
(k ゚∀゚)<上述的範例亦可以轉換for迴圈,看看以下的範例。 <br />
<br />
<pre class="sampletable">var count;
var message="";
for(count=1;count<=10;count++){
message+=count+" ";
}
System.inform(message);
</pre><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfidP8E-W-zbMbLi-cVFu6RVS6XYXS9C6aeTCRzNH9WBjg9cDP7U3YGm5QMWOEnqlZ63XwmIN8jFPgn-GxEljcE9KEHRQuKMYp7HnnrV18CWBDQX0dRO2bO4irjQJeGupUMok3BPo3rFF6/s1600/krkr_ch52_2.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfidP8E-W-zbMbLi-cVFu6RVS6XYXS9C6aeTCRzNH9WBjg9cDP7U3YGm5QMWOEnqlZ63XwmIN8jFPgn-GxEljcE9KEHRQuKMYp7HnnrV18CWBDQX0dRO2bO4irjQJeGupUMok3BPo3rFF6/s1600/krkr_ch52_2.JPG" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
的確變得容易管理,放在同一位置的話就不用經常尋找它們而煩惱。>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<跟while一樣,我們可以在for迴圈裡宣告變數,看看以下的範例。 <br />
<br />
<pre class="sampletable">var count;
var message="";
for(count=1;count<=10;count++){
var result=count*2;
message+=result+" ";
}
System.inform(message);
</pre><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir8SktNp-kUZr5ezwK-xeRrW6jAqivmt4mUXyxoEjNSIZ-3EidS8TqVHAaKWeNt-ENwcug3NB4TWdG25s8M6ejWopagJLtYu2_pPg9NXhigec0KUFFWc44MBwDF3qQiTCgUpoMm_zVl501/s1600/krkr_ch52_3.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir8SktNp-kUZr5ezwK-xeRrW6jAqivmt4mUXyxoEjNSIZ-3EidS8TqVHAaKWeNt-ENwcug3NB4TWdG25s8M6ejWopagJLtYu2_pPg9NXhigec0KUFFWc44MBwDF3qQiTCgUpoMm_zVl501/s1600/krkr_ch52_3.JPG" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
(k ゚∀゚)<但留意for迴圈裡宣告的變數只能迴圈裡使用,當一離開了迴圈,這變數就不存在,這意味著迴圈裡宣告的變數無法在迴圈外面使用,所以迴圈裡宣告的變數只用來進行迴圈裡的運算。<br />
<br />
(k ゚∀゚)<除此之外,我們甚至可以在初始化的部分宣告變數,看看以下的範例。<br />
<br />
<pre class="sampletable">var message="";
for(var count=1;count<=10;count++){
message+=count+" ";
}
System.inform(message);
</pre><br />
既然在for迴圈裡宣告,是不是也代表一離開了迴圈,這變數就不存在?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<是的,所以若果之後需要用到這變數的話,就不應該在迴圈裡宣告。<br />
<br />
我有問題,若果初始化、條件式和更新這三部分缺了一兩個,可不可以用for迴圈?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<可以的,如果沒有的話不寫它就可以,看看以下的範例(請按住Ctrl + Alt + F12數秒,吉里吉里會強制終止)。<br />
<br />
<pre class="sampletable">for(;;){
System.inform("這就是無窮迴圈");
}
</pre><br />
(k ゚∀゚)<在上述的範例裡,這個for迴圈並沒有初始化、條件式和更新這三部分,由於沒有條件式來離開迴圈,所以這亦是無窮迴圈。<br />
<br />
(k ゚∀゚)<當然,我們一般都不鼓勵這麼寫,我們使用for迴圈時通常都有初始化、條件式和更新這三部分,而且初始化和更新都不會太複雜。<br />
<br />
(k ゚∀゚)<今次介紹到這裡,下次再見。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com0tag:blogger.com,1999:blog-7302766091083905080.post-16224661776065367832012-03-28T17:31:00.000+08:002012-09-18T03:33:41.642+08:00KAGEX教學---KAGEX導入<a name='more'></a>(k ゚∀゚)<大家好,本篇主要介紹KAGEX的基本資料,令大家理解什麼是KAGEX。<br />
<br />
(k ゚∀゚)<在介紹KAGEX之前,我先重新介紹吉里吉里,吉里吉里是以TJS這程式語言來做底層的開發,由於TJS對一些不懂程式語言的人實在是太難學了,W.Dee 就用TJS定義了KAG這種程式語言出來,也就是我們經常用到的那些tag了。<br />
<br />
這些我知道了,這麼KAGEX到底是什麼?>( ゚ω゚ s) <br />
<br />
(k ゚∀゚)<KAGEX是由 渡邊剛 先生把KAG擴充後的產物,而且增加和改寫了某些KAG的功能。<br />
<br />
(k ゚∀゚)<例如KAGEX是增加了[action],[action]可以輕易地做到不少動作效果。<br />
<br />
還有沒有其他的?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<KAGEX增加了autolabelmode,執行到[p]時就會自動加一個標籤label,這對存檔和讀檔來說,autolabelmode是十分實用的功能。<br />
<br />
那麼哪裡可以下載到KAGEX版本?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<由於網絡上很容易找到已經翻譯成繁體中文的版本,所以在此不提供載點了,有興趣的話可以參考以下的網站---<a href="http://recrit.game-ss.com/">Recrit</a>(由於Recrit的載點似乎已經失效,所以上載了一個暫時的<a href="http://www.mediafire.com/?9e73arbg9g38bhe">載點</a>)<br />
<br />
話說為什麼突然介紹KAGEX?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<當然是為了寫教學而準備,畢竟由於有繁體中文版本的關係,有不少台灣與香港的人都利用KAGEX版本,所以介紹一下KAGEX版本有增加什麼功能,令製作遊戲時更加得心應手。<br />
<br />
(k ゚∀゚)<今次也差不多了,下次開始介紹KAGEX新增了的功能,下次再見!kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com7tag:blogger.com,1999:blog-7302766091083905080.post-362091630802652582012-03-16T03:43:00.000+08:002012-03-16T03:43:05.277+08:00KAG教學---用KAG來存檔和讀檔,save&load(2)<a name='more'></a>(k ゚∀゚)<上一次介紹了基本的存檔和讀檔,不過相信大家都不太想利用吉里吉里的功能列來存檔和讀檔,而是自製一個存檔和讀檔介面給玩家,所以今次會介紹[save]和[load]。<br />
<br />
[save]和[load]是用來存檔和讀檔嗎?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<對呀,它們的效果跟功能列上的存檔和讀檔一樣,而且[save]和[load]還可以設定存檔和讀檔時是否詢問玩家。<br />
<br />
正常來說,我們不是應該詢問玩家是否存檔和讀檔嗎?有什麼時候會不詢問玩家?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<有些遊戲提供了自動存檔的功能,每當通過劇情的某個位置,遊戲就會自動存檔,這時我們就不會詢問玩家,當然,玩家也不希望被詢問是否存檔。<br />
<br />
(k ゚∀゚)<不過在介紹[save]和[load]之前,我們先理解一下吉里吉里有兩種機制來存檔,第一種是存檔時會開啟一個對話框來存檔,好處是存檔數量沒有限制,存檔位置也可以隨意,第二種是由吉里吉里去管理,存檔數量會受numBookMarks限制,存檔位置也有限制,兩者是由Config.tjs裡的freeSaveDataMode控制,。一般來說,現在的遊戲極大部分都使用第二種,甚少會使用第一種。<br />
<br />
既然你說存檔位置有限制,那到底儲存在哪裡?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<在不修改Config.tjs的情況下,它們儲存在savedata資料夾裡,檔案的名稱為data0.kdt等,名稱上的數字是對應的儲存位置編號。<br />
<br />
那麼[save]和[load]怎樣使用才能儲存和讀取這些檔案,不如先說[save]。>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<嗯,那先看以下的範例。<br />
<br />
<pre class="sampletable">label1|儲存點1
[save place=0 ask=false]
</pre><br />
(k ゚∀゚)<當執行完上述的範例,吉里吉里把存檔儲存在儲存位置0裡,place代表儲存的位置,預設值是0,ask是設定詢問與否,true代表會詢問是否存檔,false則不會詢問,預設值是false。<br />
<br />
(k ゚∀゚)<而place屬性的值理論上是任何正整數都可以,但是由999至1999的位置有特別用途,所以應該避免使用,當place屬性的值是0時,吉里吉里儲存到data0.kdt裡,如果place屬性的值是1,檔案名稱便是data1.kdt,如此類推。<br />
<br />
那麼[load]呢?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<基本上跟[save]差不多,那先看以下的範例。<br />
<br />
<pre class="sampletable">label1|儲存點1
[load place=0 ask=false]
</pre><br />
(k ゚∀゚)<當執行完上述的範例,吉里吉里把讀取儲存在儲存位置0裡的儲存檔,place代表讀取的位置,預設值是0,ask是設定詢問與否,true代表會詢問是否讀檔,false則不會詢問,預設值是false。<br />
<br />
(k ゚∀゚)<如果[load]讀取的儲存位置沒有該檔案,吉里吉里會忽略這個[load],例如place屬性的值是0,但若果沒有data0.kdt這個檔案,吉里吉里就會忽略它。<br />
<br />
(k ゚∀゚)<今次先介紹到這裡,至於如何製作一個存檔和讀檔介面,以後有機會才介紹吧。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com8tag:blogger.com,1999:blog-7302766091083905080.post-83612580281889827692012-03-11T16:55:00.000+08:002012-03-11T16:55:43.337+08:00TJS教學(補充篇)---loop,迴圈<a name='more'></a>其實我還是不太理解迴圈的結構,可不可以再講解一下?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<嗯,那麼我從頭開始解釋迴圈,迴圈是一種很常見的流程控制,意指是一段在程式中只出現一次,但可能會連續執行多次的程式碼。<br />
<br />
這個我理解,但我還是不知道基本的迴圈該如何寫?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<雖然迴圈的模樣因情況而異,但一般來說,一個常見的迴圈可以分為四個部分,分別是初始化、條件式、迴圈本體和更新這四個部分,初始化是指變數進行初始化,這變數通常是與條件式有關,而條件式是決定迴圈是否繼續執行,當條件式成立時,就將會執行迴圈本體,當執行完迴圈本體,我們就會更新條件式的變數,之後再檢查條件式是否成立。<br />
<br />
(k ゚∀゚)<我們看看以下的範例。<br />
<br />
<pre class="sampletable">var count=1;
var message="";
while(count<=10){
message+=count+" ";
count++;
}
System.inform(message);
</pre><br />
(k ゚∀゚)<這是上一次的範例,這個迴圈其實有以上談及到的四個部分,在執行迴圈之前,我們先將相關的變數進行初始化,就像以下紅字的部分。<br />
<br />
<pre class="sampletable"><span style="color: red;">var count=1;
var message="";</span>
while(count<=10){
message+=count+" ";
count++;
}
System.inform(message);
</pre><br />
(k ゚∀゚)<之後迴圈會利用條件式來決定是否繼續執行,這亦是逃脫迴圈的位置,因為吉里吉里會在這裡決定是否離開迴圈。以下紅字的部分是相關的程式碼。<br />
<br />
<pre class="sampletable">var count=1;
var message="";
while(<span style="color: red;">count<=10</span>){
message+=count+" ";
count++;
}
System.inform(message);
</pre><br />
(k ゚∀゚)<當條件式成立時,就將會執行迴圈本體,也就是我們真正想重複執行的部分,迴圈本體程式碼的行數可以很多,取決於我們寫的是什麼,以下紅字的部分是相關的程式碼。<br />
<br />
<pre class="sampletable">var count=1;
var message="";
while(count<=10){
<span style="color: red;">message+=count+" ";</span>
count++;
}
System.inform(message);
</pre><br />
(k ゚∀゚)<當執行完迴圈本體之後,我們就會更新條件式的變數,之後再檢查條件式是否成立。<br />
<br />
我們是不是一定要更新?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<若果我們不進行更新的話,條件式的結果就不會改變,令條件式變成無窮迴圈。<br />
<br />
(k ゚∀゚)<以下紅字的部分是相關的程式碼。<br />
<br />
<pre class="sampletable">var count=1;
var message="";
while(count<=10){
message+=count+" ";
<span style="color: red;">count++;</span>
}
System.inform(message);
</pre><br />
(k ゚∀゚)<以上就是迴圈的常見結構,大部分迴圈都是這樣的結構。<br />
<br />
(k ゚∀゚)<有時候,我們亦會根據迴圈停止的條件來分類。<br />
<br />
(k ゚∀゚)<第一種是counter-controlled loop(計數控制迴圈),這種迴圈有一個計數器(counter),這個計數器是用來記錄迴圈執行的次數,我們亦可確實地預知迴圈執行的次數,例如上述的範例就是counter-controlled loop,變數count則是計數器,我們亦可預知迴圈會執行10次(由1至10)。<br />
<br />
原來如此,的確很容易看出迴圈會執行多少次。>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<第二種是sentinel-controlled loop,當變數是個特殊的值,迴圈就會停止,這個值稱為sentinel value,通常我們並不知道迴圈何時停止,例如計算平均數,我們不斷輸入一些正整數,直到輸入-1為止,我們無法得知要輸入多少個正整數,所以利用一個沒有使用到的值來決定是否停止。<br />
<br />
(k ゚∀゚)<另外,這種利用條件式來決定是否繼續的迴圈,我們亦稱之為condition-controlled loop(條件控制迴圈)。<br />
<br />
(k ゚∀゚)<今次先介紹到這裡,下次再見。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com0tag:blogger.com,1999:blog-7302766091083905080.post-37848407069956896442012-03-05T13:42:00.001+08:002012-03-05T13:42:44.982+08:00KAG教學---神奇的&,變數(4)<a name='more'></a>我已經學懂如何顯示變數,或者是如何把變數用到[if]等,不過總覺得好像還欠缺了一個重要的用途啊……>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<什麼用途?<br />
<br />
變數能不能使用到屬性等的地方上,例如我用變數來儲存著文字的字型大小,之後用在[deffont]的size屬性內,吉里吉里能不能做到的?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<可以的,先看看以下的範例。<br />
<br />
<pre class="sampletable">[eval exp="tf.size=50"]
改變前的文字[l][r]
[deffont <span style="color: red;">size=&tf.size</span>]
[resetfont]
改變後的文字</pre><br />
(k ゚∀゚)<當我們在變數前面寫上&,就可以把變數使用到其他地方,甚至可以用label標籤存檔時的名稱也可以,看看以下的範例。<br />
<br />
<pre class="sampletable">*label1|&tf.name
</pre><br />
(k ゚∀゚)<在上述的範例裡,存檔時的名字是將會是tf.name的值。<br />
<br />
(k ゚∀゚)<我們亦可以在屬性上把變數進行運算,看看以下的範例。<br />
<br />
<pre class="sampletable">[eval exp="tf.size=50"]
改變前的文字[l][r]
[deffont <span style="color: red;">size=&tf.size*2</span>]
[resetfont]
改變後的文字</pre><br />
上述的範例是不是把tf.size乘以2,即是100,所以字型大小將會是100?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<是的。<br />
<br />
(k ゚∀゚)<這在遊戲裡是十分有用的,例如調整一些設定值,雖然我們Config.tjs進行各種基本設定,但是這些設定無法在執行時修改,這是因為Config.tjs裡的值都是白紙黑字地寫在檔案內,事實上我們可以利用系統變數儲存著這些設定值,一開始執行遊戲時就利用系統變數來設定,當玩家透過設定畫面修改設定時,其實實際只是修改了系統變數的值。<br />
<br />
(k ゚∀゚)<實際應用的話,我們之後才介紹,總而言之變數的用途可以是十分廣泛的。<br />
<br />
(k ゚∀゚)<今次也差不多了,下次再見吧。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com0tag:blogger.com,1999:blog-7302766091083905080.post-84655711269688577732012-03-01T19:11:00.000+08:002012-03-01T19:11:09.393+08:00KAG教學---音量與方向.淡出與淡入,播放音效(2)<a name='more'></a>既然有辨法在遊戲裡調整背景音樂的音量,那麼音量應該也可以調整一下音量吧?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<當然可以,我們可以用[seopt]來調整音量,[seopt]有兩個屬性來調整音量,分別是volume和gvolume,兩個都是調整音效的音量百分率,數值為0至100,100是正常音量,如果忽略的話代表音量不變。<br />
<br />
為什麼有兩個相同功能的屬性?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<volume是指個別的音量,由於每個音效可以有不同的緩衝區,我們可以用buf屬性指定個別的音效來調整音量,而gvolume是全域音量,全域音量是遊戲裡的整體音量,全域音量會記錄於系統變數裡,所以通常用於音量設定介面上的調整音量功能。<br />
<br />
(k ゚∀゚)<而實際播放的音量是volume和gvolume兩個音量的百分率相乘,看看以下的範例。<br />
<br />
<pre class="sampletable">[playse buf=0 storage="se1"]
<span style="color: red;">[seopt buf=0 volume=50 gvolume=50]</span>
播放SE1,音量是原本的25%
</pre><br />
(k ゚∀゚)<在上述的範例裡,實際播放的音量是0.5x0.5=0.25,音量是原本的25%。<br />
<br />
(k ゚∀゚)<除此之外,我們還可以使用[seopt]的pan屬性來調整音量的左右平衡。<br />
<br />
什麼是左右平衡?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<即是左邊音量和右邊音量的比重可以調整,pan的值是由-100至100,-100代表只有左邊有聲音,100代表只有右邊有聲音,0代表中央。<br />
<br />
(k ゚∀゚)<看看以下的範例。<br />
<br />
<pre class="sampletable">[playse buf=0 storage="se1"]
[seopt buf=0 <span style="color: red;">pan=100</span> gvolume=100]
播放SE1,只有右邊有聲音[p][cm]
[seopt buf=0 <span style="color: red;">pan=-100</span> gvolume=100]
播放SE1,只有左邊有聲音[p][cm]
[seopt buf=0 <span style="color: red;">pan=0</span> gvolume=100]
播放SE1,返回正常
</pre><br />
這麼我豈不是可以用來調整聲音的方向?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<嗯,我們的確可以用[seopt]來做到聲音好像從左邊或右邊來的,不過如果是其他更仔細的方向的話,就應該由音效本身去調整。<br />
<br />
既然有[seopt],是不是也有[fadese]?我記得播放背景音樂裡有這種東西。>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<的確是有[fadese]的,[fadese]同樣是調整音量,而且有淡入的效果,[fadese]有三個屬性,分別是buf、volume和time,buf是設定哪個緩衝區,time是設定淡入的所需時間,以微秒(ms)為單位,volume是調整背景音樂的音量百分率,數值為0至100,100是正常音量,如果忽略的話代表音量不變,要留意[fadese]是不能調整全域音量和調整音量的左右平衡,想調整的話就要用[seopt]。<br />
<br />
(k ゚∀゚)<看看以下的範例。<br />
<br />
<pre class="sampletable">[seopt buf=0 gvolume=100]
[playse buf=0 storage="se1"]
播放SE1,音量是100%
<span style="color: red;">[fadese buf=0 volume=50 time=3000]</span>
音量是原本的50%
</pre><br />
(k ゚∀゚)<在上述的範例裡, 音效花了3秒鐘把音量由100%減至50%。<br />
<br />
那麼有沒有辦法去暫停音效,就好像背景音樂一樣?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<沒有,這是背景音樂和音效其中一個差別,我們是沒法暫停音效的,只可以停止音效。<br />
<br />
(k ゚∀゚)<今次也差不多了,下一次再見吧。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com0tag:blogger.com,1999:blog-7302766091083905080.post-92172380526377526532012-02-27T03:20:00.001+08:002012-02-27T03:20:35.322+08:00TJS教學(補充篇)---short-circuit evaluation,捷徑計算<a name='more'></a>(k ゚∀゚)<short-circuit evaluation的翻譯可說是五花八門,可以稱為捷徑計算、短路計算、最小化計算等等,在不少程式語言裡,當表達式的結果已經確定時,程式就不會再進行運算,吉里吉里亦有採用這種運算策略。<br />
<br />
為什麼要這樣做?>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<它的好處是減少不必要的運算,因為結果已經確定了,就不必浪費時間去運算,看看以下的範例。<br />
<br />
<pre class="sampletable">var a=0;
var b=7;
if(a && b%2==1)
System.inform("條件式是true");
else
System.inform("條件式是false");
</pre><br />
(k ゚∀゚)<由於AND左邊的a已經是false,無論右邊的結果是什麼,最後都是得到false,所以b%2==1是不會運算的,以下是運算的步驟。<br />
<br />
<pre class="sampletable">a && b%2==1
0 && b%2==1 //已經確定是false
0
</pre><br />
的確減省了不少運算啊。>( ゚ω゚ s)<br />
<br />
(k ゚∀゚)<不過有時候這導致運算錯誤,看看以下的範例。<br />
<br />
<pre class="sampletable">var a=1;
var b=1;
var c=a++ || b++;
System.inform("a="+a+" ,b="+b+" ,c="+c);
</pre><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhccfa2qf8r_bxdmoGSCQMSZsQp2mEij1qAG5H7nnjhSRYqDhaOWqQo-Qi0xLeXXmajX7g8Yf377lAvFWoB0gVJui3M0Srnw5r-Hnl7zWsFSovbdXtyr8yXoSnf5Nnh2Abl14rbY0WEyAgO/s1600/krkr_ch51_1.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhccfa2qf8r_bxdmoGSCQMSZsQp2mEij1qAG5H7nnjhSRYqDhaOWqQo-Qi0xLeXXmajX7g8Yf377lAvFWoB0gVJui3M0Srnw5r-Hnl7zWsFSovbdXtyr8yXoSnf5Nnh2Abl14rbY0WEyAgO/s1600/krkr_ch51_1.JPG" /></a><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
(k ゚∀゚)<在上述的範例裡,結果卻十分有趣,雖然我們寫了b++,但b的值最後並沒有増加,這因為OR左邊的a++已經是true,無論右邊的結果是什麼,最後都是得到true,所以吉里吉里不會執行b++的部分,以下是運算的步驟。<br />
<br />
<pre class="sampletable">c=a++ || b++
c=1 || b++ //已經確定是true
c=1 //a的值最後增加1
</pre><br />
(k ゚∀゚)<由於表達式不一定整個都被執行,這有可能做成嚴重的錯誤,這主要原因是我們在表達式裡,把值指定給變數,雖然有些人喜歡利用這特性來簡化程式碼,但初學者應該盡量避免。<br />
<br />
(k ゚∀゚)<今次先介紹到這裡,下次再見。kibitzhttp://www.blogger.com/profile/08669289048151715948noreply@blogger.com0