设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 16192|回复: 26

[原创发布] [教程]RMMV脚本教程——菜单美化(三)(完结)

[复制链接]

Lv5.捕梦者

梦石
0
星屑
28943
在线时间
602 小时
注册时间
2014-7-18
帖子
728

开拓者

发表于 2019-7-17 00:49:26 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 xjzsq 于 2021-2-8 01:18 编辑

前两期教程的传送门
写在前面
时隔不到一年半,高考完的我终于决定继续研究MV的脚本,然后写教程啦…
之前的教程(下面参考资料有文章链接)发布在Project1(原6R)论坛上,之前的坑还是会慢慢填完的,现在再开个新坑!
这次来美化一下菜单!
首先放一下先行图:
done.jpg



注意事项
正文
上期教程,我们写好了人物行走图选项的部分,下面就实现中间显示人物的信息,并且信息会随着选项的位置改变的效果。
还记得我在之前写烂尾的教程(在注意事项第三条3那里)里面如何描绘人物信息的吗?(回去看了看,貌似只写到了描绘人物名字的部分)
我们这次为了代码简单一些,就不描边了。
因为随选项而使人物信息变化比较难,所以我们就先把index==0的角色信息描绘出来,像描绘角色行走图一样,我们需要新建一个函数,把所有关于描绘角色信息的代码都写在这个函数里,仿照drawItemImage,新函数就叫做drawItemActorStatus,具体方法也参照drawItemImage来写:
  1. Window_MenuStatus.prototype.drawItemActorStatus = function(){
  2.     var index = 0;
  3.     var actor = $gameParty.members()[index];
  4.     var rect = this.itemRect(index);
  5. }
复制代码
这里,rectyheight并不能满足要求,因此,这里珂以参照itemRect函数自己写一个返回rect方法,这里叫做itemRectForStatus,也是将itemRect中的内容复制过来,再做进一步修改。新定义的这个函数有什么不同呢?首先是他和人物的index无关了,所以这个函数就没有参数了;其次是他的rect.y应该先加上一个选项的高度,而rect.heigtht应该为原来基础上的5(this.numVisibleRows() - 2)倍,按照上面说的写出以下函数:
  1. Window_MenuStatus.prototype.itemRectForStatus = function(){
  2.     var rect = new Rectangle();
  3.     var maxCols = this.maxCols();
  4.     rect.width = this.itemWidth() * maxCols;
  5.     rect.height = this.itemHeight();
  6.     rect.x = 0 ;
  7.     rect.y = rect.height - this._scrollY;
  8.     rect.height *= ( this.numVisibleRows() - 2 );
  9.     return rect;
  10. };
复制代码
之后,将drawItemActorStatus中的itemRect函数改为itemRectForStatus
要描绘人物的脸图,使用的方法是drawActorFace,参数珂以对照着Window_MenuStatusdrawItemImage函数里面的drawActorFace的参数来填,也就是下面这样:
  1. this.drawActorFace(actor, rect.x, rect.y);
复制代码
先运行下测试一下看看是否正常显示吧,不过在测试之前,我们需要将drawItemActorStatus函数先写到Window_MenuStatusdrawItem函数里面,也就是在里面加上:
  1. this.drawItemActorStatus();
复制代码
之后运行看下结果吧!
如果在菜单中显示了第一个人物的脸图,那你就写对了。
在这以后,我们就来描绘剩下的东西。
首先是在脸图上面描绘人物名字,使用的是drawActorName函数,定义在Window_Base中,参数珂以去看定义,这里需要说明的是,有些参数珂以不填,比如看到drawActorName函数的定义:
  1. /**绘制角色名称 */
  2. Window_Base.prototype.drawActorName = function(actor, x, y, width) {
  3.     width = width || 168;
  4.     this.changeTextColor(this.hpColor(actor));
  5.     this.drawText(actor.name(), x, y, width);
  6. };
