| 
 
| 赞 | 36 |  
| VIP | 2 |  
| 好人卡 | 3 |  
| 积分 | 344 |  
| 经验 | 36064 |  
| 最后登录 | 2025-10-21 |  
| 在线时间 | 611 小时 |  
 Lv5.捕梦者 
	梦石2 星屑32407 在线时间611 小时注册时间2014-7-18帖子730  
 | 
| 
本帖最后由 xjzsq 于 2018-2-6 22:48 编辑
x
加入我们,或者,欢迎回来。您需要 登录 才可以下载或查看,没有帐号?注册会员  
 在rmmv一出来,受到这个帖子https://rpg.blue/thread-285650-1-1.html的影响就想写个脚本教程,因此就怀揣着一个做教程的梦想,开始学习JS,经过一段时间的学习,终于略有领会,因此全部记录在教程上。今天,我会带领大家写一个能够显示领队基本状态的窗口,来入门一下RMMV。
 1.本教程提供给一些已经有一点脚本基础的学习者们(至少你要知道变量啊函数啊什么的),如果你没有达到,那我希望你打开着RMMV的F1文档来看这篇教程(F1链接:http://miaowm5.github.io/RMMV-F1/)和机翻RMMV的原生脚本(https://rpg.blue/thread-384626-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.本人可能一次写不完一节的教程,会分到好几次编辑,因此会导致写到一半而发了出来的情况,请大家谅解。
 废话不多说,开始教程吧(众:明明已经说了一大堆废话)!
 首先,新建一个RMMV工程,然后新建一个JS脚本文件,用一个脚本编辑器甚至记事本打开它(推荐notepad++,本人这里用的是VS2015),然后插入以下脚本:
 
 这个呢,是新建一个窗口,叫做Window_MapStatus,复制代码function Window_MapStatus() {
然后,大家是否记得,在RMVA中,使用class Window_MapStatus < Window_Base 来新建一个窗口的,那么,Window_Base 去哪里了呢?
 请在下方输入以下脚本:
 
 这样,就成功地把Window_Base里的方法全部复制到了Window_MapStatus 里面,相当于Window_MapStatus < Window_Base,即使Window_Base成为了Window_MapStatus的父类。复制代码Window_MapStatus.prototype = Object.create(Window_Base.prototype);
接着,按照程序,应该定义initialize了,插入一下代码:
 
 这样就相当于在VA中的一下代码:复制代码Window_MapStatus.prototype.initialize = function (x, y, width, height) {
    Window_Base.prototype.initialize.call(this, x, y, width, height);
}
 (当然,还不完全一样)复制代码def initialize
     super(0, 0, 144, 273)
end
然后,向第二行中加入下面的代码:
 
 这是引用initialize方法。复制代码this.initialize.apply(this,arguments)
于是,你的脚本应该成了下面的样子:
 
 现在运行一下,复制代码function Window_MapStatus() {
this.initialize.apply(this,arguments)
}
Window_MapStatus.prototype = Object.create(Window_Base.prototype);
Window_MapStatus.prototype.initialize = function (x, y, width, height) {
Window_Base.prototype.initialize.call(this, x, y, width, height);
}
发现窗口还无法显示出来,因此要在地图场景(Scene_Map)上做文章。
 首先,打开原生脚本汉化(可以到注意事项里去找,如果要和我一样的,请在楼下留言),我们应该找什么呢?
 肯定要找到scene_Map啦。
 打开rpg_scenes文件夹,找到04 Scene_Map.js,打开它。
 然后在里面搜索“window”,找到第一个结果:
   _mapNameWindow是什么鬼?
 搜索看看...
 搜到了这些:(需要向下查找几次,找到其定义的地方)
 
   
 哦,原来是显示地图名称的窗口!
 看看他在哪里定义的?
 Ctrl+F搜索createMapNameWindow,
 搜到了这个方法:
 
   
 看来显示的对象都在这里添加的呢,于是我们也在这里添加一个窗口吧!
 把以上脚本复制到我们的文件里面,
 并在this.createAllWindows();下面,};的上面插入以下脚本:
 
 同学A:为什么要把createDisplayObjects方法全部复制到脚本里面呢?我们不是有alias吗?复制代码    //创建一个显示角色状态的窗口
    this.createStatusWindow();
不愧是同学A,RMVA的语法已经在脑中根深蒂固了,其实呢,MV或是说JS里面压根就没有alias,如果你真的想要模拟alias的话,可以使用一下脚本:
 
 复制代码new_name = Scene_Map.prototype.createDisplayObjects
new_name的部分可以按照个人喜好去改,
 这句话就相当于VA中的
 
 所以,这就是VA与MV的不同之一:复制代码alias new_name createDisplayObjects
 至于这两种方法的好坏,就见仁见智了,这里不予评价。| 比较内容 | VA | MV |  | 往方法里添加内容 | alias 新方法名 旧方法名 | 新方法名 = 旧方法名 | 
 然后...(不知为啥,老是喜欢带上个然后...)咱们运行一下好不好?
 
   
 同学A:怎么出错了,是不是在骗我们!(怒目圆睁中...)
 哎呀,失手了,还没定义createStatusWindow方法呢...
 现在来定义createStatusWindow方法。
 同学们还记得显示地图名称的那个方法吗?
 代码是这样的:
 
 复制代码Scene_Map.prototype.createMapNameWindow = function() {
    this._mapNameWindow = new Window_MapName();
我们也仿照他来写。(众:这是明显的抄袭行为啊!!!)
 把整个方法复制到我们的代码里去,
 然后嘛,我们就开始让他脱胎换骨了!!!(众:至于说的这么严重吗...)
 首先,我们应该把createMapNameWindow改成createStatusWindow,
 接着研究下面的语句:
 this._mapNameWindow = new Window_MapName();
 这句话好像是新建了一个Window_MapName的实例
 那么我们也新建一个,名字叫什么好呢,就叫做_StatusWindow吧!
 因此,我们就把_mapNameWindow改成_StatusWindow,并把Window_MapName改成,再看下一行:
 
 addChild是个什么鬼?复制代码this.addChild(this._mapNameWindow);
去查一下帮助文档怎么样?
 经查询发现,帮助文档里面竟然没有Scene!!!
 那么该怎么办呢?
 我们就打破砂锅问到底!
 找到Scene_Map的父类Scene_Base,打开它,看看他的父类是什么。
 
   
 如图,我们看到他的父类是Stage
 再帮助文档里面找找看,找到了!
 
   
 还真的有addChild方法,
 点击看看:
 
   
 哦,原来是把子元素添加到Scene_Map!
 按照LZ的理解,就是把窗口加到Scene_Map里面,让这个窗口能显示出来。
 于是我们把this._mapNameWindow改成this._StatusWindow,
 现在我们的脚本已经变成了下面的样子:
 
 测试一下怎么样?复制代码function Window_MapStatus() {
    this.initialize.apply(this, arguments)
}
Window_MapStatus.prototype = Object.create(Window_Base.prototype);
Window_MapStatus.prototype.initialize = function (x, y, width, height) {
    Window_Base.prototype.initialize.call(this, x, y, width, height);
}
Scene_Map.prototype.createDisplayObjects = function () {
    //创建精灵组
    this.createSpriteset();
    //创建地图名称窗口
    this.createMapNameWindow();
    //创建窗口层
    this.createWindowLayer();
    //创建所有窗口
    this.createAllWindows();
    //创建一个显示角色状态的窗口
    this.createStatusWindow();
};
//创建一个显示名字的窗口
Scene_Map.prototype.createStatusWindow = function () {
    this._StatusWindow = new Window_MapStatus();
    this.addWindow(this._StatusWindow); //把窗口添加到窗口层
};
   
 同学A:为什么还是什么都没有,你是不是在骗我们?!
 哎呀,又失手了,让大家见谅了...(众:怎么总失手,再失手信不信把你赶下讲台(有讲台吗?)!!!)
 注意了,this._StatusWindow = new Window_MapStatus();这一句中,必须有参数!!!
 或者亦可以在创建函数的时候预留参数,这里就在生成实例的时候添加参数吧!
 在生成实例的那一句里面,加入4个参数,0, 0, 410, 216
 分别对应窗口的x坐标,y坐标,宽度,高度,
 说的更专业一些(模仿一下帮助文档的口气):
 this._name = new Window_XX(x,y,width,height)
 新建一个坐标为(x,y),宽度为width,高度为height的Window_XX的窗口的实例_name。注释: 参数:_name String
 实例的名称。Window_XX String
 窗口名称。 
 x Number窗口的x坐标。y Number窗口的y坐标。width Number窗口的宽度。height Number窗口的高度 
 
 好,现在再运行一下看看:
 
   
 成功了!好感动(*^▽^*)
 (众:不就是显示出来了个窗口吗?至于反应这么激烈吗?!)
 最后,我们成功地把窗口显示到了地图上,为下一步在窗口里面绘制角色的名字、LV、脸图、状态等东西奠定了基础。
 同学A:这么大一篇文章才讲了这么一点东西?!效率未免有点低了吧...感觉一节课没讲多少东西,都让你废话了...
 那好吧,既然已经写了这么多了,就总结一下吧!总结看楼下...
 
 
 
 | 
 评分
查看全部评分
 |