Project1
标题: 地图事件库提取时总是有卡顿 [打印本页]
作者: mariofans 时间: 2013-12-27 17:14
标题: 地图事件库提取时总是有卡顿
本帖最后由 mariofans 于 2013-12-30 15:09 编辑
地图事件库也就是类似的复制提取事件。我用了很多种方法,但是在提取的瞬间总是会卡一下。对于我正在制作的演示类游戏来说影响是非常大的。
这是我现在用的脚本:
module EventHelper
def self.get_rpg_event(event_id, map_id=$game_map.map_id)
map = $game_map.instance_variable_get(:@map)
if map_id != $game_map.map_id
map = load_data(sprintf("Data/Map%03d.rxdata", map_id))
end
return map.events[event_id]
end
end
class Game_Map
# rpg_evt:需要刷新的事件RPG::Event, 用上面的get_rpg_event获得
# xy:坐标
# ss:需要打开的独立开关列表("ABCD")
def spawn_event(rpg_evt, x, y, ss="")
new_id = 1 + @map.events.keys.max
new_evt = RPG::Event.new(x, y)
new_evt.id = new_id
new_evt.pages = rpg_evt.pages
@map.events[new_id] = new_evt
@events[new_id] = Game_Event.new(@map_id, new_evt)
#@events[new_id].set_direction(dir)#
$game_self_switches[[@map_id, new_id, ss]] = true
# 刷新图块
refresh
#$scene.instance_eval { @spriteset.update }
$scene.instance_eval { @spriteset.dispose }
$scene.instance_eval { @spriteset = Spriteset_Map.new }
end
end
module EventHelper
def self.get_rpg_event(event_id, map_id=$game_map.map_id)
map = $game_map.instance_variable_get(:@map)
if map_id != $game_map.map_id
map = load_data(sprintf("Data/Map%03d.rxdata", map_id))
end
return map.events[event_id]
end
end
class Game_Map
# rpg_evt:需要刷新的事件RPG::Event, 用上面的get_rpg_event获得
# xy:坐标
# ss:需要打开的独立开关列表("ABCD")
def spawn_event(rpg_evt, x, y, ss="")
new_id = 1 + @map.events.keys.max
new_evt = RPG::Event.new(x, y)
new_evt.id = new_id
new_evt.pages = rpg_evt.pages
@map.events[new_id] = new_evt
@events[new_id] = Game_Event.new(@map_id, new_evt)
#@events[new_id].set_direction(dir)#
$game_self_switches[[@map_id, new_id, ss]] = true
# 刷新图块
refresh
#$scene.instance_eval { @spriteset.update }
$scene.instance_eval { @spriteset.dispose }
$scene.instance_eval { @spriteset = Spriteset_Map.new }
end
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 
那该怎样导入全局变量?
(点评居然不记为回复……)
改成大概这样,载入的时候就储存一张地图的信息
调用的时候去掉地图编号的参数
大概是- $game_map.spawn_event(EventHelper.get_rpg_event(事件库地图的事件ID),x,y,ss)
复制代码$load_map = load_data(sprintf("Data/Map%03d.rxdata", 1)) #事件库地图编号
module EventHelper
def self.get_rpg_event(event_id)
map = $game_map.instance_variable_get(:@map)
if map_id != $game_map.map_id
map = $load_map
end
return map.events[event_id].clone
end
end
class Game_Map
# rpg_evt:需要刷新的事件RPG::Event, 用上面的get_rpg_event获得
# xy:坐标
# ss:需要打开的独立开关列表("ABCD")
def spawn_event(rpg_evt, x, y, ss="")
new_id = 1 + @map.events.keys.max
new_evt = RPG::Event.new(x, y)
new_evt.id = new_id
new_evt.pages = rpg_evt.pages
@map.events[new_id] = new_evt
@events[new_id] = Game_Event.new(@map_id, new_evt)
#@events[new_id].set_direction(dir)#
$game_self_switches[[@map_id, new_id, ss]] = true
# 刷新图块
refresh
#$scene.instance_eval { @spriteset.update }
$scene.instance_eval { @spriteset.dispose }
$scene.instance_eval { @spriteset = Spriteset_Map.new }
end
end
$load_map = load_data(sprintf("Data/Map%03d.rxdata", 1)) #事件库地图编号
module EventHelper
def self.get_rpg_event(event_id)
map = $game_map.instance_variable_get(:@map)
if map_id != $game_map.map_id
map = $load_map
end
return map.events[event_id].clone
end
end
class Game_Map
# rpg_evt:需要刷新的事件RPG::Event, 用上面的get_rpg_event获得
# xy:坐标
# ss:需要打开的独立开关列表("ABCD")
def spawn_event(rpg_evt, x, y, ss="")
new_id = 1 + @map.events.keys.max
new_evt = RPG::Event.new(x, y)
new_evt.id = new_id
new_evt.pages = rpg_evt.pages
@map.events[new_id] = new_evt
@events[new_id] = Game_Event.new(@map_id, new_evt)
#@events[new_id].set_direction(dir)#
$game_self_switches[[@map_id, new_id, ss]] = true
# 刷新图块
refresh
#$scene.instance_eval { @spriteset.update }
$scene.instance_eval { @spriteset.dispose }
$scene.instance_eval { @spriteset = Spriteset_Map.new }
end
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在之前已经赋值)- # 刷新角色活动块
- if @xeup != $game_map.events.keys.sort
- for i in $game_map.events.keys.sort
- sprite.dispose
- sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
- @character_sprites.push(sprite)
- @xeup = $game_map.events.keys.sort
- end
- 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
☆————————————此帖已经终结————————————☆- if @xeup != $game_map.events.keys.max
- eupn = $game_map.events.keys.max
- eupo = @xeup
- if eupn > eupo
- sprite = Sprite_Character.new(@viewport1, $game_map.events[eupn])
- @character_sprites.push(sprite)
- @xeup = $game_map.events.keys.max
- end
- 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 |