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

Project1

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

[RMVA发布] 让RGSS3记住事件移动后的位置

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1170
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

跳转到指定楼层
1
发表于 2014-7-26 18:53:06 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

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

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

x
本帖最后由 DeathKing 于 2014-7-26 18:54 编辑
TL;DR
使用此脚本前,您应该阅读:自由脚本协议(Free Script License)
您也可以在GitHub上查看此脚本的最新版:1.1.0726版本
这里是参考范例工程: [FSL][1.1.0726]RememberWorld.rar (1.42 MB, 下载次数: 205)


RGSS3中存在什么问题?


RM系列一直存在这个问题。每次切换到新地图时,RGSS会重新从Map***.r*data文件中加载数据,重新设置地图(见Game_Map#setup_events),这样,有些执行过“设置事件位置”或者随机移动路线的事件就会再切换回地图时重新回到在编辑器中设定的位置。

这其实是很诡异的。我们希望RGSS3记住事件移动后的位置。

RememberWorld是如何解决这个问题的?

简而言之,给Scene_Map的pre_transfer加个钩子,添加我们的处理代码。基本思想是让RGSS3将当前地图中的事件的坐标存放在Game_System的一个实例变量中。然后再给Game_Map的setup_events加钩子,使得地图重新加载时,会从Game_System的那个实例变量中读取事件位置。这样就实现了事件位置的记录。

现在比较纠结的问题。

  • 除了坐标外,还有没有其它需要记录的东西?
  • 是否要同时提供白名单/黑名单特性?现在提供的是黑名单特性,也就是如果事件页的第一行是注释,而且注释的内容为<FSL::RememberWorld not-track>,那么脚本就不会跟踪记录这个事件。但是有可能你只需要记录少数几个事件,那么就希望脚本提供白名单的特性。考虑以后是不是要加上这个功能。

为什么有这个脚本?

正在做一个非常有趣的脚本,就需要这个功能的支撑。仓促之作,应该还会有许多没有考虑到的地方,希望大家多多提交BUG。









脚本

评分

参与人数 4星屑 +250 收起 理由
kuerlulu + 30
影月千秋 + 20 所谓撞车糖
satgo1546 + 100
taroxd + 100 卧槽竟然是DK菊苣!

查看全部评分


See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

7
发表于 2014-7-28 07:40:13 | 只看该作者
本帖最后由 taroxd 于 2014-7-28 07:44 编辑
DeathKing 发表于 2014-7-26 22:02
看了一下脚本 @feizhaodan 的是直接HOOK Game_Map#setup,在实际执行地图切换前记录事件位置,并直接让Ga ...


RUBY 代码复制
  1. class Game_Map
  2.  
  3.   alias init_20140728 initialize
  4.   def initialize
  5.     init_20140728
  6.     @moved_events   = {}
  7.     @removed_events = {}
  8.   end
  9.  
  10.   # default_proc 不能存档简直忧伤……
  11.   def get_moved_events(map_id)
  12.     @moved_events[map_id] ||= {}
  13.   end
  14.  
  15.   def get_removed_events(map_id)
  16.     @removed_events[map_id] ||= {}
  17.   end
  18.  
  19.   def setup_events
  20.     @events = {}
  21.     @map.events.each do |i, event|
  22.       unless get_removed_events(@map_id)[i]
  23.         @events[i] = Game_Event.new(@map_id, event)
  24.       end
  25.     end
  26.     get_moved_events(@map_id).each do |i, (x, y, direction, event)|
  27.       @events[i] = event = Game_Event.new(@map_id, event)
  28.       event.moveto(x, y)
  29.       event.set_direction(direction)
  30.     end
  31.     @common_events = parallel_common_events.collect do |common_event|
  32.       Game_CommonEvent.new(common_event.id)
  33.     end
  34.     refresh_tile_events
  35.   end
  36. end
  37.  
  38. class Game_Event
  39.   def moveto_new_map(map_id, x, y, direction = nil)
  40.     if map_id == @map_id
  41.       moveto(x, y)
  42.       set_direction(direction) if direction
  43.       return
  44.     end
  45.     $game_map.get_moved_events(@map_id).delete(@id)
  46.     $game_map.get_removed_events(@map_id)[@id] = true
  47.     new_map = load_data(sprintf("Data/Map%03d.rvdata2", map_id))
  48.     size = new_map.width * new_map.height
  49.     begin
  50.       @event.id = @id = size + rand(0xffff) + @id # just a random number big enough
  51.     end while $game_map.get_moved_events(map_id).key?(@id)
  52.     $game_map.get_moved_events(map_id)[@id] =
  53.       [x, y, (direction || @direction), @event]
  54.     $game_map.get_removed_events(map_id).delete(@id)
  55.   end
  56. end


一个不太完善的版本,仅仅提供一个思路。
有很多问题没有考虑到,比如从当前地图移动走的时候,事件仍然会停留在地图上。
比如独立开关的问题没有处理。

反正我也不需要这个功能,所以也没有太在意美观和可读性什么的。总之就是提供一个思路吧。这些小问题应该都不难解决的。

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
94
在线时间
648 小时
注册时间
2009-2-3
帖子
238
6
发表于 2014-7-28 02:11:14 | 只看该作者
希望能有xp版本
回复 支持 反对

使用道具 举报

菜鸟飞呀飞 该用户已被删除
5
发表于 2014-7-26 22:38:21 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1170
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

4
 楼主| 发表于 2014-7-26 22:02:22 | 只看该作者
喵kano 发表于 2014-7-26 20:24
之前看过一个保存事件位置的脚本,内部切换黑/白名单
https://rpg.blue/thread-230430-1-1.html ...

看了一下脚本 @feizhaodan 的是直接HOOK Game_Map#setup,在实际执行地图切换前记录事件位置,并直接让Game_Map来记录这些内容,某种程度上来说比我的脚本来得巧妙。

美中不足的是,需要将68行处,由:

RUBY 代码复制
  1. e.direction( @event_pos[@map_id][i][2])


修改为:

RUBY 代码复制
  1. e.set_direction( @event_pos[@map_id][i][2])


这样就能正确处理事件朝向的问题了。

其实我还要实现一个核功能,就是让这个地图的事件移动到另一个地图,并保持有效,这个比较棘手,也是我最想解决的。

点评

哇没发现囧 去修改  发表于 2014-7-27 23:21
保护环境的那个?  发表于 2014-7-26 23:33
事件挂在一个临时的列表上,当做移动语义移过去(好像是什么奇怪的东西)  发表于 2014-7-26 22:43

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv4.逐梦者

运否天赋

梦石
10
星屑
5243
在线时间
3567 小时
注册时间
2014-5-15
帖子
1599

开拓者

3
发表于 2014-7-26 20:24:04 | 只看该作者
之前看过一个保存事件位置的脚本,内部切换黑/白名单
https://rpg.blue/thread-230430-1-1.html

点评

其实我也写过……在我那个经常和别人撞车的插件脚本合集里……  发表于 2014-7-26 21:26
不太知道……不过确实是撞了。  发表于 2014-7-26 21:17
土猫三国开发完成
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
48
在线时间
312 小时
注册时间
2014-2-28
帖子
914
2
发表于 2014-7-26 19:17:58 | 只看该作者
LZ做的很棒!就是Bgm有点问题哈

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
由于我不服H·H·Y大触事件满于是他让我的事件也调满于是我照着做了结果那货居然把事件调低了……结果我现在原稿找不回来了只好保持着事件满的状态在大家面前闹笑话擦擦擦擦擦擦擦擦擦擦擦擦擦擦擦擦
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-12 04:15

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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