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

Project1

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

[原创发布] [教程]RMMV脚本教程(一)

[复制链接]

Lv5.捕梦者

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

开拓者

跳转到指定楼层
1
发表于 2016-7-11 16:05:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

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

前言
在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),然后插入以下脚本:
  1. function Window_MapStatus() {
复制代码
这个呢,是新建一个窗口,叫做Window_MapStatus,
然后,大家是否记得,在RMVA中,使用class Window_MapStatus < Window_Base 来新建一个窗口的,那么,Window_Base 去哪里了呢?
请在下方输入以下脚本:
  1. Window_MapStatus.prototype = Object.create(Window_Base.prototype);
复制代码
这样,就成功地把Window_Base里的方法全部复制到了Window_MapStatus 里面,相当于Window_MapStatus < Window_Base,即使Window_Base成为了Window_MapStatus的父类。
接着,按照程序,应该定义initialize了,插入一下代码:
  1. Window_MapStatus.prototype.initialize = function (x, y, width, height) {
  2.     Window_Base.prototype.initialize.call(this, x, y, width, height);
  3. }
复制代码
这样就相当于在VA中的一下代码:
  1. def initialize
  2.      super(0, 0, 144, 273)
  3. end
复制代码
(当然,还不完全一样)
然后,向第二行中加入下面的代码:
  1. this.initialize.apply(this,arguments)
复制代码
这是引用initialize方法。
于是,你的脚本应该成了下面的样子:
  1. function Window_MapStatus() {
  2. this.initialize.apply(this,arguments)
  3. }
  4. Window_MapStatus.prototype = Object.create(Window_Base.prototype);
  5. Window_MapStatus.prototype.initialize = function (x, y, width, height) {
  6. Window_Base.prototype.initialize.call(this, x, y, width, height);
  7. }
复制代码
现在运行一下,
发现窗口还无法显示出来,因此要在地图场景(Scene_Map)上做文章。
首先,打开原生脚本汉化(可以到注意事项里去找,如果要和我一样的,请在楼下留言),我们应该找什么呢?
肯定要找到scene_Map啦。
打开rpg_scenes文件夹,找到04 Scene_Map.js,打开它。
然后在里面搜索“window”,找到第一个结果:
_mapNameWindow是什么鬼?
搜索看看...
搜到了这些:(需要向下查找几次,找到其定义的地方)


哦,原来是显示地图名称的窗口!
看看他在哪里定义的?
Ctrl+F搜索createMapNameWindow
搜到了这个方法:


看来显示的对象都在这里添加的呢,于是我们也在这里添加一个窗口吧!
把以上脚本复制到我们的文件里面,
并在this.createAllWindows();下面,};的上面插入以下脚本:
  1.     //创建一个显示角色状态的窗口
  2.     this.createStatusWindow();
复制代码
同学A:为什么要把createDisplayObjects方法全部复制到脚本里面呢?我们不是有alias吗?
不愧是同学A,RMVA的语法已经在脑中根深蒂固了,其实呢,MV或是说JS里面压根就没有alias,如果你真的想要模拟alias的话,可以使用一下脚本:
  1. new_name = Scene_Map.prototype.createDisplayObjects
复制代码

new_name的部分可以按照个人喜好去改,
这句话就相当于VA中的
  1. alias new_name createDisplayObjects
复制代码
所以,这就是VA与MV的不同之一:
比较内容 VA MV
往方法里添加内容 alias 新方法名 旧方法名 新方法名 = 旧方法名
至于这两种方法的好坏,就见仁见智了,这里不予评价。
然后...(不知为啥,老是喜欢带上个然后...)咱们运行一下好不好?


