Project1

标题: 公共事件是保存在 .rxdata 文件里吗? [打印本页]

作者: cimmy210    时间: 2015-2-21 07:25
标题: 公共事件是保存在 .rxdata 文件里吗?
比如我想给一个游戏做MOD/补丁,需要做一些新的公共事件,然后把这些新做的公共事件打包,给别人,别人就可以给自己的游戏打补丁,而不需要我到别人的电脑上再去重新做那些公共事件

请问这个如何实现?

作者: cimmy210    时间: 2015-2-21 07:28
CommonEvents.rxdata -- 这就是保存所有公共事件的文件吗?
作者: cimmy210    时间: 2015-2-21 07:37
试过了,备份 CommonEvents.rxdata 文件的方法可行,但是,如果别人做一些新的公共事件,我也做一些新的公共事件,然后要把这些新做的公共事件整合起来,怎么办?

如果用我的 CommonEvents.rxdata 文件覆盖过去,那游戏中就只新增了我做的公共事件;

如果用别人的 CommonEvents.rxdata 文件覆盖过去,游戏中就只新增了别人做的公共事件;

怎么整合起来?

能否把新做的事件单独提取出来、发布?
作者: cimmy210    时间: 2015-2-21 08:36
找到有个这样的东东:

http://forums.rpgmakerweb.com/in ... vents-to-text-file/

但貌似 RMXP 用不了,而且它不支持把事件文本导入游戏...
作者: taroxd    时间: 2015-2-21 12:01
不使用、模拟事件,直接用纯脚本可能会更快,更好
作者: cimmy210    时间: 2015-2-21 12:08
taroxd 发表于 2015-2-21 12:01
不使用、模拟事件,直接用纯脚本可能会更快,更好

纯脚本如何实现显示选择项等功能?

而且我发现,用 Bitmap 显示出来的图,会被快捷栏遮住; 用 $game_screen.pictures 显示出来的图,不会被快捷栏遮住。而且,用 Bitmap 显示图,还要搞个循环做 Graphics.update 、等待输入什么的.............
作者: taroxd    时间: 2015-2-21 12:14
cimmy210 发表于 2015-2-21 12:08
纯脚本如何实现显示选择项等功能?

而且我发现,用 Bitmap 显示出来的图,会被快捷栏遮住; 用 $game_sc ...


画个窗口,在上面画选择项……

Bitmap 从来没有显示图片的功能,只是储存图片数据而已。
你可能需要修改实际显示的对象(Sprite/Plane/Window)以及显示端口(Viewport)的 z 值
作者: cimmy210    时间: 2015-2-21 12:16
taroxd 发表于 2015-2-21 12:14
画个窗口,在上面画选择项……

Bitmap 从来没有显示图片的功能,只是储存图片数据而已。

那不是更麻烦,事件编辑器里只要一个指令就行了啊..
作者: taroxd    时间: 2015-2-21 12:19
cimmy210 发表于 2015-2-21 12:16
那不是更麻烦,事件编辑器里只要一个指令就行了啊..


把那一个指令的实现理解了,你也就会写了

还是参考之前给你的事件转译器脚本
作者: cimmy210    时间: 2015-2-21 12:24
taroxd 发表于 2015-2-21 12:19
把那一个指令的实现理解了,你也就会写了

还是参考之前给你的事件转译器脚本 ...

打不开那个工程.......

能不能贴段现成的程序出来...........
作者: cimmy210    时间: 2015-2-21 12:28
话说,提取/备份某一公共事件的方法,貌似是没有了?
作者: RyanBern    时间: 2015-2-21 12:29
本帖最后由 RyanBern 于 2015-2-21 13:32 编辑

思路可以这样,如果想用公共事件导入DLC或者MOD什么的,也不是不可以。因为原版的游戏已经有了CommonEvents.rxdata,所以你新做的东西覆盖过去肯定是不行的。因此必须要新开一个文件来储存新的公共事件。
然后就是文件导入问题,由于$data_common_events在游戏开始时候导入,所以你可以在导入$data_common_events的时候把自己新增的东西一起添加到游戏里面的$data_common_events中去。
1.在游戏目录下新建一个文件夹(文件夹名字为Mods),专门负责放置各种做好的公共事件数据文件,当然,名字不能一样,不过要保证里面的东西是公共事件。
2.在Scene_Title里面的$data_common_events = load_data("Data/CommonEvents.rxdata")后面增加导入MOD的代码。
3.导入mod的代码可以考虑这样:
RUBY 代码复制
  1. Dir.foreach("./Mods") do |filename|
  2.   next if filename == "." || filename == ".."
  3.   common_evs = load_data("Mods/#{filename}")
  4.   common_evs.each do |ev|
  5.     if ev != nil && ev.name != ""
  6.       $data_common_events[ev.id] = ev
  7.     end
  8.   end
  9. end

