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

Project1

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

[胡扯] 看来脚本闭包做的太完善也有副作用啊

[复制链接]

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
23186
在线时间
2387 小时
注册时间
2005-10-15
帖子
1166

开拓者

跳转到指定楼层
1
发表于 2018-1-14 14:47:07 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

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

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

x
一直喜欢VA的脚本闭包风格,什么配置都给你写成方法,而不是一堆@开头的属性。
自己做XP插件也是用这个风格。
然后刚才想把纯事件多箱子系统http://rpg.blue/thread-404988-1-1.html移植到VA。
在花了20分钟毫无压力的弄完钱箱以后。到了物品箱的处理部分。
初始化什么都没问题了。
然后发现,VA的Window_Selectable特么的就是一个空壳子。连数据变量都没有的壳子。
你说要是空壳子也好吧,我用instance_variable_set追加变量也活的下去的对吧……
结果item_max这个方法写死了返回0……估计VA的制作者从来不想你在事件脚本中开窗口这事儿。
没办法又用Window_ItemList折腾。折腾了5分钟发现col_max又给写死了2……我去!
在对VA脚本有进一步的解读以前,暂时放弃。
SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。

Lv3.寻梦者

梦石
0
星屑
1342
在线时间
675 小时
注册时间
2009-11-11
帖子
2790
7
发表于 2018-1-14 21:05:19 | 只看该作者
现随便学好一门语言,没什么写死了写不死的,突破思想很重要

嘿。嘿。嘿
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21621
在线时间
9413 小时
注册时间
2012-6-19
帖子
7118

开拓者短篇九导演组冠军

6
发表于 2018-1-14 19:35:55 | 只看该作者
本帖最后由 喵呜喵5 于 2018-1-14 19:48 编辑
  1. class A
  2.   def item_max; 2; end
  3.   def get_item_max; p item_max; end
  4. end

  5. a = A.new
  6. a.get_item_max

  7. aa = A.new
  8. def aa.item_max; 3; end
  9. aa.get_item_max
复制代码

当然,以我自己的观点,在没有查找、没有快捷键、没有高亮的事件脚本中写业务层的东西实际上是挺后患无穷的一件事,自己写着玩玩还好,实际工程中我是反对这样用的

然后闭包指的是这个意思:

  1. def get_block
  2.   a = rand
  3.   ->{ p a }
  4. end

  5. a = get_block
  6. b = get_block
  7. a.call
  8. b.call
  9. a.call
复制代码
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
33434
在线时间
5108 小时
注册时间
2012-11-19
帖子
4878

开拓者

5
发表于 2018-1-14 16:30:16 | 只看该作者
本帖最后由 芯☆淡茹水 于 2018-1-14 17:21 编辑

闭包?!
(function(){script}());
是这个?

点评

恩,我把rgss_main { scenemanager.run }理解为闭包 XP可没有rgss_main这种东西,所有玩意都裸在外面  发表于 2018-1-14 19:15
xp vx va mv  va mz 各类型脚本/插件定制
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1803
在线时间
133 小时
注册时间
2013-10-6
帖子
193
4
发表于 2018-1-14 15:22:51 | 只看该作者
其实这个……不是闭包……
编程语言的闭包指的是一个函数与它的执行环境的一种绑定。比如一个就地定义的函数可捕获函数外的局部变量,其作用域会被延长,然后我们把这个函数传出去并离开定义这个函数的语境,这些被捕获的变量对这个函数仍可访问。
拓扑学上的闭包是指子集S自身的点并上它的极限点。
←你看到一只经常潜水的萌新。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

3
发表于 2018-1-14 15:20:02 | 只看该作者
不是写死了,而是默认工程里面就有错误···

我前面发了2个贴提到的那个bug找出来了

  1. #==============================================================================
  2. # ■ Window_HorzCommand
  3. #------------------------------------------------------------------------------
  4. #  横向选择的指令窗口
  5. #==============================================================================

  6. class Window_HorzCommand < Window_Command
  7.   #--------------------------------------------------------------------------
  8.   # ● 设置首列位置
  9.   #--------------------------------------------------------------------------
  10.   def top_col=(col)
  11.     col = 0 if col < 0
  12. #    col =  col_max + 1 if col>col_max-1
  13.     col = index - col_max + 1 if col > col_max - 1
  14.     self.ox = col * (item_width + spacing)
  15.   end
  16. end