同学A:怎么出错了,是不是在骗我们!(怒目圆睁中...)
哎呀,失手了,还没定义createStatusWindow方法呢...
现在来定义createStatusWindow方法。
同学们还记得显示地图名称的那个方法吗?
代码是这样的:
  1. Scene_Map.prototype.createMapNameWindow = function() {
  2.     this._mapNameWindow = new Window_MapName();
复制代码

我们也仿照他来写。(众:这是明显的抄袭行为啊!!!)
把整个方法复制到我们的代码里去,
然后嘛,我们就开始让他脱胎换骨了!!!(众:至于说的这么严重吗...)
首先,我们应该把createMapNameWindow改成createStatusWindow
接着研究下面的语句:
this._mapNameWindow = new Window_MapName();
这句话好像是新建了一个Window_MapName的实例
那么我们也新建一个,名字叫什么好呢,就叫做_StatusWindow吧!
因此,我们就把_mapNameWindow改成_StatusWindow,并把Window_MapName改成,再看下一行:
  1. this.addChild(this._mapNameWindow);
复制代码
addChild是个什么鬼?
去查一下帮助文档怎么样?
经查询发现,帮助文档里面竟然没有Scene!!!
那么该怎么办呢?
我们就打破砂锅问到底!
找到Scene_Map的父类Scene_Base,打开它,看看他的父类是什么。


如图,我们看到他的父类是Stage
再帮助文档里面找找看,找到了!


还真的有addChild方法,
点击看看:


哦,原来是把子元素添加到Scene_Map!
按照LZ的理解,就是把窗口加到Scene_Map里面,让这个窗口能显示出来。
于是我们把this._mapNameWindow改成this._StatusWindow,
现在我们的脚本已经变成了下面的样子:
  1. function Window_MapStatus() {
  2.     this.initialize.apply(this, arguments)
  3. }
  4. Window_MapStatus.prototype = Object.create(Window_Base.prototype);
  5. Window_MapStatus.prototype.initialize = function (x, y, width, height) {
  6.     Window_Base.prototype.initialize.call(this, x, y, width, height);
  7. }

  8. Scene_Map.prototype.createDisplayObjects = function () {
  9.     //创建精灵组
  10.     this.createSpriteset();
  11.     //创建地图名称窗口
  12.     this.createMapNameWindow();
  13.     //创建窗口层
  14.     this.createWindowLayer();
  15.     //创建所有窗口
  16.     this.createAllWindows();

  17.     //创建一个显示角色状态的窗口
  18.     this.createStatusWindow();



  19. };

  20. //创建一个显示名字的窗口
  21. Scene_Map.prototype.createStatusWindow = function () {
  22.     this._StatusWindow = new Window_MapStatus();
  23.     this.addWindow(this._StatusWindow); //把窗口添加到窗口层

  24. };
复制代码
测试一下怎么样?


同学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:这么大一篇文章才讲了这么一点东西?!效率未免有点低了吧...感觉一节课没讲多少东西,都让你废话了...
那好吧,既然已经写了这么多了,就总结一下吧!总结看楼下...


评分

参与人数 6星屑 +509 +1 收起 理由
银河异次元 + 1
唯道集虚 + 9 支持认真的教程
鑫晴 + 400 塞糖
汪汪 + 32 加油啊,很好
柳岳枫 + 60 加油!
mitori10feet + 8 我很赞同

查看全部评分

Lv5.捕梦者

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

开拓者

2
 楼主| 发表于 2016-7-13 23:56:09 | 只看该作者
总结
重点部分来了!!!
这一节课,我们讲了些什么呢?
就让我带领大家重温一遍吧!
1.我们比较了RMMV(JavaScript)与RMVA(RGSS3)一些不同之处:
  比较内容 VA  MV
创建一个新的窗口类并设置父类 class Window_MapStatus < Window_Base function Window_MapStatus() {    this.initialize.apply(this,arguments)
}
Window_MapStatus.prototype = Object.create(Window_Base.prototype);

初始化方法def initialize
    super(x,y,width,height)
end
  Window_MapStatus.prototype.initialize = function (x, y, width, height) {    Window_Base.prototype.initialize.call(this, x, y, width, height);
}
往方法里添加内容 alias 新方法名 旧方法名 新方法名 = 旧方法名
定义窗口大小的位置(习惯) 定义窗口类的地方生成窗口实例的地方
生成窗口实例的方法 $name = Window_XX.new this._name = new Window_XX(x,y,width,height
2.我们还介绍了一些方法



新方法名 = 旧方法名
往方法里添加内容

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
    窗口的高度

3.另外,我们还介绍了一个写脚本的常用流程:
搜索!→复制!!→改/仿写!!!
搜索:
①搜索和你想要写的东西类似的已有的东西。
比如:本节课我们要在地图上显示窗口,就应该在Scene_Map里面搜索,下面的课程中也会不断锻炼读者们的搜索能力。
②一搜到底
比如:本节课中我们抓住搜到的内容不断搜索,一直到不能搜、我们已经充分了解该怎么做、往那里写、写什么才罢休。
就是要有打破砂锅问到底的精神才行!
复制:
唯一可以说的是复制的快捷键:Ctrl+C,粘贴的快捷键:Ctrl+V
改/仿写:
①要仔细端摩,看出什么应该保留,什么应该修改/换掉。
这部分内容有点像语文的句式仿写题,需要多练,在下面的章节中也会不断练习。
②特别注意参数的改变
例如:本节课中,就只因掉了4个参数,而导致窗口无法显示出来,但也不会报错,这是最要命的一点,有的时候找很长时间亦找不出错误在何处,因此要切记这一易错点!
易出错的原因:一般系统默认脚本都是在执行时按照编辑器里或者从其他方法中(比如DataManger)获取数据,而你的脚本无法做到这一点。
课后作业
1.复习本课内容,自己试着把代码敲一遍(可以从默认脚本中复制和改写)
把你的运行情况截图发出来回复我,手快的有经验奖励!
2.思考下面几个问题,可以选择回复给我答案。
(标准答案会从回复中选取并在下节课中公布出来哦!)
①alias在MV中如何使用?
②MV中新建一个窗口的基本框架是什么?
③如果想要在菜单界面添加一个窗口,应该去哪个文件搜索?()(本题目要求说明选择的原因)
A.Scene_Map   B.Scene_MenuBase  C.Scene_Menu  D.Window_Base
感言
写这篇教程也是费了不少心思,第一次体会到了写教程的艰辛。
请大家积极互动,谢谢大家!
大家的支持是我最大的动力!O(∩_∩)O


点评

虽然很想学,但是看见代码就晕了……看来只能做一辈子伸手党了(哭)  发表于 2016-7-30 03:18
雖然沒啥人回覆 , 不過觀眾也是有的 , 我很清楚對空氣說話的感受 , 努力填坑吧 , 將來我會呈上最好的作品來回饋各大神的心血。  发表于 2016-7-14 15:34
回复 支持 2 反对 0

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
6 小时
注册时间
2016-7-14
帖子
12
3
发表于 2016-7-14 14:22:44 | 只看该作者
好好好!!!楼主加油,不过你拿VS开发我也是无语了!!!建议用Hbulider开发吧!附上网址:http://www.dcloud.io/

点评

感谢支持!!!用VS2015其实是因为觉得已经花好长时间安装VS了,安装上不用感觉有点太浪费了...  发表于 2016-7-14 16:01
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
3
星屑
363
在线时间
217 小时
注册时间
2015-2-4
帖子
93
4
发表于 2016-7-14 16:47:10 | 只看该作者
超赞!敲碗求后续!求显示内容的部分

点评

///><///可以有!爬回去来处理一发!  发表于 2016-7-14 19:09
那么是不是应该先完成作业呢?没有答案没法下一节公布啊  发表于 2016-7-14 19:01
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
177
在线时间
170 小时
注册时间
2012-3-4
帖子
57
5
发表于 2016-7-18 00:17:12 手机端发表。 | 只看该作者
还在读本身的js文件,学习了。有些好难理解

点评

我这个帖子其实就是带着大家读本身的文件  发表于 2016-7-18 14:25
已经转到技术区,以后会在技术区发布:http://rm.66rpg.com/forum.php?mod=viewthread&tid=394695&page=1#pid2689022  发表于 2016-7-18 14:24
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1232
在线时间
1017 小时
注册时间
2011-4-30
帖子
1516
6
发表于 2016-7-18 16:11:09 | 只看该作者
带中文注释版的RMMV的脚本  
可以看
【小白机翻】rpg_mv_js
https://rpg.blue/thread-385523-1-1.html
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
885
在线时间
3 小时
注册时间
2016-8-3
帖子
1
7
发表于 2016-8-6 00:25:41 | 只看该作者
  受教了,楼主继续加油出后续啊。我现在想用RMMV做一个ARPG模式出来,具体要经过哪几步啊,能不能指教下。我目前才起步研究怎么让人物根据不同按键移动和做动作。。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
11484
在线时间
831 小时
注册时间
2014-10-24
帖子
307
8
发表于 2016-8-6 08:41:16 | 只看该作者
果然是很不错的教程
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
30 小时
注册时间
2016-6-12
帖子
31
9
发表于 2016-8-7 11:30:32 | 只看该作者
楼主辛苦
您就不打算继续教我怎么把人物当前坐标实时显示在这个框框里吗
回复 支持 反对

使用道具 举报

Lv5.捕梦者

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

开拓者

10
 楼主| 发表于 2016-8-7 23:45:47 | 只看该作者
本帖最后由 xjzsq 于 2016-8-7 23:47 编辑
tomlee1980 发表于 2016-8-7 11:30
楼主辛苦
您就不打算继续教我怎么把人物当前坐标实时显示在这个框框里吗 ...

那还不做一下作业支持我一下。。。
你怎么知道我后续要讲的内容?!
这大概是下节课或者下下节课的作业...

点评

那么的话...下节课作业就降低些难度吧!!!(你没必要把题目全部做出来,做出那个写那个即可)  发表于 2016-8-8 21:33
报告老师,作业不会做。。。 能不能边罚站边听课???  发表于 2016-8-8 20:57
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-20 02:13

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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