RPG Maker MZ素材分享小站 RMMZ素材 RMMV素材 封禁暮还松攻略 封禁暮还松官方 这里主要有RMMV RMMZ的素材分享,游戏发布,以及其他一些版块,适合游戏制作爱好者一起参与讨论
当前位置:网站首页 > MV/MZ教程 > 正文

[mv教程]RMMV脚本教程(二)

作者:我想我是兔发布时间:2020-08-28分类:MV/MZ教程浏览:314评论:0


导读:(出处:66RPG)前言自从上篇教程发布,到现在已经将近1年了吧,在这一年中,由于繁重的学业以及我的懒惰,一直都没有更新...这次期中考试前夕,我在逛论坛的时候发现有人关注我的教...

(出处: 66RPG)

前言

自从上篇教程发布,到现在已经将近1年了吧,在这一年中,由于繁重的学业以及我的懒惰,一直都没有更新...
这次期中考试前夕,我在逛论坛的时候发现有人关注我的教程,并要求我写第二篇,再加上这次期中考试成绩不是很理想,所以下定决心开始写这篇教程。另外@一下支持我、催更的朋友们:@

sfliad

,@zhouhan,@lucy94920,@claudeoy

注意事项

(照抄教程1)
1.本教程提供给一些已经有一点脚本基础的学习者们(至少你要知道变量啊函数啊什么的),如果你没有达到,那我希望你打开着RMMV的F1文档来看这篇教程(F1链接:http://miaowm5.github.io/RMMV-F1/)和机翻RMMV的原生脚本(http://rm.66rpg.com/thread-385523-1-1.html),如果想要带中文注释版的RMMV的原生脚本(和作者的一样),请在楼下留言;
2.由于本人第一次写教程,因此排版上会有点(非常)乱,请多多包涵;
3.本教程可能会有一些小(或者致命的)错误,请大家积极反馈,让脚本得到完善,另外在教程内我也会有没有调试出来的地方,就请读者们说一说解决方法啦(众:写不出来还做什么教程!);
4.本教程会将RMVA(RGSS3)的语法和RMMV(JS)语法进行比较,让大家学习得更容易一些;
5.本人可能一次写不完一节的教程,会分到好几次编辑,因此会导致写到一半而发了出来的情况,请大家谅解。
(新增)
6.鉴于本人的学业繁重,三周放一次假,每次放24.5个小时,再加上本人比较懒,因此更新速度会比fei较chang慢,请谅解。
7.本人追随最新潮流,把IDE换成了VS2017。

课后作业答案

1.(略)
(我精心布置的作业竟然没人做,实在是太令人伤心了...
2.①新方法名 = 旧方法名

  1. function Window_MapStatus() {

  2.  

      

    this.initialize.apply(this,arguments)

  3. }

  4. Window_MapStatus.prototype = Object.create(Window_Base.prototype);

  5. Window_MapStatus.prototype.constructor = Window_MapStatus;

  6. Window_MapStatus.prototype.initialize = function (x, y, width, height) {

  7.  

      

    Window_Base.prototype.initialize.call(this, x, y, width, height);

  8.  

      

     this.refresh();

  9. }

复制代码

③A解析略(谁叫你们不回答的...)

正文

上回说到,我们在地图画面成功地创建了一个窗口,但我们的窗口里面还什么都没有啊,因此我们现在我们的窗口里面显示一些文字。
话说上回我们提到了Window_MapName这个窗口,这个窗口里面就一定有显示文字的方法,因此我们打开这个文件。
[教程]RMMV脚本教程(二)

 


在这个文件中,我们发现好像这个窗口和我们定义的不太一样,他比我们上节课讲的多了一个设置创造者,因此照抄不误。
另外,我们在refresh方法里面找到了drawText方法,看起来像是显示文字的方法:
[教程]RMMV脚本教程(二) 

但是我们的窗口没有refresh方法呢。我们一直是把方法定义到Scene_Map.prototype.createStatusWindow里面,这是我1年前的想法,但是这样做并不好,因此我们把脚本改成官方的写法:
找到引用refresh的地方:
[教程]RMMV脚本教程(二) 

原来是initialize,因此把我们的initialize改成这样:

  1. Window_MapStatus.prototype.initialize = function (x, y, width, height) {

  2.  

      

    Window_Base.prototype.initialize.call(this, x, y, width, height);

  3.  

      

     this.refresh();

  4. }

复制代码

(仅仅加了一条refresh)
然后在创造一个refresh方法:

  1. Window_MapStatus.prototype.refresh = function () {


  2. }

复制代码

既然是想显示文字,我们就要看下Window_MapName里面怎么定义的了:


划横线出应该就是了吧。
因此在我们的refresh方法里面也添加上这一句:

  1. this.drawText($gameParty.members()[0]._name, 0, 0, this.Width);

复制代码

这里drawText方法的介绍如下:
drawText ( text , x , y , maxWidth , [lineHeight] , [align] )

在位图上绘制描边文字。

参数:

  • text String

    要绘制的文字
  • x Number

    文字左侧的 X 坐标
  • y Number

    文字顶部的 Y 坐标
  • maxWidth Number

    文字允许的最大宽度
  • lineHeight Number

    文字的行高(可省略)
  • align String

    文字的对齐方式(可省略)


(摘自帮助文档bitmap类,有改动)
在我们的脚本里面,$gameParty.members()[0]._name就是要绘制的文字,两个0是x,y坐标,然后this.Width是获取位图的宽度,文字的行高和对齐方式省略不写。
这个方法就相当于VA中的draw_text方法。
现在运行一下,看看效果:
[教程]RMMV脚本教程(二) 

成功了的说!!!
但是眼尖的同学已经发现默认脚本Window_Base里面已经有一个drawActorName方法了,看一下他的定义:
[教程]RMMV脚本教程(二) 

这里面包含了drawText方法,并且还增加了当角色HP较低时将名字变色的效果,因此比我们的脚本写得更加美观。
因此把我们的

  1. this.drawText($gameParty.members()[0]._name, 0, 0, this.Width);

复制代码

改成

  1. this.drawActorName($gameParty.members()[0], 0, 0);

复制代码

即可。
这里我们的参数也省略了不少,另外在其方法内部可以看到width默认是168,这个值在绘制LV时会用到。

 

最终实现代码:


  1. var $refresh = true;

  2. function Window_MapStatus() {

  3.  

      

    this.initialize.apply(this,arguments)

  4. }

  5. Window_MapStatus.prototype = Object.create(Window_Base.prototype);

  6. Window_MapStatus.prototype.constructor = Window_MapStatus;

  7. Window_MapStatus.prototype.initialize = function (x, y, width, height) {

  8.  

      

    Window_Base.prototype.initialize.call(this, x, y, width, height);

  9.  

      

     this.opacity = 0;

  10.  

      

     this.refresh();

  11. }

  12. Game_Actor.prototype.xjzsq_refresh = Game_Actor.prototype.refresh;

  13. Game_Actor.prototype.refresh = function () {

  14.  

      

     this.xjzsq_refresh;

  15.  

      

     $refresh = true;

  16. }

  17. Window_MapStatus.prototype.drawGauge = function (x, y, width, rate, color1, color2) {

  18.  

      

     var fillW = Math.floor(width * rate);

  19.  

      

     var gaugeY = y + this.lineHeight() - 8;

  20.  

      

     this.contents.fillRect(x, gaugeY, width, 6, this.gaugeBackColor());

  21.  

      

    this.contents.gradientFillRect(x, y + 24, fillW, 6, color1, color2, true);

  22.  

      

    this.contents.gradientFillRect(x, y + 30, fillW, 6, color2, color1, true);

  23.  

      

     this.contents.fillRect(x, y + 24, width, 2, this.normalColor());

  24.  

      

     this.contents.fillRect(x, y + 34, width, 2, this.normalColor());

  25.  

      

     this.contents.fillRect(x, y + 26, 2, 8, this.normalColor());

  26.  

      

     this.contents.fillRect(x + width - 2, y + 26, 2, 8, this.normalColor());

  27. };

  28. Window_MapStatus.prototype.refresh = function () {

  29.  

      

    this.contents.clear();

  30.  

      

    this.drawActorFace($gameParty.members()[0], 0, 0);

  31.  

      

    this.drawActorName($gameParty.members()[0], 0, 0);

  32.  

      

    this.drawActorLevel($gameParty.members()[0], 151, 0);

  33.  

      

    this.drawActorIcons($gameParty.members()[0], 0, 108);

  34.  

      

    this.drawActorHp($gameParty.members()[0], 151, 36);

  35.  

      

    this.drawActorMp($gameParty.members()[0], 151, 72);

  36.  

      

    this.drawActorTp($gameParty.members()[0], 151, 108, 186);

  37.  

      

    this.drawActorExp($gameParty.members()[0], 0, 144, 346);

  38. }

  39. Window_MapStatus.prototype.update = function () {

  40.  

      

    Window_Base.prototype.update.call(this);

  41.  

      

     if($refresh){

  42.  

      

     

     

     

     

    this.refresh();

  43.  

      

     

     

     

     

    $refresh = false;

  44.  

      

     }

  45.  

      

     if ($gamePlayer.screenX() >= 0 && $gamePlayer.screenX() <= this.width && $gamePlayer.screenY() >= 0 && $gamePlayer.screenY() <= this.height)

  46.  

      

     {

  47.  

      

     

     

     

     

    this.contentsOpacity = 75;

  48.  

      

     }

  49.  

      

     else this.contentsOpacity = 225;

  50. }

  51. Game_BattlerBase.prototype.expRate = function () {

  52.  

      

     return this.currentExp() / this.nextLevelExp();

  53. };

  54. Window_MapStatus.prototype.drawActorExp = function (actor, x, y, width) {

  55.  

      

     width = width || 186;

  56.  

      

     var color1 = this.tpGaugeColor1();

  57.  

      

     var color2 = this.tpGaugeColor2();

  58.  

      

     this.drawGauge(x, y, width, actor.expRate(), color1, color2);

  59.  

      

    this.changeTextColor(this.systemColor());

  60.  

      

    this.drawText(TextManager.expA, x, y, 44);

  61.  

      

    this.drawCurrentAndMax(actor.currentExp(), actor.nextLevelExp(), x, y, width,

  62.  

      

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    this.tpColor(actor), this.normalColor());

  63. };


  64. Scene_Map.prototype.createDisplayObjects = function () {

  65.  

      

     //创建精灵组

  66.  

      

    this.createSpriteset();

  67.  

      

     //创建地图名称窗口

  68.  

      

    this.createMapNameWindow();

  69.  

      

     //创建窗口层

  70.  

      

    this.createWindowLayer();

  71.  

      

     //创建所有窗口

  72.  

      

    this.createAllWindows();


  73.  

      

     //创建一个显示角色状态的窗口

  74.  

      

    this.createStatusWindow();




  75. };

  76. //创建

  77. Scene_Map.prototype.xjzsq_create = Scene_Map.prototype.create

  78. Scene_Map.prototype.create = function () {

  79.  

      

     this.xjzsq_create()

  80.  

      

     var face = ImageManager.loadFace($gameParty.members()[0]._faceName);

  81.  

      

     var icons = ImageManager.loadSystem('IconSet');

  82. };


  83. //创建一个显示名字的窗口

  84. Scene_Map.prototype.createStatusWindow = function () {

  85.  

      

     this._StatusWindow = new Window_MapStatus(0, 0, 410, 216);

  86.  

      

    this.addWindow(this._StatusWindow); //窗口添加到窗口层

  87. };

复制代码


标签:RMmv脚本教程


欢迎 发表评论:

MV/MZ教程排行
用户管理
您好,欢迎到访网站!
  查看权限
网站分类
站点信息
  • 文章总数:43
  • 页面总数:2
  • 分类总数:8
  • 标签总数:36
  • 评论总数:114
  • 浏览总数:9376

欢迎来到兔子的 RPG Maker mz /mv 素材分享小站 独立游戏发布 封禁暮还松

请在此登录您账号

立即注册