复制代码

注释掉的是默认工程里有bug的那句
这类bug应该还有很多
但是修复脚本好像没有最新的或者说没人搬最新的··
搜了一下VA_SP结果出来的脚本基本是一样的

感觉光修掉默认工程脚本里的bug就要先花你几个月时间了(因为有些bug如果不是特定情况下并不能找出问题,比如我这里找到的这个,横向选择如果最大项目不超过显示项目数量2个以上并且不能循环就看不出有bug···还有上个月的帖子里的,如果短时间内附加移除同一个状态会无法再次附加(因为附加状态会判定移除的状态是否有某状态,如果有就不能附加,可是移除的状态组只在附加状态时有用到···))

点评

这句注释掉的脚本是什么鬼,我的都是col = col_max - 1 if col>col_max-1呀  发表于 2018-1-14 22:03
VA_SP1里面是8个(我去年的提问帖里别人发上来的里面是8个,不过魔法反射的修复那个看上去很迷)其他修复的bug我不会测也看不出区别···  发表于 2018-1-14 15:25
XP的已知8个bug我倒是已经在SEP Core里全部修正(大部分是伤害公式的锅),VA不太清楚有多少bug....  发表于 2018-1-14 15:22
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
6901
在线时间
7028 小时
注册时间
2013-11-2
帖子
1344

开拓者剧作品鉴家

2
发表于 2018-1-14 15:09:14 | 只看该作者
本帖最后由 RaidenInfinity 于 2018-1-15 00:26 编辑

面向对象中,多态(polymorphism)的概念在这里的体现是同个名字的方法在不同的类里有不同的功能。
另外,大佬也需要参考下C#,Java等语言的Interface(接口),至少也要知道下概念,就知道为啥是个空壳子了。

Window_Selectable是所有用到选项光标(加上Window_BattleLog)的窗口类的底类
item_max, col_max等方法默认是返回一个固定的参数。是类似虚拟方法(virtual method)的存在。

在基于它的子类里面,这些方法会被正式地定义。
比如Window_Command的item_max,返回的是@list.size(列表的长度)。这不就是变量吗?
所以,基本上你需要做的,是创造新的类,设置Window_Selectable为父类,然后再定义新的initialize, item_max, refresh什么的方法。
item_max写死了返回0?没问题。你弄个新的类啊。
RUBY 代码复制
  1. class Window_CustomSelectable < Window_Selectable
  2.     def item_max
  3.         @item_max
  4.     end
  5.  
  6.     def item_max=(v)
  7.         @item_max = v
  8.         refresh #重绘以体现改动
  9.     end
  10. end

然后运用这个新的类,不就行了嘛?







在事件解释器中定义类的例子。最好用一些检查来避免重复定义影响效率,比如用一个全局变量来判断。
TOPLEVEL_BINDING将eval的运行环境设置到“上层”,所以基本上和在脚本编辑器里面写的一样。

点评

我在Window_Selectable和Window_PartyCommand之间硬插了一级Window_HorzCommand之后,各种第三方脚本冲突到没有朋友……基本随便一个战斗脚本就冲,用module就好了  发表于 2018-1-15 01:07
接口感觉更像module mix-in,我重写SEP core的Scene_Base用的接口,不更改XP中各个Scene之间的继承,基本无冲突。到写Window的时候用类继承,三方脚本冲到爆炸  发表于 2018-1-15 01:05
Interface 合理翻译是接口  发表于 2018-1-15 00:20
如果脚本指令框不够大的话,可以使用一个字符串全局变量(如$str),用多个指令来一段一段加进去,最后执行eval($str, TOPLEVEL_BINDING)  发表于 2018-1-14 15:24
已附上事件脚本内定义类的方案  发表于 2018-1-14 15:22
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-14 23:36

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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