复制代码
其中width = width || 168; 就表示width是一个可填可不填的参数,就算不填,也会自动给补上,这里我们是想在脸图上方描绘名字,而脸图的宽度是144(珂以去脸图目录下的文件那里看宽度/4就是这个数字),而按照默认宽度,珂能会出现绘制到脸图外面的情况,因此我们填上这个参数。
也就是:
  1. this.drawActorName(actor, rect.x, rect.y, 144);
复制代码
同样,在Window_Base中,我们珂以搜索到绘制角色等级、职业、昵称、HP、MP的函数,因为图像的宽度是144,因此描绘这些的时候,x都需要在原来的基础上加145;等级这一行,珂以先算出( rect.width - 144 ) / 3的结果为_valWidth,然后描绘职业和昵称的时候,分别在x那里加上一个或两个_valWidth;另外,在MV中每行字的高度是36,描绘的每个项目都要加上宽度,第一行是_valWidth,后面都是rect.width - 144。珂以写出以下代码:
  1.     var _valWidth= ( rect.width - 144 ) / 3;
  2.     this.drawActorLevel(actor, rect.x + 145, rect.y , _valWidth);
  3.     this.drawActorClass(actor, rect.x + 145 + _valWidth, rect.y, _valWidth);
  4.     this.drawActorNickname(actor, rect.x + 145 + _valWidth * 2, rect.y, _valWidth);
  5.     this.drawActorHp(actor, rect.x + 145, rect.y + 36, rect.width - 144);
  6.     this.drawActorMp(actor, rect.x + 145, rect.y + 72, rect.width - 144);
复制代码
MV默认工程里面,人物是没有昵称的,我们需要去数据库里加上昵称,然后运行测试下效果。
…是不是发现等级那里有点不对劲…
数字离着Lv符号太远了…
那我们就重新定义下等级的函数,同样是从Window_Base中复制过来,然后把数字往左放一点(也就是把drawTextx值改小一点,这里改成了x + 48,因为上面的等级符号宽度是48):
  1. Window_MenuStatus.prototype.drawActorLevel = function(actor, x, y) {
  2.     this.changeTextColor(this.systemColor());
  3.     this.drawText(TextManager.levelA, x, y, 48);
  4.     this.resetTextColor();
  5.     this.drawText(actor.level, x + 48, y, 36, 'right');
  6. };
复制代码
运行下看结果:
lv.jpg
下面就开始写经验条了,因为MV脚本没有自带描绘经验条的函数,这就需要我们自己来写…
仿照HP条来写经验条吧。
我们先在Window_Base中找到描绘HP条的方法:
  1. Window_Base.prototype.drawActorHp = function(actor, x, y, width) {
  2.     width = width || 186;
  3.     var color1 = this.hpGaugeColor1();
  4.     var color2 = this.hpGaugeColor2();
  5.     this.drawGauge(x, y, width, actor.hpRate(), color1, color2);
  6.     this.changeTextColor(this.systemColor());
  7.     this.drawText(TextManager.hpA, x, y, 44);
  8.     this.drawCurrentAndMax(actor.hp, actor.mhp, x, y, width, this.hpColor(actor), this.normalColor());
  9. };
复制代码
第一行,是默认的宽度,这个不管。
之后两行是两个颜色,为了区别于HP条,经验条就用TP条的颜色吧。
第四行就是描绘HP条了,这里actor.hpRate()看起来控制了HP条有颜色部分的长度,我们应该把这个改成exp的,这个MV也没有自带,也需要自己写…同样找到这个的定义,但是根据actor来看,这应该是actor的属性,而actor应该是Game开头的代码里面定义的,但是我们不知道具体是在哪个类里面定义的,因此去游戏工程的脚本目录下的rpg_objects.js中搜索:
  1. Game_BattlerBase.prototype.hpRate = function() {
  2.     return this.hp / this.mhp;
  3. };
复制代码
发现是在Game_BattlerBase里面定义的,于是仿照这个函数在相同的类中定义expRate,当前的经验和下个等级所需的经验,这里直接给出来,为this.currentExp()this.nextLevelExp(),写出以下函数:
  1. Game_BattlerBase.prototype.expRate = function () {
  2.     return this.currentExp() / this.nextLevelExp();
  3. };
