RPGMakerMV探秘09-菜單場景
????????今天開新坑,熟悉一下菜單場景,菜單場景就是我們進入游戲后,右鍵(取消鍵)或雙指觸摸彈出的場景,RPGMakerMV原始的菜單場景如下:

????????菜單場景的窗口大致分為三塊,目錄窗口、狀態(tài)窗口及金幣窗口。我們選中不同的命令會呼出不同的場景。
????????菜單場景一般是在Scene_Map里呼出的,Scene_Map過于復雜,以后再研究。今兒我們就先看看Scene_Menu。
????????

????????可以看出Scene_Menu繼承自Scene_MenuBase,Scene_MenuBase也是所有菜單類型場景的基類,Scene_MenuBase主要負責創(chuàng)建背景、創(chuàng)建幫助窗口,再就是菜單上角色的切換,這也是其最重要的功能。
????????Scene_Menu就比較清晰,從create方法中,我們可以清晰的看到它創(chuàng)建了三個窗口。
????????其中createCommandWindow方法是不是有點眼熟,沒錯,我們在分析Scene_Title的時候也碰到過類似的方法。? ????

????????上面幾行代碼是不是就很熟悉了,但是我們仔細看,這里創(chuàng)建的窗口是用的Window_MenuCommand,而Scene_Title中用的是Window_TitleCommand,我們知道這兩個命令窗口都是Window_Command派生的,他們比較核心的一塊就是創(chuàng)建命令列表,也就是
makeCommandList方法,這兩者在實現(xiàn)上還是有一點區(qū)別的。? ?????

????????左側(cè)是Scene_Menu的,右側(cè)是Scene_Title的。Scene_Title比較清晰簡單,直接就添加了三行命令。而Scene_Menu就稍微復雜了一些,對不同的命令進行了分類,然后按照類別進行創(chuàng)建。因為每個類別都有一些各自的判斷條件和特性。
????????

????????金幣及狀態(tài)窗口使用不同的窗口模板創(chuàng)建。
????????大概的了解了原始的菜單場景,接下來,我們使用插件對菜單場景進行一些改造。類似對標題場景的改動,我們把文字的命令用圖片代替,然后在場景上加一些自定義的數(shù)據(jù)及背景,讓菜單場景更加生動。
????????本次使用MOG_SceneMenu.js插件,MOG_SceneMenu.js提供了一個全新的菜單樣式。
????????單獨引入MOG_SceneMenu.js時,菜單提示了一個錯誤。


????????出問題的就是1331行代碼,開始很疑惑,為什么Window_MenuCommand在1355行已經(jīng)定義了updateScrollRoll方法,卻在1331行調(diào)用時,拋出來異常。結(jié)果調(diào)試發(fā)現(xiàn),對象的構(gòu)造函數(shù)確定后,如果再添加屬性或者對象,需要在對象的prototype上添加,這里涉及一個JS核心知識點--原型鏈。我對原型鏈的理解還停留在初級階段,這里就不展開講了。但是我在此前的項目中也使用過這個插件,并沒有發(fā)生異常,所以就想一定在某個其他插件定義了這個方法。于是找到了MOG_MenuCursor.js插件。

????????雖然我們找到了updateScrollRoll,但是還有疑惑,這個方法明明定義在Window_Selectable的prototype上,跟Window_MenuCommand怎么扯上關(guān)系了呢?接著往下看。在rpg_windows中有關(guān)于Window_MenuCommand的定義。

????????Window_MenuCommand繼承自Window_Command,而Window_Command繼承自Window_Selectable,js在尋找屬性或者對象時,會根據(jù)原型鏈,一層層的向上搜索,直到找到為止,所以這里直接找到了Window_Selectable.prototype的updateScrollRoll。
? ? ? ? 這里我直接把相關(guān)代碼拷貝到了MOG_SceneMenu.js,并且注釋了兩斷Window_MenuCommand.updateScrollRoll。
????????暫時沒有看出對已引用插件的影響,對于新手最好不要對插件進行結(jié)構(gòu)性的改動,我這里只是做一種嘗試,沒有把握的情況下還是直接引用MOG_MenuCursor.js。
????????根據(jù)插件將對應的資源放到相應目錄下,菜單場景變成了如下的樣子:

????????跟軟件自帶的菜單場景相比,用圖片替代文字、添加更多的游戲元素到菜單,讓菜單更加的生動,多樣化。
????????整個插件的代碼量還是比較可觀,我也不知道該以什么方式展開。所以后面的解析主要以應用為主,輔以代碼講解。
????????首先我們看到場景中有8個命令圖標,我們使用插件參數(shù)只能修改他們的起始位置,如果我們想要修改更多的東西,實現(xiàn)更多的排列方式,可以修改如下代碼:?

????????_compos數(shù)組是命令圖標的坐標。scMenu_ComX、scMenu_ComY是第一個圖標的初始位置,后面的圖標根據(jù)算法,計算相應的坐標。h變量是一個交替變換的值,這樣就形成了兩行的高低差,如果我們想把命令圖標顯示在左側(cè)兩列,將h變量及i變量對換,并且調(diào)整scMenu_ComX、scMenu_ComY,便可以達到下面的效果。? ?

????????當然你也可以根據(jù)自己的素材,按需調(diào)整。
????????接下來,我們再看另一部分調(diào)整,人物立繪上層的人物狀態(tài)信息,圖中只顯示了HP、MP,而插件也只支持顯示這兩項,那么我們?nèi)绻腼@示角色的TP、EXP該怎么做呢?
????????首先需要改動素材,將信息顯示圖層及顯示條制作出來,本人PS菜雞,素材制作大家自行腦補。大概就是在原圖上再加兩個框,顯示條可以調(diào)整下色調(diào)。
????????既然HP、MP已經(jīng)做出來了,想象中TP和EXP原理應該差不多,沒有太多基礎(chǔ)的情況下,我們就依葫蘆畫瓢。先在參數(shù)中把TP、EXP的顯示條、數(shù)字、最大值數(shù)值的基礎(chǔ)位置信息設(shè)置好。

????????接下來找到加載資源部分,將TP、EXP的資源加載進來。? ?

????????如果我們添加TP,那么我們需要創(chuàng)建TP的進度條,TP當前值數(shù)字,TP的最大值這幾個要素。而這三個要素都是隨著實際的數(shù)值變化而變化的,那么都需要放到周期函數(shù)update中。



????????通過以上的改造,我們便在狀態(tài)信息中添加了TP顯示條及數(shù)字信息。以上代碼多處可復用HP、MP的,所以很多公共的方法我們可以不用再去實現(xiàn)。當然,我們也看到了很多重復的代碼,作為初學者的我們,學會修改,等熟練之后再考慮代碼的執(zhí)行效率和代碼的復用率。
????????

????????這個坑就先填到這里吧,剩下的EXP的展示,大家可以嘗試自己做一下。
????????
注:以上分析均為作者興趣出發(fā),自學有感,對于js的認知還存在不足或者偏差,如有錯誤,歡迎指正。
? ? ? ??