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

Project1

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

[原创发布] RPG Maker MV 中的 alias

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1023
在线时间
145 小时
注册时间
2013-10-16
帖子
271
跳转到指定楼层
1
发表于 2015-11-12 21:10:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 rpg-sheep 于 2015-11-13 15:00 编辑

众所周知,RPG Maker MV 更新后 javascript 取代了 Ruby
然而alias也随之而去……{:2_282:}
那么问题来了!怎么重定义方法!重定义方法是非常重要的一个环节,对于插件兼容性非常有用。
比如这么个代码
JAVASCRIPT 代码复制
  1. function test(){
  2. }
  3. test.prototype.hahah = function(){
  4.         alert("1122")
  5. }
  6. test.prototype.hahah()

这个代码只能输出一次1122,我想给hahah方法添加一段代码,让他再输出2222,但不改变hahah这个方法名,VA用alias可以轻松实现,然而MV呢?
JAVASCRIPT 代码复制
  1. function test(){
  2. }
  3. test.prototype.hahah = function(){
  4.         alert("1122")
  5. }
  6. test.prototype.hahah2 = test.prototype.hahah;
  7. test.prototype.hahah = function(){
  8.         this.hahah2()
  9.         alert("2222")
  10. }
  11. //位置1
  12. test.prototype.hahah()

把这段话复制到一个插件里并启用测试,可以输出1122和2222。实现了对test.hahah的重定义!
我如果想再加一段呢?在刚才的位置1加一段:
JAVASCRIPT 代码复制
  1. test.prototype.hahah3 = test.prototype.hahah;
  2. test.prototype.hahah = function(){
  3.         this.hahah3()
  4.         alert("2223")
  5. }

可以输出1122和2222,2223.完全没有压力,解决了多个插件同时加载防冲突的问题~

小结:
JAVASCRIPT 代码复制
  1. test.prototype.hahah2 = test.prototype.hahah;

等同于
RUBY 代码复制
  1. alias :hahah2 :hahah


应用:在Scene_Map里加一个窗口Window_XY_Mission:
JAVASCRIPT 代码复制
  1. Scene_Map.prototype.old_createDisplayObjects = Scene_Map.prototype.createDisplayObjects;
  2. Scene_Map.prototype.createDisplayObjects = function() {
  3.         this.old_createDisplayObjects();
  4.         this.XY_createMissionWindow();
  5. };
  6. Scene_Map.prototype.XY_createMissionWindow = function() {
  7.     this._XY_MissionWindow = new Window_XY_Mission();
  8.     this.addWindow(this._XY_MissionWindow);
  9. };

就成功在不冲突的情况下添加了窗口!(这里并没有贴出Window_XY_Mission的代码!)

语法解析:
JAVASCRIPT 代码复制
  1. test.prototype.hahah3 = test.prototype.hahah;//复制hahah方法到hahah3
  2. //错误范例:test.prototype.hahah3 = test.prototype.hahah();这里不能带括号,否则就是返回结果了
  3. test.prototype.hahah = function(){//覆盖原有hahah方法
  4.         this.hahah3();//注意这里一定要用this.hahah3(),不能用test.prototype.hahah3()!
  5.         /*这里详细解释一下为什么不能用:
  6.            如果你把这句替换成test.prototype.hahah3()然后测试,是可以实现的。
  7.            但是如果你实际应用的时候不用this.,会弹出TypeError:Cannot read property 'length' of undefined。
  8.            问题就出在这句上:你会发现很多地方都有类似这句的语句:Window_xxx.prototype = Object.create(Window_Base.prototype);
  9.            这玩意讲了很多人也听不懂,所以记住用this.就行啦
  10.         */
  11.         alert("2223");
  12. }


感谢@VIPArcher的提醒~关于有参数的方法直接像这样写上就可以了
JAVASCRIPT 代码复制
  1. function test(){
  2. }
  3. test.prototype.hahah = function(a,b){
  4.         alert(a+b);
  5. }
  6. test.prototype.hahah2 = test.prototype.hahah;
  7. test.prototype.hahah = function(a,b){
  8.         this.hahah2(a,b);
  9.         alert(a-b);
  10. }
  11. test.prototype.hahah3 = test.prototype.hahah;
  12. test.prototype.hahah = function(a,b){
  13.         this.hahah3(a,b);
  14.         alert(a*b);
  15. }
  16. test.prototype.hahah(1,2)
输出3,-1,2。
PS
什么?你看到了Window_XY_Mission?对的,小优(rpg_sheep)正在制作RPG Maker MV的任务插件!

点评

不就是两个指针讲的这么麻烦..给不懂脚本的人不错..  发表于 2015-11-19 19:24

评分

参与人数 1星屑 +14 梦石 +1 收起 理由
余烬之中 + 14 + 1 原创发布..其实说的太繁琐了

查看全部评分

开心咸鱼每一天~

Lv3.寻梦者