复制代码
现在就珂以写drawActorExp函数了!还需要做的修改有单位改为expA,下面的数值改为当前经验和下等级经验,以及颜色改为tpColor
  1. Window_MenuStatus.prototype.drawActorExp = function(actor, x, y, width) {
  2.     width = width || 186;
  3.     var color1 = this.tpGaugeColor1();
  4.     var color2 = this.tpGaugeColor2();
  5.     this.drawGauge(x, y, width, actor.expRate(), color1, color2);
  6.     this.changeTextColor(this.systemColor());
  7.     this.drawText(TextManager.expA, x, y, 44);
  8.     this.drawCurrentAndMax(actor.currentExp(), actor.nextLevelExp(), x, y, width, this.tpColor(actor), this.normalColor());
  9. };
复制代码
最后在drawItemActorStatus中加上描绘exp的函数:
  1. this.drawActorExp(actor, rect.x + 145, rect.y + 108, rect.width - 144);
复制代码
只剩下能力值和武器情况的描绘了。
状态那里面是不是也描绘有这些东西?
因此我们就去看看那里是怎么描绘的,打开rpg_window中的Window_Status,珂以搜到以下内容:
  1. /**绘制参数 */
  2. Window_Status.prototype.drawParameters = function(x, y) {
  3.     var lineHeight = this.lineHeight();
  4.     for (var i = 0; i < 6; i++) {
  5.         var paramId = i + 2;
  6.         var y2 = y + lineHeight * i;
  7.         this.changeTextColor(this.systemColor());
  8.         this.drawText(TextManager.param(paramId), x, y2, 160);
  9.         this.resetTextColor();
  10.         this.drawText(this._actor.param(paramId), x + 160, y2, 60, 'right');
  11.     }
  12. };
  13. /**绘制装备 */
  14. Window_Status.prototype.drawEquipments = function(x, y) {
  15.     var equips = this._actor.equips();
  16.     var count = Math.min(equips.length, this.maxEquipmentLines());
  17.     for (var i = 0; i < count; i++) {
  18.         this.drawItemName(equips[i], x, y + this.lineHeight() * i);
  19.     }
  20. };
复制代码
这两个函数一个用来绘制能力值信息,一个用来描绘装备的信息,因此我们用这两个函数来绘制剩下的内容,因为这两个函数定义在Window_Status中,所以需要把这两个函数复制到Window_MenuStatus中,并修改成Window_MenuStatus中的函数;之后,在drawItemActorStatus中进行引用:
  1. this.drawParameters(rect.x,rect.y+144);
  2. this.drawEquipments(rect.x+312,rect.y+144);
复制代码
改好后运行去发现提示param未定义,这并不说明是param的问题,反而是他前面的this._actor的问题:this._actorWindow_MenuStatus中是未定义的,因此需要改成用参数传递,再次运行测试前先记得在drawItemActorStatus的函数调用那里补上参数actor
再次运行,发现this.maxEquipmentLines()未定义,这还是需要从Window_Status中去复制。
最终得到以下代码:
  1. Window_MenuStatus.prototype.maxEquipmentLines = function() {
  2.     return 6;
  3. };

  4. Window_MenuStatus.prototype.drawParameters = function(actor, x, y) {
  5.     var lineHeight = this.lineHeight();
  6.     for (var i = 0; i < 6; i++) {
  7.         var paramId = i + 2;
  8.         var y2 = y + lineHeight * i;
  9.         this.changeTextColor(this.systemColor());
  10.         this.drawText(TextManager.param(paramId), x, y2, 160);
  11.         this.resetTextColor();
  12.         this.drawText(actor.param(paramId), x + 160, y2, 60, 'right');
  13.     }
  14. };

  15. Window_MenuStatus.prototype.drawEquipments = function(actor, x, y) {
  16.     var equips = actor.equips();
  17.     var count = Math.min(equips.length, this.maxEquipmentLines());
  18.     for (var i = 0; i < count; i++) {
  19.         this.drawItemName(equips[i], x, y + this.lineHeight() * i);
  20.     }
  21. };
复制代码
最终测试得到以下画面:
Actorstatus.jpg
下面就开始实现人物信息随选项变动的功能了!
首先,我们需要知道存储当前选项的变量是什么,在Window_MenuStatus中的处理确定的函数processOk中,获取当前的人物是通过this.index()实现的,而this.index()呢?在Window_MenuStatus中没有搜到这个函数的定义,因此我们去他的父类Window_Selectable中搜索,得到以下结果:
  1. /**索引 */
  2. Window_Selectable.prototype.index = function() {
  3.     //返回 _index
  4.     return this._index;
  5. };
复制代码
因此我们也珂以使用this._index获取当前index。
因此将index那里改为this._index,然后运行下看看效果。
运行后却得到了TypeError: Cannot read property 'faceName' of undefined的错误。
难道说this._index出错了?我们珂以看看到底运行到这里this._index返回了什么值。
这就要用到浏览器的控制台输出函数,在出错的这行前面插入:
  1. console.log(this._index);
复制代码
再次运行打开菜单出错后按F12,发现输出的值为-1,为什么是-1?我们现在他等于-1的时候把值改为0,然后在F12里面看看这个-1是什么情况下出现的。
因此将定义actor那行改为:
  1. var actor = $gameParty.members()[this._index==-1?0:this._index];
复制代码
却发现F12在选项移动的过程中并没有输出任何东西,说明drawItemActorStatus这个函数在选项移动过程中并没有被调用,只是绘制选项的过程中被调用了一次,这显然达不到我们的要求。
这里补充一个知识:放在窗口类的update函数内的函数会不断被调用。而Window_MenuStatus中没有定义update函数,说明他的update与父类相同,因此需要自己定义update函数(首先继承了父类的update函数):
  1. Window_MenuStatus.prototype.update = function(){
  2.     Window_Selectable.prototype.update.call(this);
  3.     this.drawItemActorStatus();
  4. };
复制代码
并且记得在drawItem中删掉drawItemActorStatus函数的引用。
然后运行后发现,虽然人物信息随着选项的移动而改变,但是却发现原来的人物信息还在,只是往窗口上一层一层地“铺”,这样肯定是不行的。
因此我们需要想办法,让原人物信息先从菜单上清除,再描绘当前选项的人物信息。
Tip:清除坐标为x,y,高和宽分别为height和width的矩形中的内容的函数为clearRect,我们珂以通过itemRectForStatus函数来获得矩形的信息,同样把下面这行插入update:
  1. this.contents.clearRect(rect.x,rect.y,rect.width,rect.height);
复制代码
运行下看看结果……
确实是没问题了。但是不知为啥电脑风扇开始狂转,打开任务管理器,发现MV的生成的游戏的进程电池使用情况为“非常高”(写教程的时候电脑开着这个时候的游戏开了一晚上,早晨起来发现电脑风扇快转疯了……),这肯定不正常啊…
打开F12发现,之前写的输出this._index的代码正在疯狂输出-1,说明画面更新实在是太频繁了,而实际上并不需要这么频繁,只需要在选项变化的时候更新画面即可。
怎样判断选项变化呢?
因为this._index存储了当前的选项,所以只要选项和原来不一样,this._index就会和原来不一样,所以珂以先把this._index的值存到一个变量中,如果两者不相等,再执行清除重绘的函数,并更新存储的变量,这样就珂以解决因为频繁刷新而导致电脑卡到爆的情况了。
我们在update函数外面新建一个变量xjzsqIndex,然后在update函数内增加一个if判断,来实现这个效果,并且记得把在控制台输出this._index值的那句删掉!代码如下:
  1. var xjzsqIndex;
  2. Window_MenuStatus.prototype.update = function(){
  3.     Window_Selectable.prototype.update.call(this);
  4.     if(xjzsqIndex != this._index)
  5.     {
  6.         var rect = this.itemRectForStatus();
  7.         this.contents.clearRect(rect.x, rect.y, rect.width, rect.height);
  8.         this.drawItemActorStatus();
  9.         xjzsqIndex = this._index;
  10.     }
  11. };
