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

Project1

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

[有事请教] 如何写插件覆盖RM原有的函数?

[复制链接]

Lv4.逐梦者

梦石
8
星屑
2882
在线时间
555 小时
注册时间
2021-8-13
帖子
625

极短25获奖

跳转到指定楼层
1
发表于 2022-11-25 20:47:34 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
在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里面原来的那个呢?
夜空晴朗,星光璀璨,我只顾低着头走,看不见半点别人嘴上说的美丽。
———————————————————
> 不是作家
> 不是孤岛的概念DEMO
> 想和妳一起过生日
> 一名虚无主义者的婚礼
> 杀之不尽死而复生无止无终不可阻挡

Lv1.梦旅人

梦石
0
星屑
9
在线时间
0 小时
注册时间
2023-6-2
帖子
2
6
发表于 2023-6-2 20:36:26 | 只看该作者
liuhuaxin5 发表于 2023-6-2 20:26
您好,我想覆盖其中的战斗部分的代码,如果用something.dosomething,如何保证他是运行的battle部分的代码 ...

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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
9
在线时间
0 小时
注册时间
2023-6-2
帖子
2
5
发表于 2023-6-2 20:26:21 | 只看该作者
您好,我想覆盖其中的战斗部分的代码,如果用something.dosomething,如何保证他是运行的battle部分的代码呢?
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
8
星屑
2882
在线时间
555 小时
注册时间
2021-8-13
帖子
625

极短25获奖

4
 楼主| 发表于 2022-11-28 03:03:16 | 只看该作者
似乎搞明白了……
如果只是想覆盖,其实很简单。

例如,原来的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,然后运行插件里新加的内容。
这种写法是在原函数的后面加入新东西,同时避免覆盖掉原函数的该做的事。
我的目的和他们的相反,如果那样写,结果看上去就会像是“同样的内容先后重复运行了两遍”了。
夜空晴朗,星光璀璨,我只顾低着头走,看不见半点别人嘴上说的美丽。
———————————————————
> 不是作家
> 不是孤岛的概念DEMO
> 想和妳一起过生日
> 一名虚无主义者的婚礼
> 杀之不尽死而复生无止无终不可阻挡
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4404
在线时间
560 小时
注册时间
2020-6-14
帖子
78
3
发表于 2022-11-25 23:24:43 | 只看该作者
你多看几个别的插件,覆盖式写法有规范的,多模仿一下

点评

搞定了,做法很简单,直接写就完了……但可能会因为系统函数被我覆盖掉了而导致和别的插件冲突  发表于 2022-11-28 03:07
克系游戏《书典怪奇录》内部开发中https://www.bilibili.com/video/BV1zp4y1B7Ce
任何热心游戏作者都欢迎的互相分享测试群1049580832
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
19335
在线时间
2314 小时
注册时间
2015-7-4
帖子
937
2
发表于 2022-11-25 22:17:31 | 只看该作者
你的思路是没问题的,应该是你没找到对应调用的方法,而你修改的这个方法没有调用到吧。

点评

解决了,很简单,直接写就完了。之前出问题,是因为模仿别人的写法但没有搞明白别人的目的。  发表于 2022-11-28 03:08
或者你是不是把脚本放到了没有启用的插件里面?  发表于 2022-11-25 22:18
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-27 23:31

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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