【RPG Maker MV插件編程】【實(shí)例教程1】怎樣編寫一個(gè)插件芭逝?

作者:Mandarava(鰻駝螺)
微博:@鰻駝螺pro

本文的目標(biāo)

本文將通過(guò)寫一個(gè)改變游戲屏幕尺寸的插件來(lái)說(shuō)說(shuō)怎樣寫一個(gè)RPG Maker MV插件梨与,本文涉及插件參數(shù)的定義旋恼、插件指令的實(shí)現(xiàn)與調(diào)用。該插件將要實(shí)現(xiàn)的功能包括:
  1. 設(shè)定游戲屏幕的默認(rèn)尺寸(在游戲啟動(dòng)時(shí)自動(dòng)使用)术瓮;
  2. 在游戲中,玩家通過(guò)與NPC交互贰健,更改游戲屏幕尺寸胞四;
  注:本插件所說(shuō)的游戲屏幕尺寸指游戲顯示區(qū)的尺寸大小(不包括游戲窗口的邊框伶椿、標(biāo)題欄等等這些部分)辜伟,本插件只會(huì)改變窗口大小,不會(huì)造成游戲中可視范圍的增加或縮小悬垃,實(shí)際效果就等同于縮放游戲窗口游昼。好吧,我承認(rèn)這插件沒什么用(因?yàn)镽MMV的游戲窗口本來(lái)就能縮放)尝蠕,不過(guò)烘豌,沒關(guān)系,本文的目標(biāo)不是做一個(gè)有用的插件看彼,而是學(xué)習(xí)如何寫一個(gè)能用的插件廊佩。

新建一個(gè)名為 MND_ChangeScreenSize.js 的Javascript文件囚聚,并放到游戲項(xiàng)目的 js/plugins 目錄下。在RMMV的插件管理中安裝該插件标锄。

插件的注釋與定義參數(shù)

插件參數(shù)在注釋中定義顽铸,如下面的代碼。有效的插件注釋要用/*:開頭料皇,冒號(hào)之后可以加不同的語(yǔ)言代號(hào)(如:en)表示不同的語(yǔ)言版本谓松。用@param聲明一個(gè)參數(shù),參數(shù)名為Screen width践剂,@desc用于描述該參數(shù)的作用鬼譬,下面一句 默認(rèn)值: 816 實(shí)際這段話還是 @desc 描述的一部份,只是換了一行逊脯,條理些优质。所以這段注釋定義了二個(gè)參數(shù):Screen widthScreen height,分別對(duì)應(yīng)于要設(shè)定的游戲屏幕的寬度和高度军洼。另外巩螃,可以用@plugindesc來(lái)簡(jiǎn)要描述插件的功能,用@author來(lái)聲明插件作者匕争。

/*:
 * @plugindesc 隨時(shí)隨地更改游戲屏幕尺寸
 * @author: Mandarava(鰻駝螺)
 * 
 * @param Screen width
 * @desc 游戲啟動(dòng)時(shí)游戲屏幕的寬度
 * 默認(rèn)值:816
 * @default 816
 * 
 * @param Screen height
 * @desc 游戲啟動(dòng)時(shí)游戲屏幕的高度
 * 默認(rèn)值:624
 * @default 624
 */

更多的參數(shù)定義方法請(qǐng)參考這個(gè)插件項(xiàng)目:Introduction to the new Plugin Manager in RPG Maker MV 1.5.0+

讀取插件參數(shù)

插件安裝后避乏,用戶(指使用插件的游戲開發(fā)者)會(huì)對(duì)插件進(jìn)行配置。本插件可提供用戶設(shè)置的參數(shù)就是 Screen widthScreen height甘桑。這里就要先獲取用戶配置的參數(shù)值淑际,方法如下:

var params = PluginManager.parameters("MND_ChangeScreenSize");
var screenWidth = Number(params["Screen width"]) || 816;
var screenHeight = Number(params["Screen height"]) || 624;
  1. PluginManager.parameters 方法使用的參數(shù)是插件的文件名(不帶擴(kuò)展名),所以插件的文件名一般不要修改扇住;該方法得到的 params 是一個(gè)字典對(duì)象春缕,存儲(chǔ)了所有參數(shù)的鍵值對(duì)。
  2. 使用 params[參數(shù)名] 的方式獲取參數(shù)值艘蹋,如 params["Screen width"] 用來(lái)獲取用戶配置的 Screen width 參數(shù)值锄贼,也就是要設(shè)置的游戲屏幕的寬度,同理 params["Screen height"] 得到的就是用戶設(shè)置的游戲屏幕的高度女阀。
  3. Number(params["Screen width"]) || 816 對(duì)取得的參數(shù)進(jìn)行數(shù)值轉(zhuǎn)換宅荤,如果轉(zhuǎn)換失敗,則使用默認(rèn)的816浸策,高度默認(rèn)的則是624冯键。