复制代码
电池使用情况立马变成“中”了。
现在就只剩下改变菜单背景了吧。
在加上自带的背景图片之前,我们先把窗口自带的边框“扒”掉,虽然说是扒掉,但是方法确实将窗口背景部分的内容透明度更改为0。
比较合适的修改窗口透明度的时机有两个,一个是在窗口的initialize中修改,因为这是窗口的初始化过程,只执行一次,不会因为多次执行浪费计算资源,另一种是在使用new创建窗口的时候修改,具体在哪里修改还是要看具体情况,哪个方便就在哪里改。
首先是显示金钱的窗口,因为我们在脚本中定义过Scene_Menu的createGoldWindow函数,因此珂以在金钱窗口创造后使用
  1. this._goldWindow.opacity = 0;
复制代码
来将金钱窗口背景的透明度修改为0。
对于菜单选项窗口,我们考虑在initialize函数中修改透明度,但是我们发现initialize中已经有了其他方法,我们珂以通过重写这个方法,也就是:(具体为什么这样写珂以去看我参考资料中的烂尾教程一)
  1. xjzsqInitialize = Window_MenuCommand.prototype.initialize;
  2. Window_MenuCommand.prototype.initialize = function(){
  3.     xjzsqInitialize.call(this);
  4.     this.opacity  = 0;
  5. };
复制代码
但是我希望代码尽量短一些,所以我决定在refresh中修改透明度,原因是,refresh函数在该函数中并没有定义,而是直接继承的父类的refresh中的内容,我们自己重新定义比较方便,另外refresh函数也只在他的父类的initialize函数中被调用了一次,本质上还是在initialize中修改的。
因此我们珂以用比上面少一行的代码量来修改复杂度:
  1. Window_MenuCommand.prototype.refresh = function(){
  2.     Window_Command.prototype.refresh.call(this);
  3.     this.opacity = 0;
  4. };
复制代码
同样地,经过搜索,发现Window_MenuStatus情况也大致相同,因此采用与上面同样的方法:
  1. Window_MenuStatus.prototype.refresh = function(){
  2.     Window_Selectable.prototype.refresh.call(this);
  3.     this.opacity = 0;
  4. };
复制代码
运行游戏测试一下:
opacity.jpg
所有的窗口背景都消失了!
下面我们就插入背景图片吧!
首先大家先把我们用到的图片下载下来:


下载链接:MenuBackground
下载好以后放到工程目录的/img/system文件夹下(当然你放到其他文件夹也是珂以的,只是后面显示图片的函数会有所区别)
然后我们再次打开Scene_Menu,既然是背景,那就搜索background大概就行了吧,但是竟然没搜到…什么情况?难道默认没有这个函数吗?还不能轻易下结论,注意看Scene_Menu的父类,是Scene_MenuBase,名字就说明这个类也是专门为了菜单设置的,因此我们打开Scene_MenuBase,再次搜索找到以下函数:
  1. Scene_MenuBase.prototype.createBackground = function() {
  2.     //背景精灵 = 新 精灵()
  3.     this._backgroundSprite = new Sprite();
  4.     //背景精灵 位图 = 场景管理器 背景位图()
  5.     this._backgroundSprite.bitmap = SceneManager.backgroundBitmap();
  6.     //添加子项(背景精灵)
  7.     this.addChild(this._backgroundSprite);
  8. };
复制代码
这大概是实现在地图上截图并以此作为菜单背景的代码,因此我们珂以在Scene_Menu中重写这个函数,在父类的基础上增加显示我们刚才下载的那张图片。
首先也仿照Scene_MenuBase的createBackground函数创造一个精灵,就叫做_backgroundSprite2吧;然后指定这个精灵的位图,这里的位图,我们通过ImageManager.loadSystem("文件名"),来读取/img/system目录下文件名为”文件名.png“的文件;最后也是将精灵添加到屏幕上,代码如下:
  1. Scene_Menu.prototype.createBackground = function(){
  2.     Scene_MenuBase.prototype.createBackground.call(this);
  3.     this._backgroundSprite2 = new Sprite();
  4.     this._backgroundSprite2.bitmap = ImageManager.loadSystem("MenuBackground");
  5.     this.addChild(this._backgroundSprite2);
  6. };
