Project1

标题: 【推广向】这个世界将是我们事件脚本流的天下!RMVA小脚本 [打印本页]

作者: a386881    时间: 2014-1-25 23:11
标题: 【推广向】这个世界将是我们事件脚本流的天下!RMVA小脚本
玩坏了DLL,以后RMVA就可以在事件中直接插入功能相当精致的脚本了。
估计RMVX和RMXP也能用类似的方法改造的说。
感谢Sion大神的修改方法。跟我一起膜拜Sion大神原帖吧
嘛,还有人找到了突破12行限制的方法。http://rpg.blue/thread-347641-1-1.html
不过后来发现更早的时候已经被人用诡异的方法解决了Orz这……怎么看怎么诡异……不过实用度MAX
以前只能通过更改Game_Interpreter实现的功能,有相当一部分能通过事件脚本来实现啦。
这样做有如下好处。
1、会让你的工程更加简洁。经常修改Game_Interpreter的技术宅们会经常发现自己的脚本编辑器里堆积了一大堆不知道到底有没有在游戏里用上的可疑脚本,而小白们则更会头晕目眩,甚至忘记调用脚本的方法。把小段(?)脚本存储在TXT中,然后放入文件夹,需要的时候拿取即可,完全不会搞乱你的脚本编辑器。
2、会让你的工程更加条理。一段脚本放在脚本编辑器里,如果再不是很条理(比如我就喜欢在原来的东西上乱改不做标记……捂脸)很容易就会造成各种麻烦。而使用事件脚本不会“弄脏”甚至“玩坏”你的脚本编辑器——大不了只要把事件一删就行了。
3、方便学习沟通。每当要开新坑的时候,就不用在两个脚本库之间筛选和搬运脚本了。当别人求助的时候,小段的脚本总比大段的好学习和操作吧……
4、移到事件脚本以后,脚本体积变小。剧烈地变小。
5、兼容性应该……貌似……大概会好一些……吧?虽然说本质上和放入Game_Interpreter的差别并不大,但总觉得会好一些的说。
当然,这里的提倡用事件脚本只是用于解决能解决的问题,实在不能做的还是塞给脚本编辑器好了。毕竟人家才是专业的。
嘛,本人脚本渣,从XP的时候就在学脚本,零零散散,到VA都出来了,也没怎么学会(捂脸)。这次来就是提出个这么个理念,然后各路大神来讨论对错。不准打人骂人。顺带学习一下VA的脚本。
作者: a386881    时间: 2014-1-25 23:16
事件脚本练习作一:
改编自 喵呜喵5 大人的 "生成TXT"
版权归 喵呜喵5 所有,转载请去原帖查看声明,我只是大自然的搬运工……
原帖地址:膜拜喵呜喵5大人 喵呜喵5
代码:
  1. #其中OutputTXT可以换成任意英文。
  2. OutputTXT = File.open("文件名称.txt",'w')
  3. OutputTXT.puts "文件内容"
  4. OutputTXT.close
复制代码

作者: a386881    时间: 2014-1-25 23:20
事件脚本练习作二:
改编自 喵呜喵5 大人的 "打开网页"
版权归 @喵呜喵5 所有,转载请去原帖查看声明,我只是大自然的搬运工……
原帖地址:膜拜喵呜喵5大人  
代码:
  1. #其中OpenWebsite可以换成任意英文。
  2. OpenWebsite = Win32API.new('shell32.dll','ShellExecuteA',%w(p p p p p i),'i')
  3. OpenWebsite.call(0, 'open','www.qidian.com',0, 0, 1)
复制代码

作者: a386881    时间: 2014-1-25 23:24
事件脚本练习作三:
改编自 喵呜喵5 大人的 "全局变量"
版权归 @喵呜喵5 所有,转载请去原帖查看声明,我只是大自然的搬运工……
原帖地址:膜拜喵呜喵5大人
代码:
这个分两段,SAVE段和LOAD段。
顾名思义,存储时用SAVE段,读取时用LOAD段。
SAVE段:
  1. #SAVE段
  2. GlobalVariables = [1,2]
  3. Globalobj = []
  4. GlobalVariables.each {|index| Globalobj.push $game_variables[index]}
  5. save_data(Globalobj, "Saves/GlobalSave.rvdata2")
