Project1

标题: 关于JS脚本学习的疑问 [打印本页]

作者: xjzsq    时间: 2016-5-7 13:08
标题: 关于JS脚本学习的疑问
经过对比VA脚本和JS脚本,我有了以下疑问:
1.是不是
function Window_Base() {
    this.initialize.apply(this, arguments);
}
Window_Base.prototype = Object.create(Window.prototype);
就相当于
class Window_Base < Window?
2.是不是
Window_Base.prototype.initialize = function(x, y, width, height) {
    Window.prototype.initialize.call(this);
    this.loadWindowskin();
    this.move(x, y, width, height);
    this.updatePadding();
    this.updateBackOpacity();
    this.updateTone();
    this.createContents();
    this._opening = false;
    this._closing = false;
    this._dimmerSprite = null;
};
就相当于
  def initialize(x, y, width, height)
    super
    self.windowskin = Cache.system("Window")
    update_padding
    update_tone
    create_contents
    @opening = @closing = false
  end?
3.那么Window_Base.prototype.constructor = Window_Base;有时什么意思?
其中的constructor又是什么方法?
作者: gonglinyuan    时间: 2016-5-7 14:57
JS里面的函数也是对象,可以赋值。
RMMV的JS没有显式地用到类(Class)的概念,而是使用函数的原型(prototype)来实现类的功能
Window_Base.prototype = Object.create(Window.prototype);
这个语句就是把Window.prototype复制一份给Window_Base.prototype,这样Window_Base类就获得了Window类的所有方法,达到了继承(inherit)的效果。
而Ruby里的继承则是显式地写成 class Window_Base < Window
第二个问题,这段js代码只是定义了Window_Base类的initialize方法,这只是一个普通的方法,并不像Ruby那样initialize就是构造函数。但是在Window_Base函数中,有这么一句this.initialize.apply(this, arguments);,就是当调用Window_Base函数(可以看作Window_Base类的构造函数,会在下面提到)的时候,将相同的参数和this引用传给initialize,也就是让initialize成为实际上的构造函数,从而与RGSS里面的写法统一。
Window_Base.prototype.constructor = Window_Base这个语句中,constructor方法就代表构造函数。前面提到,JS的函数是可以赋值的,将constructor赋值为Window_Base,就是将Window_Base函数设为构造函数(实际上它会原封不动地调用initialize,所以实际上的构造函数其实是initialize)
具体原理不必理解得太深,要写脚本只要模仿着写就行了,自搞一套反而会导致代码令人费解,因为会写脚本的人不一定都非常理解JS(那些外站脚本很多在IntellijIdea里Inspect一下会报好几百个警告,所以对于语法不要纠结太深,写出来能用就行了。。)
作者: xjzsq    时间: 2016-5-7 22:42
gonglinyuan 发表于 2016-5-7 14:57
JS里面的函数也是对象,可以赋值。
RMMV的JS没有显式地用到类(Class)的概念,而是使用函数的原型(prototype ...

谢谢回答!
那么,我还有几个问题,请您解答一下:
1.我新建了一个窗口,想在地图画面上显示出来,那么我该怎样写?
是不是必须像VA中的Scene_Map < Scene_Base重新再写一遍下面的脚本
function Scene_Map() {
    this.initialize.apply(this, arguments);
}

Scene_Map.prototype = Object.create(Scene_Base.prototype);
Scene_Map.prototype.constructor = Scene_Map;
然后,是不是必须像VA中的@XX = Window_XX.new一样写下面的:
XX = new Window_XX
但是我像下面这样写:
Scene_Map.prototype.xjzsq_start = Scene_Map.prototype.start;
Scene_Map.prototype.start = function(){
    Scene_Map.prototype.xjzsq_start.call(this);
    w = new Window_MapStatus;
测试以后显示TypeError:undefined is not a function
应该怎么写才能让窗口在场景中显示出来?
求大神指点迷津
作者: 汪汪    时间: 2016-5-7 22:46
本帖最后由 汪汪 于 2016-5-7 22:47 编辑

new Window_MapStatus()

以及
Scene_Map.prototype.xjzsq_start.call(this); 写成 this.xjzsq_start() 应该就可以
作者: xjzsq    时间: 2016-5-9 12:30
汪汪 发表于 2016-5-7 22:46
new Window_MapStatus()

以及

大神能不能给个例子,比如在地图上显示人物名字
作者: tseyik    时间: 2016-5-9 17:46
xjzsq 发表于 2016-5-7 22:42
谢谢回答!
那么,我还有几个问题,请您解答一下:
1.我新建了一个窗口,想在地图画面上显示出来,那么我 ...

參考
マップ上に常に情報ウィンドウを表示する
http://ktnhmv.jugem.jp/?cid=5
作者: xjzsq    时间: 2016-5-11 12:13
tseyik 发表于 2016-5-9 17:46
參考
マップ上に常に情報ウィンドウを表示する
http://ktnhmv.jugem.jp/?cid=5

日站打不开啊,能不能帮忙复制一下
作者: 汪汪    时间: 2016-5-11 17:02
本帖最后由 汪汪 于 2016-5-11 17:06 编辑

JAVASCRIPT 代码复制
  1. Scene_Map.prototype.createDisplayObjects = function() {
  2.         //创建精灵组
  3.     this.createSpriteset();
  4.         //创建地图名称窗口
  5.     this.createMapNameWindow();
  6.     //创建窗口层
  7.     this.createWindowLayer();
  8.         //创建所有窗口
  9.     this.createAllWindows();
  10.  
  11.     //添加部分 创建一个显示名字的窗口
  12.     this.createNameWindow();
  13.  
  14.  
  15.  
  16. };
  17.  
  18. //创建一个显示名字的窗口
  19. Scene_Map.prototype.createNameWindow = function() {
  20.         this._nameWindow = new Window_Help(1) //设置为 一个 一行的  窗口帮助
  21.         this._nameWindow.setText("名字") //设置该窗口文本为 "名字"
  22.     this.addWindow(this._nameWindow); //窗口添加到窗口层
  23.  
  24. };


作者: xjzsq    时间: 2016-5-13 19:57
本帖最后由 xjzsq 于 2016-5-14 17:39 编辑
汪汪 发表于 2016-5-11 17:02
Scene_Map.prototype.createDisplayObjects = function() {
        //创建精灵组
    this.createSpriteset();

1.是不是在JS里面向Scene_Map.prototype.createDisplayObjects里添加方法,需要把方法里的内容重新再写一遍?
2.是不是场景的方法可以直接使用,而不用再定义类?
3.Window_Help的那个行数为“1”是怎么回事?
在Window_Base中也要加上这个参数吗?
重新完善一下问题:2.在VA中,想要重新定义场景中的一个方法,例如我想在地图中显示一个窗口,我必须更改Scene_Map中的start方法,那样我必须先写上
class Scene_Map < Scene_Base
end
然后在中间重新定义start,
但是在8L的回答中,直接用的是Scene_Map.prototype,createDisplayObjects = fuction(){
}
然后把该方法的内容都加了进去,
是不是不用再重新定义一次场景了?(fuction Scene_Map...之类的代码)
3.8L的
this._nameWindow = new Window_Help(1)
这行代码中,参数“1”是怎么回事?
为什么我在Window_Help中没有找到需要加参数的标志?
如果改成
this._nameWindow = new Window_Base(1)
的话,还需要加上参数“1”吗?

作者: taroxd    时间: 2016-5-13 21:15
本帖最后由 taroxd 于 2016-5-13 21:18 编辑
xjzsq 发表于 2016-5-13 19:57
1.是不是在JS里面向Scene_Map.prototype.createDisplayObjects里添加方法,需要把方法里的内容重新再写一 ...


1. 不用。方法类似 ruby 的 alias,你可以参考 MV 自带的那些插件
2. 没看懂问题
3. 没看懂问题

请尽量使用代码和英文提问,不然的话就会像后两个问题那样,我都没看懂。当然,最好也不要一贴多问咯
作者: 汪汪    时间: 2016-5-14 17:07
xjzsq 发表于 2016-5-13 19:57
1.是不是在JS里面向Scene_Map.prototype.createDisplayObjects里添加方法,需要把方法里的内容重新再写一 ...

1,这只是一种写法,
Scene_Map.prototype.createDisplayObjects =function() {}
这种是把一个function 赋予 Scene_Map.prototype.createDisplayObjects  ,这样原本的  Scene_Map.prototype.createDisplayObjects 所代表的方法就被替代了,
解决方法有二,
一,在新的方法里把原来的方法里的内容重新写一遍
二,把原来的方法赋与一个变量 , 在新的方法里调用这个方法,
因为这个变量 和 新方法 的this 是不同的 ,所以需要 .call(this)


2  是不是场景的方法可以直接使用,而不用再定义类?
额,场景是指Scene_Map 吗? 已经被定义了吧

3,Window_Help的那个行数为“1”是怎么回事?
这个是Window_Help的一个参数,控制窗口的行数(行数就是高发变化)
Window_Base 的参数与之不同,你应该看原版mv的相应脚本
(可以参考我的机翻mv)
作者: xjzsq    时间: 2016-5-14 17:12
taroxd 发表于 2016-5-13 21:15
1. 不用。方法类似 ruby 的 alias,你可以参考 MV 自带的那些插件
2. 没看懂问题
3. 没看懂问题

对不起,我完善一下问题:
2.在VA中,想要重新定义场景中的一个方法,例如我想在地图中显示一个窗口,我必须更改Scene_Map中的start方法,那样我必须先写上
class Scene_Map < Scene_Base
end
然后在中间重新定义start,
但是在8L的回答中,直接用的是Scene_Map.prototype,createDisplayObjects = fuction(){
}
然后把该方法的内容都加了进去,
是不是不用再重新定义一次场景了?(fuction Scene_Map...之类的代码)
3.8L的
this._nameWindow = new Window_Help(1)
这行代码中,参数“1”是怎么回事?
为什么我在Window_Help中没有找到需要加参数的标志?
如果改成
this._nameWindow = new Window_Base(1)
的话,还需要加上参数“1”吗?
作者: taroxd    时间: 2016-5-14 19:54
xjzsq 发表于 2016-5-14 17:12
对不起,我完善一下问题:
2.在VA中,想要重新定义场景中的一个方法,例如我想在地图中显示一个窗口,我 ...

2. VA 中 class Scene_Map < Scene_Base 也不是类定义,只是打开类(open a class)
无论 VA 还是 MV 都不需要重新定义

3. 找对应类的构造函数(通常是调用 initialize 方法)




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1