复制代码
运行测试一下效果:
background.jpg
到这里,教程的基础部分就结束啦!
代码
  1. /*:
  2. @author xjzsq
  3. @plugindesc 菜单美化
  4. @help
  5.     直接打开即可食用~
  6. */

  7. //********************
  8. //带图标的金钱显示窗口
  9. //********************
  10. function Window_NewGold(){
  11.     this.initialize.apply(this, arguments);
  12. };

  13. Window_NewGold.prototype = Object.create(Window_Gold.prototype);

  14. Window_NewGold.prototype.constructor = Window_NewGold;

  15. Window_NewGold.prototype.refresh = function(){
  16.     Window_Gold.prototype.refresh.call(this);
  17.     this.drawIcon(313, 0, 0);
  18. };


  19. //******************
  20. //给菜单选项加上图标
  21. //******************
  22. var iconIndex = [208, 64, 137, 84, 75, 242, 229, 82];

  23. Window_MenuCommand.prototype.drawItem = function(index){
  24.     var rect = this.itemRectForText(index);
  25.     var align = this.itemTextAlign();
  26.     this.resetTextColor();
  27.     this.changePaintOpacity(this.isCommandEnabled(index));
  28.     this.drawIcon(iconIndex[index],rect.x,rect.y);
  29.     this.drawText(this.commandName(index), rect.x + 36, rect.y, rect.width - 36, align);
  30. };

  31. Window_MenuCommand.prototype.refresh = function(){
  32.     Window_Command.prototype.refresh.call(this);
  33.     this.opacity = 0;
  34. };


  35. //****************
  36. //美化角色状态窗口
  37. //****************
  38. Window_MenuStatus.prototype.drawItemCharacterImage = function(index){
  39.     var actor = $gameParty.members()[index];
  40.     var rect = this.itemRect(index);
  41.     this.changePaintOpacity(actor.isBattleMember());
  42.     this.drawActorCharacter(actor, rect.x + rect.width / 2 , rect.y + rect.height / 2 + 18 );
  43.     this.changePaintOpacity(true);
  44. };

  45. Window_MenuStatus.prototype.drawItem = function(index) {
  46.     this.drawItemBackground(index);
  47.     this.drawItemCharacterImage(index);
  48. };

  49. Window_MenuStatus.prototype.maxCols = function() {
  50.     return 4;
  51. };

  52. Window_MenuStatus.prototype.numVisibleRows = function() {
  53.     return 7;
  54. };

  55. Window_MenuStatus.prototype.itemRect = function(index){
  56.     var rect = new Rectangle();
  57.     var maxCols = this.maxCols();
  58.     rect.width = this.itemWidth();
  59.     rect.height = this.itemHeight();
  60.     rect.x = index % maxCols * (rect.width + this.spacing()) - this._scrollX;
  61.     rect.y = Math.floor(index / maxCols) * rect.height * ( this.numVisibleRows() - 1 ) - this._scrollY;
  62.     return rect;
  63. };


  64. //*************************
  65. //美化角色状态窗口_角色信息
  66. //*************************
  67. Window_MenuStatus.prototype.itemRectForStatus = function(){
  68.     var rect = new Rectangle();
  69.     var maxCols = this.maxCols();
  70.     rect.width = this.itemWidth() * maxCols;
  71.     rect.height = this.itemHeight();
  72.     rect.x = - this._scrollX ;
  73.     rect.y = rect.height - this._scrollY;
  74.     rect.height *= ( this.numVisibleRows() - 2 );
  75.     return rect;
  76. };

  77. Window_MenuStatus.prototype.drawActorLevel = function(actor, x, y) {
  78.     this.changeTextColor(this.systemColor());
  79.     this.drawText(TextManager.levelA, x, y, 48);
  80.     this.resetTextColor();
  81.     this.drawText(actor.level, x + 48, y, 36, 'right');
  82. };

  83. Game_BattlerBase.prototype.expRate = function() {
  84.     return this.currentExp() / this.nextLevelExp();
  85. };

  86. Window_MenuStatus.prototype.drawActorExp = function(actor, x, y, width) {
  87.     width = width || 186;
  88.     var color1 = this.tpGaugeColor1();
  89.     var color2 = this.tpGaugeColor2();
  90.     this.drawGauge(x, y, width, actor.expRate(), color1, color2);
  91.     this.changeTextColor(this.systemColor());
  92.     this.drawText(TextManager.expA, x, y, 44);
  93.     this.drawCurrentAndMax(actor.currentExp(), actor.nextLevelExp(), x, y, width,
  94.                            this.tpColor(actor), this.normalColor());
  95. };

  96. Window_MenuStatus.prototype.maxEquipmentLines = function() {
  97.     return 6;
  98. };

  99. Window_MenuStatus.prototype.drawParameters = function(actor, x, y) {
  100.     var lineHeight = this.lineHeight();
  101.     for (var i = 0; i < 6; i++) {
  102.         var paramId = i + 2;
  103.         var y2 = y + lineHeight * i;
  104.         this.changeTextColor(this.systemColor());
  105.         this.drawText(TextManager.param(paramId), x, y2, 160);
  106.         this.resetTextColor();
  107.         this.drawText(actor.param(paramId), x + 160, y2, 60, 'right');
  108.     }
  109. };

  110. Window_MenuStatus.prototype.drawEquipments = function(actor, x, y) {
  111.     var equips = actor.equips();
  112.     var count = Math.min(equips.length, this.maxEquipmentLines());
  113.     for (var i = 0; i < count; i++) {
  114.         this.drawItemName(equips[i], x, y + this.lineHeight() * i);
  115.     }
  116. };

  117. Window_MenuStatus.prototype.drawItemActorStatus = function(){
  118.     var actor = $gameParty.members()[this._index==-1?0:this._index];
  119.     var rect = this.itemRectForStatus();
  120.     this.drawActorFace(actor, rect.x, rect.y);
  121.     this.drawActorName(actor, rect.x, rect.y, 144);
  122.     var _valWidth = ( rect.width - 144 ) / 3;
  123.     this.drawActorLevel(actor, rect.x + 145, rect.y , _valWidth);
  124.     this.drawActorClass(actor, rect.x + 145 + _valWidth, rect.y, _valWidth);
  125.     this.drawActorNickname(actor, rect.x + 145 + _valWidth * 2, rect.y, _valWidth);
  126.     this.drawActorHp(actor, rect.x + 145, rect.y + 36, rect.width - 144);
  127.     this.drawActorMp(actor, rect.x + 145, rect.y + 72, rect.width - 144);
  128.     this.drawActorExp(actor, rect.x + 145, rect.y + 108, rect.width - 144);
  129.     this.drawParameters(actor, rect.x,rect.y + 144);
  130.     this.drawEquipments(actor, rect.x + 312,rect.y + 144);
  131. };

  132. var xjzsqIndex;
  133. Window_MenuStatus.prototype.update = function(){
  134.     Window_Selectable.prototype.update.call(this);
  135.     if(xjzsqIndex != this._index||(xjzsqIndex == -1 && this._index == 0))
  136.     {
  137.         var rect = this.itemRectForStatus();
  138.         this.contents.clearRect(rect.x, rect.y, rect.width, rect.height);
  139.         this.drawItemActorStatus();
  140.         xjzsqIndex = this._index;
  141.     }
  142. };

  143. Window_MenuStatus.prototype.refresh = function(){
  144.     Window_Selectable.prototype.refresh.call(this);
  145.     this.drawItemActorStatus();
  146.     this.opacity = 0;
  147. };


  148. //************
  149. //美化后的菜单
  150. //************
  151. Scene_Menu.prototype.createGoldWindow = function() {
  152.     this._goldWindow = new Window_NewGold(0, 0);
  153.     this._goldWindow.y = Graphics.boxHeight - this._goldWindow.height;
  154.     this._goldWindow.opacity = 0;
  155.     this.addWindow(this._goldWindow);
  156. };

  157. Scene_Menu.prototype.createBackground = function(){
  158.     Scene_MenuBase.prototype.createBackground.call(this);
  159.     this._backgroundSprite2 = new Sprite();
  160.     this._backgroundSprite2.bitmap = ImageManager.loadSystem("MenuBackground");
  161.     this.addChild(this._backgroundSprite2);
  162. };