复制代码
LOAD段:
  1. #LOAD段
  2. GlobalVariables = [1,2]
  3. return if !File.exist?("Saves/GlobalSave.rvdata2")
  4. Globalobj = load_data("Saves/GlobalSave.rvdata2")
  5. Globalobj.each_with_index\
  6. {|v,i| $game_variables[GlobalVariables[i]] = v }
复制代码

作者: 喵呜喵5    时间: 2014-1-26 01:24
本帖最后由 喵呜喵5 于 2014-1-26 01:38 编辑

事件脚本和Game_Interpreter没多大区别吧……

至少我自己觉得Game_Interpreter更方便管理一些,大不了写脚本的时候顺手写一些注释什么的……

特别是你上面那些情况,写进Game_Interpreter以后直接一句“读取全局变量”、“保存全局变量”完事,哪还要每次调用的时候都写上好几行代码……

我自己的话基本上是代码只有1~2行时、进行循环时或者测试一小段代码的时候会去用事件脚本……
作者: a386881    时间: 2014-1-26 09:42
喵呜喵5 发表于 2014-1-26 01:24
事件脚本和Game_Interpreter没多大区别吧……

至少我自己觉得Game_Interpreter更方便管理一些,大不了写脚 ...

是因为我比较邋遢而且健忘的缘故吧……大概
不过我总觉得全局运行的东西还是尽量少一点好……占内存的吧?
……不过话说回来一个变量才能占多少内存……
作者: kuerlulu    时间: 2014-1-26 10:06
我是来围观LZ神头像的
另外把事件中用到的脚本做成方法扔到Interpreter里面会比较好
  1. def link(str)
  2.   openwebsite = Win32API.new('shell32.dll','ShellExecuteA',%w(p p p p p i),'i')
  3.   openwebsite.call(0, 'open',str,0, 0, 1)
  4. end
复制代码

作者: taroxd    时间: 2014-1-27 09:06
本帖最后由 taroxd 于 2014-1-27 09:12 编辑
1、会让你的工程更加简洁。经常修改Game_Interpreter的技术宅们会经常发现自己的脚本编辑器里堆积了一大堆不知道到底有没有在游戏里用上的可疑脚本,而小白们则更会头晕目眩,甚至忘记调用脚本的方法。把小段(?)脚本存储在TXT中,然后放入文件夹,需要的时候拿取即可,完全不会搞乱你的脚本编辑器。

忘记了随时查不就好了!查脚本编辑器比查TXT快多了!举个栗子:

首先绿色的字体很清晰美观,其次实在太多不想找可以Ctrl + F找中英文皆可
2、会让你的工程更加条理。一段脚本放在脚本编辑器里,如果再不是很条理(比如我就喜欢在原来的东西上乱改不做标记……捂脸)很容易就会造成各种麻烦。而使用事件脚本不会“弄脏”甚至“玩坏”你的脚本编辑器——大不了只要把事件一删就行了。

放在Game_Interpreter里面也是只要把事件一删就行了。我看不出上面那张图哪里没有条理、哪里玩坏了。
3、方便学习沟通。每当要开新坑的时候,就不用在两个脚本库之间筛选和搬运脚本了。当别人求助的时候,小段的脚本总比大段的好学习和操作吧……

开新坑当然是直接把Script.rvdata2复制过去啦~ 另外,放在脚本编辑器里才是“小段”哦~ 对Game_Interpreter没有必要筛选,因为脚本编辑器里写了一条完全没用上的方法也是没有任何问题的。
4、移到事件脚本以后,脚本体积变小。剧烈地变小。

地图体积变大。更剧烈地变大。
5、兼容性应该……貌似……大概会好一些……吧?虽然说本质上和放入Game_Interpreter的差别并不大,但总觉得会好一些的说。

除非方法重名我实在想不到在事件里写脚本兼容性哪里好了。
当然,这里的提倡用事件脚本只是用于解决能解决的问题,实在不能做的还是塞给脚本编辑器好了。毕竟人家才是专业的。
嘛,本人脚本渣,从XP的时候就在学脚本,零零散散,到VA都出来了,也没怎么学会(捂脸)。这次来就是提出个这么个理念,然后各路大神来讨论对错。不准打人骂人。顺带学习一下VA的脚本。