梦石
0
星屑
1232
在线时间
1017 小时
注册时间
2011-4-30
帖子
1516
2
发表于 2015-11-12 21:36:42 | 只看该作者
觉得讲的很好...
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
75
在线时间
75 小时
注册时间
2011-3-17
帖子
133
3
发表于 2015-11-12 22:02:22 | 只看该作者
非程序猿表示完全不懂

点评

这个教程是给程序猿们准备的啦  发表于 2015-11-12 22:04
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
48
在线时间
784 小时
注册时间
2013-1-4
帖子
1102
4
发表于 2015-11-13 00:14:16 | 只看该作者
我在想这真的等于么。。。

点评

从防止插件冲突角度来说应该是大致等同的……  发表于 2015-11-13 15:03
RM-GUI延期。。。最近被黑心老板压迫T_T
二次元少女的shitake,长着长脸,身高165,蓝色卷双马尾,FCUP,瞳色黑色,病气和御宅属性,是天才少女。
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

无限の剣制

梦石
0
星屑
10074
在线时间
5020 小时
注册时间
2013-2-28
帖子
5030

开拓者贵宾

5
发表于 2015-11-13 11:46:31 | 只看该作者
本帖最后由 VIPArcher 于 2015-11-13 11:47 编辑

楼主不考虑一下带参数的姿势么?
JAVASCRIPT 代码复制
  1. var alias_method_name = old_method_name;
  2. old_method_name = function(name) {
  3.     alias_method_name.call(this,name);
  4.     console.log('喵呜炒鸡萌~');
  5. };

另外我完全不懂js,全是瞎糊的=。=

点评

.call(this,name)和直接写(name)区别不是很大吧……  发表于 2015-11-13 15:02
哦对,这个还真没想到  发表于 2015-11-13 14:52
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止访问)

梦石
0
星屑
88
在线时间
631 小时
注册时间
2014-8-4
帖子
3600
6
发表于 2015-11-13 12:33:36 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
277
在线时间
53 小时
注册时间
2014-1-24
帖子
18
7
发表于 2015-11-13 13:25:11 | 只看该作者
{:2_277:}你试一下可以传方法么?可以的话,自己写的时候以后第一个参数永远传方法,不就行了,类似于可以无限继承。

点评

那样好像更复杂……js比Ruby开放多了,好多代码都能实现同一种功能……  发表于 2015-11-13 15:10
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
45
在线时间
47 小时
注册时间
2009-6-1
帖子
127
8
发表于 2015-11-13 23:11:56 | 只看该作者
本帖最后由 WildDagger 于 2015-11-13 23:14 编辑

補充一下,Java Script每個函式都有個變數叫做「arguments」,這是一個陣列,會把呼叫這個函式時代入的參數全部存在裡面
跟參數有關的問題其實可以全部只用arguments變數來處理,就不用煩惱說多參數該怎麼辦了,至於呼叫的方式等等再提
(其實你可以試著在腳本寫下console.log(arguments[0])來看,那一定是第一個參數值)

另外就是關於繼承與別名的問題,Java Script也有call可以處理

簡單說若有一個函數叫做test.functionA,然後你要去增強functionA,又不希望functionA被完全取代掉
只要這樣寫就可以了
  1. var functionA_Alias = test.functionA;
  2. test.functionA = function() {
  3.     functionA_Alias.apply(this, arguments);

  4.     (其他程式碼)
  5. };
复制代码
簡單來說Java Script有call與apply這兩個function專用的方法
第一個參數是你要把誰塞進去充當函數內「this」的值,call之後就跟一般的函式一樣,依序寫入參數就可以,
但apply則是要求你第二個值必須是一個陣列,而apply會自動將陣列拆成參數依序帶入

也就是說functionA.call(this, a, b)和functionA.apply(this, [a, b])是一樣的意思
前者是你確定有哪些參數還有參數要依照甚麼次序帶入的時候可以使用,後者則是當你不確定有哪些參數的時候就可以選擇這個

另外Java Script的特性是你參數多給也無妨,反正如果參數指定3個,但該函式只用到前兩個的話,剩下那一個電腦就會自動當作沒看到而忽略掉。

点评

嗯呐  发表于 2015-11-14 10:39
回复 支持 反对

使用道具 举报

Lv5.捕梦者

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

开拓者

9
发表于 2015-12-25 18:40:07 | 只看该作者
我可不可以定义一个alias方法,然后代替这些脚本?
JS还没学好,所以请大神帮忙教一下,这样JS就更贴近RGSS3了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
177
在线时间
170 小时
注册时间
2012-3-4
帖子
57
10
发表于 2015-12-25 18:43:39 手机端发表。 | 只看该作者
xjzsq 发表于 2015-12-25 18:40
我可不可以定义一个alias方法,然后代替这些脚本?
JS还没学好,所以请大神帮忙教一下,这样JS就更贴近RGSS ...

完全没必要
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-17 00:49

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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