复制代码
下面的附件是为了求糖,内容和上面代码框里的一致。

xjzsqMenu.zip (1.9 KB, 下载次数: 8, 售价: 100 星屑)

评分

参与人数 8+8 收起 理由
1215498520 + 1 摩拜大佬
截心手 + 1 精品文章
574656549 + 1 先写300字做一个自己的字.ttf
0moliu0 + 1 塞糖
lazilime + 1 精品文章
zxcasdqwe719 + 1 精品文章
流浪杰哥 + 1 塞糖
马铃薯条 + 1 我很赞同

查看全部评分

Lv5.捕梦者

梦石
0
星屑
28943
在线时间
602 小时
注册时间
2014-7-18
帖子
728

开拓者

 楼主| 发表于 2019-7-17 00:50:25 | 显示全部楼层
占楼待施工
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1428
在线时间
1705 小时
注册时间
2011-8-17
帖子
818
发表于 2019-7-17 18:27:39 | 显示全部楼层
楼主NB,支持一个
roguelike求生RPG研发中....
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1573
在线时间
229 小时
注册时间
2018-7-5
帖子
73
发表于 2019-7-18 21:04:09 | 显示全部楼层
前排顶帖
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1733
在线时间
278 小时
注册时间
2019-5-19
帖子
3
发表于 2019-7-19 18:06:00 | 显示全部楼层
本帖最后由 zxcasdqwe719 于 2019-7-19 18:13 编辑

