神奇雨 - 您的移动生活宝库
【邀请码】投稿获取邀请码
登录 | 注册
在线视频高清解析 史上最全接码平台大全
  • 首页
  • Rpgmaker
  • RpgmakerMV脚本教程(7)-我有特殊的脚本技巧2

RpgmakerMV脚本教程(7)-我有特殊的脚本技巧2

发布:神奇2020-08-13 17:43:19 [百度已收录] 分类: Rpgmaker 标签:

今天为大家分享一个我酝酿了一段时间的一个小技巧,主要是用来处理系统原生函数的覆盖。

情况介绍


日常我们在开发插件中大多数人肯定不会把所有的系统自带的文件全部推翻,基本都是通过plugin的形式在原有代码的基础上进行修改扩充,对于编写plugin时对系统已经提供的函数我们基本有以下几种对应情况:

1.完全创建新的函数

2.保留原有的函数功能额外增加一些逻辑

3.弃用原有函数逻辑,完全重写

我相信绝大多数都是第二种情况,比如说我们在菜单场景(Scene_Menu)中想增加一个新窗口。

这个时候我们就要扩展“Scene_Menu.prototype.create”,代码如下。

当然我们不建议去直接修改rpg_scenes.js文件,因为直接修改系统提供的文件可能会导致我们无法使用其他的plugin,或者造成一些第三方代码的兼容问题。还有就是如果RMMV如果升级了,更新也是个问题。

我们还是比较建议通过plugin的方式去扩展,在plugin中我们也可以这么处理

但是这么写也有一个弊端,就是我们根本不知道在我们的插件运行时“Scene_Menu.prototype.create”函数有没有已经被别的plugin修改过。如果它已经被别人重新定义过,我们再这么编写代码,就会使之前的plugin变更失效。
于是我们有了下面这种写法:


这种写法保证了我们尽量不去影响“既定事实”的系统函数,而去扩展它。

在之前的篮球小游戏中我们就用了类似的写法劫持了“Scene_Map.prototype.isMenuEnabled”防止在游戏过程中触发菜单场景,并且在游戏结束时恢复了劫持。

之前的篮球游戏代码如下:http://js.jirengu.com/tugumocepe/1/watch?js

我的技巧

所以说今天介绍的技巧就是基于以上原理的功能封装。

先贴代码:http://js.jirengu.com/jirebovixo/1/watch?js

我们提供了以下几个API

const 返回 = PluginManager.regHook(参数1,参数2)

说明:使用参数2返回的新函数劫持既有系统函数,在新函数上还可以调用原始函数,也可以不调用。本函数支持多层劫持,像人体蜈蚣一样,哈哈哈哈哈。

参数1:字符串形式的函数名参数。告诉Hook函数的位置在哪里。

参数2:一个返回新函数的函数生成器,函数生成器的参数是之前的函数。

返回:Hook的恢复器,将劫持的代码恢复,如果系统函数已经经历过多次劫持,那么只会恢复本次劫持。

例子:

const 返回 PluginManager.regBatchHooks(参数1)

说明:批量劫持

参数1:传入一个object用key-value的形式传入多组劫持

返回:返回一个数组,以次为入参的恢复器。

例子:

下面两个是用于设定和恢复hook链中最原始函数的,不在本次讨论范围内,有兴趣的可以自己了解一下。

PluginManager.setHookOriginal

PluginManager.restoreHookOriginal

应用举例

regHook让覆盖系统函数逻辑做到灵活清洁并且随时可恢复,可以有很多种用法。下面我们就用regHook解决点具体的有代表性的问题。众所周知,游戏加载资源是会耗费一定时间的,如果我们想在自定义窗口贴一张图片,直接贴,第一次是不会显示出来的,第二次才会有图像,就是因为第一次贴图时资源还没有加载完毕。一般我们有两种解决方法:

第一种是在游戏入口处找个地方先把所有用到的资源都加载一下,这样到用的时候就可以直接从缓存中贴图,不需要加载。

第二种是按照官方代码中的做法老老实实的写updateLoading和updateWait等等一大堆又啰嗦又难懂的代码。

下面我们用今天的技巧提供第三种方案

我们先扩展一下Window_Base定义一个类似上面的函数。

这个函数功能就是在第一个参数的image加载完成后进行贴图操作。

在这个函数中我们用hook注册了一个临时的函数劫持,在每次窗体update被执行时,判断图片是否加载完成,如果完成了就贴图,图片贴完了就恢复劫持。我写的比较随性,不喜欢回调函数也可以考虑用async/await来写。

下面就是这个函数的使用方法:

好了以上就是今天的分享,谢谢关注。

温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!

已有 0/5人参与

发表评论: