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

Project1

 找回密码
 注册会员
搜索
查看: 15153|回复: 19
打印 上一主题 下一主题

[原创发布] [教程]RMMV脚本教程(二)(更新最终实现代码)

[复制链接]

Lv5.捕梦者

梦石
0
星屑
29245
在线时间
604 小时
注册时间
2014-7-18
帖子
729

开拓者

跳转到指定楼层
1
发表于 2017-5-1 13:32:43 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

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

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

x
本帖最后由 xjzsq 于 2018-2-6 22:50 编辑

教程一传送门:[教程]RMMV脚本教程(一)
https://rpg.blue/forum.php?mod=viewthread&tid=394509

(出处: 66RPG)

前言
自从上篇教程发布,到现在已经将近1年了吧,在这一年中,由于繁重的学业以及我的懒惰,一直都没有更新...
这次期中考试前夕,我在逛论坛的时候发现有人关注我的教程,并要求我写第二篇,再加上这次期中考试成绩不是很理想,所以下定决心开始写这篇教程。另外@一下支持我、催更的朋友们:@
sfliad
,@zhouhan,@lucy94920,@claudeoy
注意事项
(照抄教程1)
1.本教程提供给一些已经有一点脚本基础的学习者们(至少你要知道变量啊函数啊什么的),如果你没有达到,那我希望你打开着RMMV的F1文档来看这篇教程(F1链接:http://miaowm5.github.io/RMMV-F1/)和机翻RMMV的原生脚本(https://rpg.blue/thread-385523-1-1.html,最近突然发现汪汪大佬在很久以前就把翻译脚本放到了github上,这里放上链接:https://github.com/wangwangxingao/RMMV/tree/master/%E6%B3%A8%E9%87%8A
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这个窗口,这个窗口里面就一定有显示文字的方法,因此我们打开这个文件。


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


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


原来是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方法。
现在运行一下,看看效果:


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


这里面包含了drawText方法,并且还增加了当角色HP较低时将名字变色的效果,因此比我们的脚本写得更加美观。
因此把我们的
  1. this.drawText($gameParty.members()[0]._name, 0, 0, this.Width);
复制代码
改成
  1. this.drawActorName($gameParty.members()[0], 0, 0);
复制代码
即可。
这里我们的参数也省略了不少,另外在其方法内部可以看到width默认是168,这个值在绘制LV时会用到。
写到这里,先发表出来,以防万一。





评分

参与人数 3星屑 +120 +2 收起 理由
醬油幽靈 + 1 塞糖
白嫩白嫩的 + 1 塞糖
柳岳枫 + 120 精品文章

查看全部评分

Lv1.梦旅人

梦石
0
星屑
19
在线时间
3 小时
注册时间
2024-3-20
帖子
1
20
发表于 2024-4-1 13:30:12 | 只看该作者
考古 学会鸟
不做黄油你学个毛
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
424
在线时间
103 小时
注册时间
2022-4-28
帖子
116
19
发表于 2022-6-8 00:17:28 | 只看该作者
看的真过瘾,虽然不懂代码
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
33
在线时间
6 小时
注册时间
2019-11-14
帖子
1
18
发表于 2019-11-16 07:02:44 | 只看该作者
学到了,谢谢大佬
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
29245
在线时间
604 小时
注册时间
2014-7-18
帖子
729

开拓者

17
 楼主| 发表于 2019-11-16 03:37:33 | 只看该作者
meng133692 发表于 2019-11-3 21:51
你好可以给个例子吗?我加入了那条代码并没有透明

窗口更新对应的是这些代码:(作用是刷新窗口,如果角色走到窗口上的话,就把窗口的透明度改为75)
  1. Window_MapStatus.prototype.update = function () {
  2.     Window_Base.prototype.update.call(this);
  3.     if($refresh){
  4.         this.refresh();
  5.         $refresh = false;
  6.     }
  7.     if ($gamePlayer.screenX() >= 0 && $gamePlayer.screenX() <= this.width && $gamePlayer.screenY() >= 0 && $gamePlayer.screenY() <= this.height)
  8.     {
  9.         this.contentsOpacity = 75;
  10.     }
  11.     else this.contentsOpacity = 225;
  12. }
复制代码

按照您的要求的话,只要在if里面加上需要透明的条件,并把上面的75改成0即可。
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
29245
在线时间
604 小时
注册时间
2014-7-18
帖子
729

开拓者

16
 楼主| 发表于 2019-11-16 03:33:56 | 只看该作者
织梦行云 发表于 2019-11-1 16:30
楼主,你的汉化版js文件怎么下的,我的别说汉化,连个注释都没有,很坑

我在注意事项第1条那里已经放上下载链接了...
我再放一次吧:https://github.com/wangwangxinga ... /%E6%B3%A8%E9%87%8A
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
227
在线时间
26 小时
注册时间
2018-12-12
帖子
10
15
发表于 2019-11-3 21:51:48 | 只看该作者
xjzsq 发表于 2019-10-4 14:40
隐藏的话,你修改一下Window_MapStatus.prototype.update函数,当满足某种条件的时候把窗口的透明度改成0 ...

你好可以给个例子吗?我加入了那条代码并没有透明
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1092
在线时间
41 小时
注册时间
2013-8-14
帖子
216
14
发表于 2019-11-1 16:37:12 | 只看该作者
大佬,汉化版的RMMV js库有吗,我找不到。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1092
在线时间
41 小时
注册时间
2013-8-14
帖子
216
13
发表于 2019-11-1 16:30:16 | 只看该作者
楼主,你的汉化版js文件怎么下的,我的别说汉化,连个注释都没有,很坑
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1092
在线时间
41 小时
注册时间
2013-8-14
帖子
216
12
发表于 2019-11-1 15:37:09 | 只看该作者
支持一波!!!!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-4 07:14

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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