じ☆ve冰风 发表于 2024-11-22 00:47:04

[教程]RMMV脚本教程——菜单美化(二)

全系列教程传送门
RMMV脚本教程——菜单美化(一)

RMMV脚本教程——菜单美化(三)(完结)

写在前面
时隔不到一年半,高考完的我终于决定继续研究MV的脚本,然后写教程啦…
之前的教程(下面参考资料有文章链接)发布在Project1(原6R)论坛上,之前的坑还是会慢慢填完的,现在再开个新坑!
这次来美化一下菜单!
首先放一下先行图:
https://rpg.blue/data/attachment/forum/201907/12/124905pjzy212rcud2c7y2.jpg
上一篇教程的传送门:
[教程]RMMV脚本教程——菜单美化(一)
ps:推荐去我的博客看,以获得最佳观看体验:RMMV脚本教程——菜单美化(二)



注意事项


本教程的灵感来自于【渣作品】RGSS3教程(二) 菜单的美化【2013.8.2-16:40完结】,不如说是该教程直接翻译成的MV版本。因为作者特别的菜,所以教程中难免会有一些小(致命)的错误,请大家原谅,另外请大家不吝赐教。教程中会用到的参考资料:


RMMV的中文F1文档:http://miaowm5.github.io/RMMV-F1/汪汪大佬的RMMV原生脚本注释的中文翻译:https://github.com/wangwangxingao/RMMV/tree/master/%E6%B3%A8%E9%87%8A我之前未写完烂尾的教程:[教程]RMMV脚本教程(一),[教程]RMMV脚本教程(二)
[*]RMVA的F1帮助文档汉化版:https://rpg.blue/thread-369922-1-1.html
      其中F1和翻译都可以在github上下载到,大家珂以先下载,方便查看。
