Project1

标题: 地图事件库提取时总是有卡顿 [打印本页]

作者: mariofans    时间: 2013-12-27 17:14
标题: 地图事件库提取时总是有卡顿
本帖最后由 mariofans 于 2013-12-30 15:09 编辑

地图事件库也就是类似的复制提取事件。我用了很多种方法,但是在提取的瞬间总是会卡一下。对于我正在制作的演示类游戏来说影响是非常大的。
这是我现在用的脚本:
RUBY 代码复制
  1. module EventHelper
  2.   def self.get_rpg_event(event_id, map_id=$game_map.map_id)
  3.     map = $game_map.instance_variable_get(:@map)
  4.     if map_id != $game_map.map_id
  5.       map = load_data(sprintf("Data/Map%03d.rxdata", map_id))
  6.     end
  7.     return map.events[event_id]
  8.   end
  9. end
  10.  
  11. class Game_Map
  12.   # rpg_evt:需要刷新的事件RPG::Event, 用上面的get_rpg_event获得
  13.   # xy:坐标
  14.   # ss:需要打开的独立开关列表("ABCD")
  15.   def spawn_event(rpg_evt, x, y, ss="")
  16.     new_id = 1 + @map.events.keys.max
  17.     new_evt = RPG::Event.new(x, y)
  18.     new_evt.id = new_id
  19.     new_evt.pages = rpg_evt.pages
  20.     @map.events[new_id] = new_evt
  21.  
  22.     @events[new_id] = Game_Event.new(@map_id, new_evt)
  23.     #@events[new_id].set_direction(dir)#
  24.     $game_self_switches[[@map_id, new_id, ss]] = true
  25.  
  26.     # 刷新图块
  27.     refresh
  28.     #$scene.instance_eval { @spriteset.update }
  29.     $scene.instance_eval { @spriteset.dispose }
  30.     $scene.instance_eval { @spriteset = Spriteset_Map.new }
  31.   end
  32. end