更改游戲屏幕尺寸

將用于修改游戲屏幕尺寸的代碼封裝為setScreenSize()方法,該方法可以根據(jù)游戲顯示區(qū)的大小縮放游戲窗口庸汗,代碼如下:

function setScreenSize(screenWidth, screenHeight){
    var deltaWidth = screenWidth - window.innerWidth;
    var deltaHeight = screenHeight - window.innerHeight;  
    window.moveBy(- deltaWidth / 2, - deltaHeight / 2);
    window.resizeBy(deltaWidth, deltaHeight);
}

前面已經(jīng)獲得了用戶設(shè)置的尺寸參數(shù)惫确,所以使用下面的方法就可以實(shí)現(xiàn)在游戲啟動(dòng)時(shí)自動(dòng)更改為用戶配置的游戲屏幕尺寸:

setScreenSize(screenWidth, screenHeight);

到這里,目標(biāo)一完成,整個(gè)代碼如下:

/*:
 * @plugindesc 隨時(shí)隨地更改游戲屏幕尺寸
 * @author: Mandarava(鰻駝螺)
 *
 * @param Screen width
 * @desc 游戲啟動(dòng)時(shí)游戲屏幕的寬度
 * 默認(rèn)值:816
 * @default 816
 * 
 * @param Screen height
 * @desc 游戲啟動(dòng)時(shí)游戲屏幕的高度
 * 默認(rèn)值:624
 * @default 624
 */

var params = PluginManager.parameters("MND_ChangeScreenSize");
var screenWidth = Number(params["Screen width"]) || 816;
var screenHeight = Number(params["Screen height"]) || 624;

setScreenSize(screenWidth, screenHeight);

function setScreenSize(screenWidth, screenHeight){
    var deltaWidth = screenWidth - window.innerWidth;
    var deltaHeight = screenHeight - window.innerHeight;  
    window.moveBy(- deltaWidth / 2, - deltaHeight / 2);
    window.resizeBy(deltaWidth, deltaHeight);
}

插件指令的實(shí)現(xiàn)

插件指令改化,即在事件編輯器中由 事件指令 - 插件指令 調(diào)用的指令掩蛤,指令調(diào)用后插件就要對(duì)指令進(jìn)行處理。要處理插件指令陈肛,就要重寫 Game_Interpreter.prototype.pluginCommand 方法揍鸟。
  我們這里允許使用二個(gè)插件指令:
  1. ChangeScreenSize 1024 768:表示更改游戲屏幕尺寸為1024 x 768(具體數(shù)值可按需修改),這個(gè)指令中句旱,ChangeScreenSize是指令名稱阳藻,1024是指令的第1個(gè)參數(shù)(索引為0),意指尺寸寬度谈撒,768是第2個(gè)參數(shù)(索引為1)稚配,意指尺寸高度。
  2. RestoreScreenSize:恢復(fù)為默認(rèn)尺寸(也就是 816 x 624)港华,這個(gè)指令沒有參數(shù)。
  在下面的代碼中午衰,別名 _Game_Interpreter_pluginCommand 主要用于在重寫時(shí)調(diào)用原始方法立宜。command 是調(diào)用的指令名,通過(guò)switch來(lái)判斷要處理哪個(gè)指令臊岸。對(duì)于 ChangeScreenSize 指令橙数,因?yàn)樗卸€(gè)參數(shù),所以使用 args[0]args[1] 來(lái)讀取參數(shù)帅戒。最后調(diào)用 setScreenSize(screenWidth, screenHeight) 方法來(lái)改變窗口大小灯帮。

var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args){
    _Game_Interpreter_pluginCommand.call(this, command, args);

    switch(command){
        case "ChangeScreenSize":
            var _screenWidth = Number(args[0]) || 816;
            var _screenHeight = Number(args[1]) || 624;
            setScreenSize(_screenWidth, _screenHeight);
            break;
        case "RestoreScreenSize":
            setScreenSize(816, 624);
            break;
        default: break;
    }
}

到這里,目標(biāo)二完成逻住,整個(gè)代碼如下:

