RM的腳本教學–事件指令跟插件
前言
你好!這裡是菜逼八程式銷魂眼前陣子為了做RMMV的插件而開始首次開認真捉摸RM的程式結構
結果踏上了從零開始的解析RM程式生活也許是小弟的搜尋能力不足,可能已經有更詳細的教學文,如果真有那還請告知小弟一聲
就如大家所知道的那樣,接手別人寫下來的系統絕對不是一件好受的事
雖然說RM的系統已經不算寫的很爛,但是我還是花了一個多星期才搞懂一點點
也可能因為小弟是菜逼八,所以才有這樣的感想吧
無論如何,為了減少以後有同樣的人走上這條冤枉路的機率,於是這篇文就誕生了
溫馨提示
1. 本文的例子大部分以MV版本跟JS語言為準
不過其他版本的使用者也不用擔心,RM這麼多的系列以來
系統的結構好像都大同小異,至少XP開始好像是…(先戴頭盔)
2. 善用已有資源
其實自己辜狗一下就一堆相關的教學啦,如果真的有需要再跟小弟說吧
4. 歡迎糾正跟提出建議
由於RM的程式碼實在是太多,以下只解說小部份
實用例子暫時先不透露,大家可以想想怎麼應用
歡迎問問題
5. 下面分為事件指令代碼/參數、插件參數/指令,4個部份
事件指令代碼
就如大家所知道的那樣,事件頁是程式碼圖形介面化後的型態
那麼事件頁程式碼化後的又是什麼樣子呢
以下舉個例子:
以上事件頁有多少個事件指令?
沒錯!是4個:顯示文本、顯示選項、兩個操作變量
那麼程式碼化後又有多少個指令呢?(答案反白,希望你先想一想)
11個,因為事件頁有11行包括最後一行空白
那麼這些指令內又涉及了什麼functions呢,這裡就要打開內建的JS檔一看究竟了
所有與事件指令有關的fuctions應該都在上圖objects檔案的Game_Interpreter這個class裡了
那麼要怎麼知道每個指令是對應哪個function呢?
問它就好了啊XD
我這裡做了一個loop來問整頁指令的代碼
this._list代表這個事件頁指令的陣列
用length則能找出這個事件頁有多少行
陣列內的數代表這是第幾行指令,也可以用this._index代表當前是第幾行
例如this._list[this._index]代表當前的指令,this._list[0]代表第一行的指令
注意:index是從0開始算的
也可以用this.currentCommand()代表this._list[this._index] code則用作取得指令的代碼
$gameMessage代表文本框框,add代表顯示在下一行
像$gameMessage這種呼叫object的句法都可以在這裡找到,下面不會再多說 注意:文本只能顯示strings,不能顯示數值,所以要先轉換成string再顯示
加上我之後加進去的3行指令有14個指令
至於這些數字代表什麼,那就在Game_Interpreter這個class裡找吧
是的你沒看錯!小弟我最初在幾萬行的程式裡爬走才找到這些指令的來源 因為當時不知道指令的結構,希望大家別像我這樣走冤枉路
每個代碼對應function的名稱
這裡就不詳解每個function裡面裝了什麼了,真解起來這要多長啊...
大家可以先自己嚐試解,真的有部份function需要小弟詳解就再提出吧
機智的你可能已經發現了,怎麼沒有command0這個function?
沒錯!0就是事件頁最後一行指令
事件指令參數
跟用code取得指令的代碼同理,用paraemters則能取得指令的參數
要注意的是不同的指令,參數的數量都不一樣
繼續用同一個例子
輸出
每個逗號都是用來隔開參數
當然參數實際代入function裡時是不會連分隔用的逗號都一起代入
這只是陣列轉換成string時顯示出來的樣子
例如第一行有3個逗號代表有4個參數,只是第一個參數是什麼都沒有
分別代表圖片檔案名稱、圖片中第幾格(內建預設一張有8格頭像)、窗口類型、位置類型
而第二行則只有文本內容的一個參數
有些指令沒有參數,所以會出現空白行
像是哪個指令有哪些參數代表什麼,都可以在各個指令function中找到
還是老話,現在全部解釋出來太長了,有小細節看不懂再問吧
以上的例子包括代碼部份,不只限用於文本指令,適用於任何事件指令
也就是滿滿的三頁事件指令裡面的全部
插件參數
接下來的是插件部份
插件功能可以說是MV這個版本所增最實用的功能了!
以前的版本要讓插件在事件裡執行,需要把程式碼複製在腳本裡,然後在程式碼裡輸入參數
對工程師而言多此一舉,對其他插件使用者而言不好理解
在MV版裡插件功能被獨立了出來,使用者可以不用輸入任何的程式碼
首先所有的程式碼都必需存放於plugins資料夾,且為JS檔案
下面用官方插件作例子
從 /*: 到 */ 是用於控制插件基本設置,因此裡面的
所有設定都會被顯示在插件管理器上/*:
* @plugindesc 這裡開始輸入插件簡介
* 因為這裡能顯示的字很有限,不建議太長
* @author 作者名
*
* @param 參數名稱
* @desc 情況跟plugindesc一樣
* @default 該參數的預設值
*
* @help 無長度限制的注釋,從這一行開始輸入
* help的第二行
*/
//@param @desc @default 可以複數生效,其他不行
var parameters = PluginManager.parameters('這裡輸入本插件檔案的主檔名'); //設置參數必須
var 代表參數的變量名稱 = 變量型態(parameters['對應上面基本設置的參數名稱'] || 對應上面該參數的預設值);
變量型態為數值時則為parseInt
/*: */ 裡面的string不需用' '辨識,但是宣告參數變量而預設值為string時則需照常用' '標示
這樣就可以在插件裡引用這個變量了
使用者只需在RM的插件管理器裡輸入或更改參數,就可以直接影響插件內的functions
插件指令
接着是插件指令,就是事件指令第三頁的那個
跟插件參數不同的就是透過事件指令觸發
照樣用ItemBook這個例子
var _Game_Interpreter_pluginCommand =
Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
_Game_Interpreter_pluginCommand.call(this, command, args);
//設置插件指令到這裡為止都應該沒有變化
if (command === '插件指令第一部份') {
switch (arg[0]) {
case '插件指令第二部份':
//執行內容
break;
case '插件指令第二部份':
//執行內容
break; //最後一個case裡的break應該是可有可無的
}
}
};
插件指令使用例子(對應上方例子):
注意:arg默認輸入的值為string,數值需包加上Number()
arg[這裡代表讀取所輸入插件指令當中第幾個部份],0是第2部份、1是第3部份,如此類推
關於第1部份回頭往上看
第1部份被存放了在command裡
理論上插件指令可以無限長,可以達到arg[無限]
指令不能設置空白鍵,因為要透過空白鍵判斷指令的部份
當然你也可以不用例子的寫法,不用switch不用if (command === '') 之類的
反正在call那裡已經接收了插件指令裡的參數,下面怎麼運用就視乎你
機智的你應該也汪意到
插件參數只能接收固定值
從遊戲開始到結束該參數不能被更改
但是插件指令能在事件裡被任意使用,甚至跟其他變量配搭使用
所以插件指令是可以完全取代插件參數的功能
這篇就暫時先到這裡(byte要爆炸了)