以上,我只是说出我的见解而已,并非和你过不去,也请不要打人骂人。有什么想反驳的说出来就好了。
作者: DeathKing    时间: 2014-1-27 10:25
本帖最后由 DeathKing 于 2014-1-27 10:26 编辑
taroxd 发表于 2014-1-27 09:06
忘记了随时查不就好了!查脚本编辑器比查TXT快多了!举个栗子:

首先绿色的字体很清晰美观,其次实在太多 ...


那个事件指令扩展可以单独做出来发布,像什么获得所有道具、所有装备什么的,测试起来会比较方便。

[line]1[/line]

脚本放事件指令里面有个坏处,就是出现错误了的话它无法定位
作者: taroxd    时间: 2014-1-27 10:46
DeathKing 发表于 2014-1-27 10:25
那个事件指令扩展可以单独做出来发布,像什么获得所有道具、所有装备什么的,测试起来会比较方便。

这种模仿 Game_Party#setup_battle_test_items 写写就行了。用到再写吧=。=

我写脚本都是要用的时候才写的说,写了有用的话就不删了,没用而且对游戏有影响的话就直接扔到Main后面,不会特意去做什么功能。所以相当多的功能都是鸡肋。而且像Taroxd::MAX_TP这种明显自己用着玩儿的常量,发布起来不方便的吧。这个还好,如果要alias的话,alias的方法都是自己定义的。(http://rpg.blue/thread-347871-1-1.html
这种鸡肋的东西都是扔在这里的节奏 http://rpg.blue/thread-344203-1-1.html (见笑)

顺便脚本渣坐等蓄势待发啥的
作者: a386881    时间: 2014-1-27 12:47
taroxd 发表于 2014-1-27 09:06
忘记了随时查不就好了!查脚本编辑器比查TXT快多了!举个栗子:

首先绿色的字体很清晰美观,其次实在太多 ...

咱记住你了的说貌似每个我的贴你都有回耶!好开心!
就是方法重名的问题啊……我发的三个案例全都把变量和方法的名字搞的很长,防得就是方法重名……
复制Script.rvdata2!还有这种奇妙的方法啊!非技术宅的咱表示惊呆了。
脚本体积变小那条,好像实际上确实是变大了。光想着内容少了,没想次数变多了
对了,不知道RGSS3的机制是怎么弄的?是开始游戏的时候把Game_Interpreter全部扔内存,还是用到哪条就读哪条?咱对脚本实在不太会啊。
PS:咱是不是也该换个萌妹子的头像呢?貌似我们ace区的好多大神都是用的萌妹子头像。。不过咱总觉得用异性别头像有点怪怪的。
作者: taroxd    时间: 2014-1-27 13:17
a386881 发表于 2014-1-27 12:47
咱记住你了的说貌似每个我的贴你都有回耶!好开心!
就是方法重名的问题啊……我发的 ...


先说了,哪来那么多方法重名,我那张图写个recover_tp都不怕重了。

RGSS3在事件指令中使用脚本实际上是对一个Game_Interpreter的实例 (某个@interpreter) 执行了方法 command_355 ,把你输入的脚本作为字符串eval了
RUBY 代码复制
  1. def command_355
  2.     script = @list[@index].parameters[0] + "\n"
  3.     while next_event_code == 655
  4.       [url=home.php?mod=space&uid=370741]@Index[/url] += 1
  5.       script += @list[@index].parameters[0] + "\n"
  6.     end
  7.     eval(script)
  8.   end

所以在 Game_Interpreter 里面定义的方法自然都可以用得上,这就是在Game_Interpreter定义方法,可以直接在事件脚本中调用的原因

关于RGSS3的机制,推荐你一本好书:点一下9L真大神的签名


一直露脸是因为我也是新人,一直在等待自己的问题得到解答,顺便就在这里逛逛了
作者: DeathKing    时间: 2014-1-27 13:19
脚本再大(Script.rvdata2)跟素材一比就是九牛一毛,真要省空间也不必在脚本上拔毛。
【事件】只是由【事件编辑器】编辑好的特殊数据序列,对应到游戏运行时(Runtime),就成了Game_Event的实例,但是【事件指令】的内容全是交给Game_Interpreter这个解释器完成的。《URG3》中专门开辟了一个章节讨论这个问题(可惜的是,这一章节到现在都还没下笔)。
谁给你说是异性啦。




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