/*:
 * @plugindesc 隨時(shí)隨地更改游戲屏幕尺寸
 * @author: Mandarava(鰻駝螺)
 *
 * @param Screen width
 * @desc 游戲啟動(dòng)時(shí)游戲屏幕的寬度
 * 默認(rèn)值:816
 * @default 816
 * 
 * @param Screen height
 * @desc 游戲啟動(dòng)時(shí)游戲屏幕的高度
 * 默認(rèn)值:624
 * @default 624
 * 
 * @help
 * 插件命令:
 *  ChangeScreenSize 1024 768   #修改分辨率為1024x768
 *  RestoreScreenSize   #恢復(fù)為默認(rèn)分辨率
 */

var params = PluginManager.parameters("MND_ChangeScreenSize");
var screenWidth = Number(params["Screen width"]) || 816;
var screenHeight = Number(params["Screen height"]) || 624;

setScreenSize(screenWidth, screenHeight);

var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args){
    _Game_Interpreter_pluginCommand.call(this, command, args);

    switch(command){
        case "ChangeScreenSize":
            var _screenWidth = Number(args[0]) || 816;
            var _screenHeight = Number(args[1]) || 624;
            setScreenSize(_screenWidth, _screenHeight);
            break;
        case "RestoreScreenSize":
            setScreenSize(816, 624);
            break;
        default: break;
    }
}

function setScreenSize(screenWidth, screenHeight){
    var deltaWidth = screenWidth - window.innerWidth;
    var deltaHeight = screenHeight - window.innerHeight;  
    window.moveBy(- deltaWidth / 2, - deltaHeight / 2);
    window.resizeBy(deltaWidth, deltaHeight);
}

這里钟哥,在注釋部份增加了一個(gè) @help 部份,該標(biāo)記用于顯示插件的幫助內(nèi)容瞎访,方便用戶了解如何使用該插件腻贰。

在游戲中調(diào)用插件指令

添加一個(gè)NPC事件,編輯其事件代碼如下圖:


Event.png

  這樣扒秸,玩家與該NPC對(duì)話后就會(huì)彈出一個(gè)游戲屏幕尺寸菜單播演,選擇相應(yīng)菜單就可以更改游戲屏幕的尺寸了。


demo.png

最后伴奥,這里 有一個(gè)最終完成并優(yōu)化的版本写烤,除了包含本文中所說(shuō)的功能外,還增加了游戲開啟時(shí)自動(dòng)全屏拾徙、全屏非全屏切換等功能洲炊。對(duì)于游戲全屏切換與Graphics類的以下三個(gè)方法有關(guān):

  • Graphics._requestFullScreen:進(jìn)入全屏
  • Graphics._cancelFullScreen:退出全屏
  • Graphics._switchFullScreen:全屏、非全屏切換(實(shí)際是根據(jù)Graphics._isFullScreen檢測(cè)當(dāng)前是否全屏,再調(diào)用上面二個(gè)方法實(shí)現(xiàn)切換的)

by: Mandarava(鰻駝螺) 2017.06.14

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末选浑,一起剝皮案震驚了整個(gè)濱河市蓝厌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌古徒,老刑警劉巖拓提,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異隧膘,居然都是意外死亡代态,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門疹吃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蹦疑,“玉大人,你說(shuō)我怎么就攤上這事萨驶∏复荩” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵腔呜,是天一觀的道長(zhǎng)叁温。 經(jīng)常有香客問(wèn)我,道長(zhǎng)核畴,這世上最難降的妖魔是什么膝但? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮谤草,結(jié)果婚禮上跟束,老公的妹妹穿的比我還像新娘。我一直安慰自己丑孩,他們只是感情好冀宴,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著温学,像睡著了一般花鹅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上枫浙,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天刨肃,我揣著相機(jī)與錄音,去河邊找鬼箩帚。 笑死真友,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的紧帕。 我是一名探鬼主播盔然,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼桅打,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了愈案?” 一聲冷哼從身側(cè)響起挺尾,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎站绪,沒想到半個(gè)月后遭铺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恢准,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年魂挂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馁筐。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涂召,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出敏沉,到底是詐尸還是另有隱情果正,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布盟迟,位于F島的核電站秋泳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏队萤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一矫钓、第九天 我趴在偏房一處隱蔽的房頂上張望要尔。 院中可真熱鬧,春花似錦新娜、人聲如沸赵辕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)还惠。三九已至,卻和暖如春私杜,著一層夾襖步出監(jiān)牢的瞬間蚕键,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工衰粹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锣光,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓铝耻,卻偏偏與公主長(zhǎng)得像誊爹,于是被迫代替她去往敵國(guó)和親蹬刷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容