作者: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 width
和 Screen 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 width
和 Screen height
甘桑。這里就要先獲取用戶配置的參數(shù)值淑际,方法如下:
var params = PluginManager.parameters("MND_ChangeScreenSize");
var screenWidth = Number(params["Screen width"]) || 816;
var screenHeight = Number(params["Screen height"]) || 624;
-
PluginManager.parameters
方法使用的參數(shù)是插件的文件名(不帶擴(kuò)展名),所以插件的文件名一般不要修改扇住;該方法得到的params
是一個(gè)字典對(duì)象春缕,存儲(chǔ)了所有參數(shù)的鍵值對(duì)。 - 使用
params[參數(shù)名]
的方式獲取參數(shù)值艘蹋,如params["Screen width"]
用來(lái)獲取用戶配置的Screen width
參數(shù)值锄贼,也就是要設(shè)置的游戲屏幕的寬度,同理params["Screen height"]
得到的就是用戶設(shè)置的游戲屏幕的高度女阀。 -
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事件,編輯其事件代碼如下圖:
這樣扒秸,玩家與該NPC對(duì)話后就會(huì)彈出一個(gè)游戲屏幕尺寸菜單播演,選擇相應(yīng)菜單就可以更改游戲屏幕的尺寸了。
最后伴奥,這里 有一個(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