順手交作業
第一次改菜單,跟著教程一步步測試之後真的有種豁然開朗的感覺w
真的很感謝po耐心細緻的教學!!

menuTest.png

作業一:步數窗口


作業二:異常狀態顯示(改了一點)

回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
28943
在线时间
602 小时
注册时间
2014-7-18
帖子
728

开拓者

 楼主| 发表于 2019-7-21 09:13:56 | 显示全部楼层
zxcasdqwe719 发表于 2019-7-19 18:06
順手交作業
第一次改菜單,跟著教程一步步測試之後真的有種豁然開朗的感覺w
真的很感謝po耐心細緻的教學! ...

非常感谢你的回复与支持!
(作业第一次有人做感觉好开心!!!
作业答案完全正确,不介意我拿来作为参考答案吧?

点评

不介意的!!謝謝po!!!  发表于 2019-7-21 11:47
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
792
在线时间
2 小时
注册时间
2017-2-16
帖子
1
发表于 2019-9-20 16:56:21 | 显示全部楼层
对于不会画图的萌新来说,这修改ui十分好用
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
229
在线时间
41 小时
注册时间
2019-12-29
帖子
5
发表于 2019-12-30 08:56:38 | 显示全部楼层
我也来交作业吧,虽然已经过去了几个月

new.zip

2.07 KB, 下载次数: 116

回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
28943
在线时间
602 小时
注册时间
2014-7-18
帖子
728

开拓者

 楼主| 发表于 2019-12-30 16:36:29 | 显示全部楼层
博丽内奥拉 发表于 2019-12-30 08:56
我也来交作业吧,虽然已经过去了几个月

作业完成得很不错!
感谢回复!
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
351
在线时间
68 小时
注册时间
2020-7-17
帖子
8
发表于 2020-8-1 01:04:33 | 显示全部楼层
抱歉,老哥。定义Window_MenuStatus.prototype.update时候,后面的function打错了...

点评

感谢提醒!  发表于 2021-2-8 01:18
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-3-29 18:17

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表