这样就可以导入所有公共事件,不过如果多人对同一ID的公共事件定义时,会产生冲突。
另外,这样定义的附加公共事件,不加处理是不能在RMXP中读取的,打开RMXP看到的仍然是原游戏的公共事件。


我详细说一下使用方法。
1.先准备上面那个脚本,把它弄到Scene_Title里面。

2.在一个工程1里面建立一个公共事件,然后在地图上调用这个公共事件。


3.新开一个工程2,在工程2里面同样的位置建立公共事件。保存。

4.找到工程2的Data文件夹里面的CommonEvents.rxdata,把它复制到工程1的Mods文件夹下(不存在的话新建之),然后改个名字。

5.运行工程1的游戏,激活事件,你会发现事件使用的是工程2里面的mod公共事件。

6.将复制的文件删除,再进入工程1的游戏,激活事件,你会发现事件使用的是工程1里面的公共事件了。

7.再开一个工程3,在工程3里面建立一个2号公共事件,保存。

8.再把工程3的公共事件数据复制到工程1的Mods文件夹下,改个不一样的名字。

9.工程1里面需要有地方调用2号公共事件,现在工程1里面的2号公共事件是空的。
10.运行工程1的游戏,激活事件,看到效果。



作者: taroxd    时间: 2015-2-21 12:32
RyanBern 发表于 2015-2-21 12:29
思路可以这样,如果想用公共事件导入DLC或者MOD什么的,也不是不可以。因为原版的游戏已经有了CommonEvents ...

还需要保存事件设置。可以从公共事件中直接导出

或者,可以在调用公共事件时,将子事件解释器的 list 设为读取出来的东西也行哦~ 这就不怕 id 冲突了
作者: cimmy210    时间: 2015-2-21 12:40
taroxd 发表于 2015-2-21 12:01
不使用、模拟事件,直接用纯脚本可能会更快,更好

果然无法提取/备份单独一个公共事件?所以只能建议我用纯脚本了?
作者: cimmy210    时间: 2015-2-21 12:48
taroxd 发表于 2015-2-21 12:19
把那一个指令的实现理解了,你也就会写了

还是参考之前给你的事件转译器脚本 ...

事件转译器的 DEBUG 模式输出的现成代码,是 RGSS3 吧?RMXP 不能用啊?
作者: cimmy210    时间: 2015-2-21 12:52
RyanBern 发表于 2015-2-21 12:29
思路可以这样,如果想用公共事件导入DLC或者MOD什么的,也不是不可以。因为原版的游戏已经有了CommonEvents ...

用公共事件编辑器做的事件,会自动保存在 CommonEvents.rxdata 文件里呀,怎么让它保存到别的文件里?
作者: RyanBern    时间: 2015-2-21 12:52
cimmy210 发表于 2015-2-21 12:40
果然无法提取/备份单独一个公共事件?所以只能建议我用纯脚本了?

导出公共事件到一个文件中(按照事件的ID):
RUBY 代码复制
  1. def export_common_event(event_id)
  2.   event = $data_common_events[event_id]
  3.   return if event == nil
  4.   data = load_data("Data/CommonEventsBackup.rxdata") # 要求事先建立好一个文件,文件里面存的是一个Array
  5.   data << event
  6.   file = File.open("Data/CommonEventsBackup.rxdata", "wb")
  7.   marshal.dump(data, file)
  8.   file.close
  9. end

这样导出的公共事件的ID再导入回去要重新设置。
作者: cimmy210    时间: 2015-2-21 13:04
本帖最后由 cimmy210 于 2015-2-21 13:07 编辑
RyanBern 发表于 2015-2-21 12:52
导出公共事件到一个文件中(按照事件的ID):
def export_common_event(event_id)
  event = $data_commo ...


这个能导出单个事件吗?能否再给个导入事件的函数?

有了导出/导入单个事件的函数,就不需要把 CommonEvents.rxdata 改名那种方法了。
作者: cimmy210    时间: 2015-2-21 13:29
本帖最后由 cimmy210 于 2015-2-21 13:33 编辑
RyanBern 发表于 2015-2-21 12:52
导出公共事件到一个文件中(按照事件的ID):
def export_common_event(event_id)
  event = $data_commo ...


例如,如果 MyNewEvents.rxdata 中存有我新做的公共事件,现在要把它整合进 Data/CommonEventsBackup.rxdata 文件里去,能做到吗?

如果多人做了多个新增事件,命名为:MyNewEvents1.rxdata、MyNewEvents2.rxdata、MyNewEvents3.rxdata 等,要把它们全部整合进原版的 Data/CommonEventsBackup.rxdata 文件里去,怎么弄?

其实,如果事件编辑器里可以 右键 --> Export / Import,就不用这么麻烦了...




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