求教怎样才能让提取不卡。
作者: fux2    时间: 2013-12-27 17:26
不可能不卡,除非你只读少量地图的事件(把要用的事件都放一张地图里
然后在游戏一开始的时候把那张地图的数据读到内存里(保存至一个全局变量吧。
读的时候不要读文件直接从变量里取。
作者: 紫英晓狼1130    时间: 2013-12-27 18:04
查找一下事件防卡脚本
作者: mariofans    时间: 2013-12-28 12:18
fux2 发表于 2013-12-27 17:26
不可能不卡,除非你只读少量地图的事件(把要用的事件都放一张地图里
然后在游戏一开始的时候把那张地图的 ...

那该怎样导入全局变量?
(点评居然不记为回复……)
作者: fux2    时间: 2013-12-28 14:08
本帖最后由 fux2 于 2013-12-28 14:09 编辑
mariofans 发表于 2013-12-28 12:18
那该怎样导入全局变量?
(点评居然不记为回复……)


改成大概这样,载入的时候就储存一张地图的信息
调用的时候去掉地图编号的参数
大概是
  1. $game_map.spawn_event(EventHelper.get_rpg_event(事件库地图的事件ID),x,y,ss)
复制代码
RUBY 代码复制
  1. $load_map = load_data(sprintf("Data/Map%03d.rxdata", 1))  #事件库地图编号
  2. module EventHelper
  3.   def self.get_rpg_event(event_id)
  4.     map = $game_map.instance_variable_get(:@map)
  5.     if map_id != $game_map.map_id
  6.       map = $load_map
  7.     end
  8.     return map.events[event_id].clone
  9.   end
  10. end
  11.  
  12. class Game_Map
  13.   # rpg_evt:需要刷新的事件RPG::Event, 用上面的get_rpg_event获得
  14.   # xy:坐标
  15.   # ss:需要打开的独立开关列表("ABCD")
  16.   def spawn_event(rpg_evt, x, y, ss="")
  17.     new_id = 1 + @map.events.keys.max
  18.     new_evt = RPG::Event.new(x, y)
  19.     new_evt.id = new_id
  20.     new_evt.pages = rpg_evt.pages
  21.     @map.events[new_id] = new_evt
  22.     @events[new_id] = Game_Event.new(@map_id, new_evt)
  23.     #@events[new_id].set_direction(dir)#
  24.     $game_self_switches[[@map_id, new_id, ss]] = true
  25.  
  26.     # 刷新图块
  27.     refresh
  28.     #$scene.instance_eval { @spriteset.update }
  29.     $scene.instance_eval { @spriteset.dispose }
  30.     $scene.instance_eval { @spriteset = Spriteset_Map.new }
  31.   end
  32. end

作者: mariofans    时间: 2013-12-28 18:32
fux2 发表于 2013-12-28 14:08
改成大概这样,载入的时候就储存一张地图的信息
调用的时候去掉地图编号的参数
大概是$load_map = load_d ...

还是没能解决问题啊……
作者: chd114    时间: 2013-12-28 20:09
用这样的脚本是不可能不卡的,因为你使用这个脚本的时候游戏本身就是暂停运行的状态,所谓的卡是游戏暂停···
作者: mariofans    时间: 2013-12-28 21:37
chd114 发表于 2013-12-28 20:09
用这样的脚本是不可能不卡的,因为你使用这个脚本的时候游戏本身就是暂停运行的状态,所谓的卡是游戏暂停· ...

嗯,我想是因为@spriteset.dispose和spriteset新建之间有停顿。
所以求在此时直接调用Game_Map中update的方法。
作者: mariofans    时间: 2013-12-28 21:40
chd114 发表于 2013-12-28 20:09
用这样的脚本是不可能不卡的,因为你使用这个脚本的时候游戏本身就是暂停运行的状态,所谓的卡是游戏暂停· ...

不,是Scene_Map的update
作者: chd114    时间: 2013-12-28 21:47
mariofans 发表于 2013-12-28 21:37
嗯,我想是因为@spriteset.dispose和spriteset新建之间有停顿。
所以求在此时直接调用Game_Map中update的 ...

这个卡顿是没法取消的···这是内部构造的一种机制···防止事件在保存、删除等等的时候被执行或者修改了导致未知错误
作者: mariofans    时间: 2013-12-28 22:18
chd114 发表于 2013-12-28 21:47
这个卡顿是没法取消的···这是内部构造的一种机制···防止事件在保存、删除等等的时候被执行或者修改 ...

那有没有办法在Spriteset_Map的update里下手,使其在地图事件总数变化时单独刷新成角色活动块,而不用全部推倒重建?
作者: chd114    时间: 2013-12-28 22:53
mariofans 发表于 2013-12-28 22:18
那有没有办法在Spriteset_Map的update里下手,使其在地图事件总数变化时单独刷新成角色活动块,而不用全 ...

恐怕不行···除非你能直接把RMXP的源文件改了···就像癫狂侠客的DKRM那样
作者: mariofans    时间: 2013-12-28 22:56
chd114 发表于 2013-12-28 22:53
恐怕不行···除非你能直接把RMXP的源文件改了···就像癫狂侠客的DKRM那样

试一试……
作者: chd114    时间: 2013-12-28 22:59
mariofans 发表于 2013-12-28 22:56
试一试……

没记错的话不是正版就没权限···
作者: mariofans    时间: 2013-12-28 23:00
chd114 发表于 2013-12-28 22:59
没记错的话不是正版就没权限···

没权限啥?只有版主能发代码?
作者: chd114    时间: 2013-12-28 23:11
mariofans 发表于 2013-12-28 23:00
没权限啥?只有版主能发代码?

我是说修改RM内部文件的权限···不是你的工程
作者: mariofans    时间: 2013-12-28 23:15
chd114 发表于 2013-12-28 23:11
我是说修改RM内部文件的权限···不是你的工程

额……我说的是试一试改update啊………………
作者: mariofans    时间: 2013-12-30 13:25
chd114 发表于 2013-12-28 22:53
恐怕不行···除非你能直接把RMXP的源文件改了···就像癫狂侠客的DKRM那样

我把update加入了这几句会出错。错在哪里?(@xeup在之前已经赋值)
  1. # 刷新角色活动块
  2.     if @xeup != $game_map.events.keys.sort
  3.       for i in $game_map.events.keys.sort
  4.         sprite.dispose
  5.         sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
  6.         @character_sprites.push(sprite)
  7.         @xeup = $game_map.events.keys.sort
  8.       end
  9.     end
复制代码

作者: mariofans    时间: 2013-12-30 13:31
本帖最后由 mariofans 于 2013-12-30 13:34 编辑
mariofans 发表于 2013-12-30 13:25
我把update加入了这几句会出错。错在哪里?(@xeup在之前已经赋值)


$game_map.events.keys.sort是可变量还是不变量?
如果不变,那么那一句可以代表当前地图的事件数目?
还有for i in XX如果要判定i不在XX范围内该怎么写?
作者: chd114    时间: 2013-12-30 14:40
mariofans 发表于 2013-12-28 22:18
那有没有办法在Spriteset_Map的update里下手,使其在地图事件总数变化时单独刷新成角色活动块,而不用全 ...

把条件分歧里面那两个都p一次看看是什么
作者: mariofans    时间: 2013-12-30 14:45
chd114 发表于 2013-12-30 14:40
把条件分歧里面那两个都p一次看看是什么

嗯……刚刚换语句了,那个似乎行不通……
在另开一帖里:http://rpg.blue/thread-344041-1-1.html
作者: mariofans    时间: 2013-12-30 15:06
☆————————————此帖已经终结————————————☆
  1. if @xeup != $game_map.events.keys.max
  2.       eupn = $game_map.events.keys.max
  3.       eupo = @xeup
  4.       if eupn > eupo
  5.         sprite = Sprite_Character.new(@viewport1, $game_map.events[eupn])
  6.         @character_sprites.push(sprite)
  7.         @xeup = $game_map.events.keys.max
  8.       end
  9.     end
复制代码
果然还是利用了events.keys.max只增不减的特性做成了判断。并且在update中只生成新的事件图像。
感谢@chd114 提供了思路。
作者: chd114    时间: 2013-12-31 16:10
mariofans 发表于 2013-12-30 15:06
☆————————————此帖已经终结————————————☆果然还是利用了events.keys.max只增不 ...

保险起见,尽量不要再加别的利用到event.keys的脚本,防止冲突。




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