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

Project1

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

[已经解决] 地图事件库提取时总是有卡顿

[复制链接]

Lv3.寻梦者

梦石
0
星屑
2605
在线时间
896 小时
注册时间
2011-4-30
帖子
131

开拓者

跳转到指定楼层
1
发表于 2013-12-27 17:14:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 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

求教怎样才能让提取不卡。

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
41145
在线时间
7571 小时
注册时间
2009-7-6
帖子
13499

开拓者贵宾

2
发表于 2013-12-27 17:26:29 | 只看该作者
不可能不卡,除非你只读少量地图的事件(把要用的事件都放一张地图里
然后在游戏一开始的时候把那张地图的数据读到内存里(保存至一个全局变量吧。
读的时候不要读文件直接从变量里取。

点评

那该怎么做?  发表于 2013-12-27 18:40
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3846
在线时间
1966 小时
注册时间
2013-1-3
帖子
9536
3
发表于 2013-12-27 18:04:03 | 只看该作者
查找一下事件防卡脚本
《宿愿·寻剑篇》正式版已经发布!快去看看!点击进入论坛发布贴
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2605
在线时间
896 小时
注册时间
2011-4-30
帖子
131

开拓者

4
 楼主| 发表于 2013-12-28 12:18:23 | 只看该作者
fux2 发表于 2013-12-27 17:26
不可能不卡,除非你只读少量地图的事件(把要用的事件都放一张地图里
然后在游戏一开始的时候把那张地图的 ...

那该怎样导入全局变量?
(点评居然不记为回复……)
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
41145
在线时间
7571 小时
注册时间
2009-7-6
帖子
13499

开拓者贵宾

5
发表于 2013-12-28 14:08:27 | 只看该作者
本帖最后由 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
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2605
在线时间
896 小时
注册时间
2011-4-30
帖子
131

开拓者

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

还是没能解决问题啊……
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

7
发表于 2013-12-28 20:09:16 | 只看该作者
用这样的脚本是不可能不卡的,因为你使用这个脚本的时候游戏本身就是暂停运行的状态,所谓的卡是游戏暂停···
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2605
在线时间
896 小时
注册时间
2011-4-30
帖子
131

开拓者

8
 楼主| 发表于 2013-12-28 21:37:01 | 只看该作者
chd114 发表于 2013-12-28 20:09
用这样的脚本是不可能不卡的,因为你使用这个脚本的时候游戏本身就是暂停运行的状态,所谓的卡是游戏暂停· ...

嗯,我想是因为@spriteset.dispose和spriteset新建之间有停顿。
所以求在此时直接调用Game_Map中update的方法。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2605
在线时间
896 小时
注册时间
2011-4-30
帖子
131

开拓者

9
 楼主| 发表于 2013-12-28 21:40:35 | 只看该作者
chd114 发表于 2013-12-28 20:09
用这样的脚本是不可能不卡的,因为你使用这个脚本的时候游戏本身就是暂停运行的状态,所谓的卡是游戏暂停· ...

不,是Scene_Map的update
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

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

这个卡顿是没法取消的···这是内部构造的一种机制···防止事件在保存、删除等等的时候被执行或者修改了导致未知错误
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-9-30 10:25

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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