Project1

标题: 如何写插件覆盖RM原有的函数? [打印本页]

作者: asukalin    时间: 2022-11-25 20:47
标题: 如何写插件覆盖RM原有的函数?
在js里,函数貌似是叫“方法”?

我想修改rpg_windows.js和rpg_scene.js等文件中函数的内容。

例如,在地图画面按菜单键,原本是打开主菜单。
rpg_scene.js里对应的函数是
  1. Scene_Map.prototype.callMenu = function() {
  2.     SoundManager.playOk();
  3.     SceneManager.push(Scene_Menu);
  4.     Window_MenuCommand.initCommandPosition();
  5.     $gameTemp.clearDestination();
  6.     this._mapNameWindow.hide();
  7.     this._waitCount = 2;
  8. };
复制代码

我改成了按菜单键直接打开“返回标题”菜单。
直接修改rpg_scene.js很容易就做的到
  1. Scene_Map.prototype.callMenu = function() {
  2.     SoundManager.playOk();
  3.     SceneManager.push(Scene_GameEnd);
  4.     Window_MenuCommand.initCommandPosition();
  5.     $gameTemp.clearDestination();
  6.     this._mapNameWindow.hide();
  7.     this._waitCount = 2;
  8. };
复制代码

但我想保留着rpg_scene.js不碰,将我自己改的Scene_Map.prototype.callMenu函数放进插件里

放进插件里的函数即使和原有函数重名,似乎也不会覆盖,只是先后执行而已
怎么做才能让RM只运行插件里我写的callMenu函数,不运行它在rpg_scene.js里面原来的那个呢?
作者: Fan723    时间: 2022-11-25 22:17
你的思路是没问题的,应该是你没找到对应调用的方法,而你修改的这个方法没有调用到吧。
作者: jie119168    时间: 2022-11-25 23:24
你多看几个别的插件,覆盖式写法有规范的,多模仿一下
作者: asukalin    时间: 2022-11-28 03:03
似乎搞明白了……
如果只是想覆盖,其实很简单。

例如,原来的js文件里有个函数叫Something.dosomething
在插件里这样写就可以:

  1. Something.dosomething = function() {
  2.     //自己写的内容
  3. };
复制代码


之前出现问题,是因为我模仿别人用了这种写法:

  1. var _Something_dosomething = Something.dosomething;
  2. Something.dosomething = function() {
  3.     _Something_dosomething.call(this);
  4.     //自己写的内容
  5. };
复制代码


这样写会先运行原有的Something.dosomething,然后运行插件里新加的内容。
这种写法是在原函数的后面加入新东西,同时避免覆盖掉原函数的该做的事。
我的目的和他们的相反,如果那样写,结果看上去就会像是“同样的内容先后重复运行了两遍”了。
作者: liuhuaxin5    时间: 2023-6-2 20:26
您好,我想覆盖其中的战斗部分的代码,如果用something.dosomething,如何保证他是运行的battle部分的代码呢?
作者: liuhuaxin5    时间: 2023-6-2 20:36
liuhuaxin5 发表于 2023-6-2 20:26
您好,我想覆盖其中的战斗部分的代码,如果用something.dosomething,如何保证他是运行的battle部分的代码 ...

哦哦哦,是不是自己写一个新文件,在新文件里写战斗的代码,之后在战斗代码中调用something?




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