本教程同步发布于Project1论坛和我的博客青い記憶:RMMV脚本教程——菜单美化(二)
正文
上次说到哪了…
对,这次我们要来改造右边显示角色简要信息的窗口了!
美化角色状态窗口
首先,我们还是要分析这个窗口是在哪里定义的。
在Scene_Menu中搜索“状态”,发现如下脚本:
/**创建状态窗口 */Scene_Menu.prototype.createStatusWindow = function() { //状态窗口 = 新 窗口菜单状态(命令窗口 宽 , 0 ) this._statusWindow = new Window_MenuStatus(this._commandWindow.width, 0); //状态窗口 预约脸图() this._statusWindow.reserveFaceImages(); //添加窗口(状态窗口) this.addWindow(this._statusWindow);};复制代码
看到预约脸图(这什么鬼才翻译…果然是机翻…),菜单上显示脸图的地方也就是显示角色基本信息、用来选择角色的窗口了…
因此我们打开Window_MenuStatus,我们先去看看预约脸图到底是个什么鬼东西…
最后一直搜到他的父类的父类Window_Base,才搜到这个方法:
/**预约脸图 */Window_Base.prototype.reserveFaceImages = function() {    //游戏队伍 成员组() 对每一个 角色    $gameParty.members().forEach(function(actor) {      //图像管理器 预约脸图(角色 脸图名称())      ImageManager.reserveFace(actor.faceName());    //this)    }, this);};复制代码
然而没看出来什么…
不过看起来本质是对每一个成员都来一遍ImageManager.reserveFace函数。
然后再去rpg_managers文件夹下的ImageManager.js中搜索,,,
算了,我直接说出来吧…
这里说的预约或者预订,大概就是预加载的意思,MV的机制和VA中有些不太一样,VA中是如果图片在Cache中找不到,就去加载文件,而MV中最好预加载一下,然后使用的时候才能保证能正常显示,所以就有了一系列reserve函数。
这里不理解也没多大关系,毕竟对于我们这篇教程来说也用不到这个东西…
回归正题,既然我们已经打开了Window_MenuStatus,那么就要看看这里面是怎么描绘窗口内容的了。
还记得在我一年之前的教程里面绘制角色脸图的方法吗?没看过的同学可以去参考资料那里去找链接,或者我的签名档。
没错,就是drawActorFace方法!因此我们搜索这个方法名就能知道是怎么绘制的了。
搜到的结果:
/**绘制项目图像 */Window_MenuStatus.prototype.drawItemImage = function(index) {    var actor = $gameParty.members();    var rect = this.itemRect(index);    this.changePaintOpacity(actor.isBattleMember());    this.drawActorFace(actor, rect.x + 1, rect.y + 1, Window_Base._faceWidth, Window_Base._faceHeight);    this.changePaintOpacity(true);};复制代码我们看到这里绘制了角色的脸图,但是我们注意到这个函数有参数index,而且这个函数调用一次只能够在rect.x + 1, rect.y +1显示一个脸图,所以说一定是某个函数调用了这个函数很多次,才绘制出来所有角色的脸图。他是如何调用了这个函数多次,index又是什么含义呢?我们再以drawItemImage为关键字搜索:
/**绘制项目 */Window_MenuStatus.prototype.drawItem = function(index) {    this.drawItemBackground(index);    this.drawItemImage(index);    this.drawItemStatus(index);};复制代码结果发现这个函数只是把3个函数放在了一起,并不能看出来index的含义,再次搜索drawItem,发现只能搜到定义,却不能搜到其他地方有这个函数?
(黑人问号…)这…怎么会没有定义?
重点来了!!!
当我们在某个类(Window_MenuStatus)中搜索不到一个有定义却没有引用的函数(drawItem)时,我们珂以尝试去他的父类、父类的父类、甚至是他的祖宗类(XD)中去搜索,理论上说一般能够搜到(其实更简单的方法是直接在mv的js文件夹下的rpg_windows.js中搜索,但是没有中文注释)。
我们去Window_Selectable搜索,发现一下连续的两处结果:
/**绘制所有项目 */Window_Selectable.prototype.drawAllItems = function() {    //topIndex = 顶部索引()    var topIndex = this.topIndex();    //循环 (开始时 i = 0 ; 当 i < 最大页项目数 ;每次 i++ )    for (var i = 0; i < this.maxPageItems(); i++) {      //索引 = 头索引 + i      var index = topIndex + i;      //如果(索引= maxCols )rect.y+=rect.height * 2;    return rect;};复制代码
其实,我们只需修改rect.y那一行为
rect.y = Math.floor(index / maxCols) * rect.height * 3 - this._scrollY;复制代码
就不用加if那行了。
原理是第一行的角色的Math.floor(index /maxCols)结果为0,第二行的角色的Math.floor(index / maxCols)结果为1,所以只有第二行角色的rect.y增加了rect.height * 2。
现在我们运行一下游戏…感觉哪里有些不对——选项的高度太高了…
解决的方法是增加一页窗口的可见行数,在Window_MenuStatus的drawItem上面,我们发现了以下函数:
/**可见行数目 */Window_MenuStatus.prototype.numVisibleRows = function() {    return 4;};复制代码
我们只要把他的行数改7即可。这里需要注意的是,记得将rect.y改为
rect.y = Math.floor(index / maxCols) * rect.height * 3 - this._scrollY;复制代码

如果你是用的if,那么将if那行改为if( index >= maxCols )rect.y+=rect.height * ( this.numVisibleRows() - 2 );复制代码

效果是一样的。
最后运行下看下结果。
https://rpg.blue/data/attachment/forum/201907/12/125005bb6bg4ei08446060.jpg
到这里,我们就写完了选项处理的部分,那么这期教程就写道这里吧(貌似只写完了上次预告的1/3)。
后记
这篇教程没完成上次预告的内容…
着实抱歉…
下期教程,基本上就能完工啦!
效果和预览图上就会一样了。
感谢大家的支持!




            本帖来自P1论坛作者xjzsq,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=477962若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: [教程]RMMV脚本教程——菜单美化(二)