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

Project1

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

[已经解决] 关于va计时器切换地图重新计时问题

[复制链接]

Lv1.梦旅人

梦石
0
星屑
60
在线时间
22 小时
注册时间
2015-6-28
帖子
43
跳转到指定楼层
1
发表于 2016-11-22 18:08:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
如题,我设置了一个30分钟的计时器在公共事件里面,然后换一个地图就给我重新归到30分钟了...

求解...怎么搞才能让计时器切换地图都继续计时呢...
{:2_249:}

QQ截图20161122180818.png (54.54 KB, 下载次数: 25)

QQ截图20161122180818.png

评分

参与人数 1星屑 +50 收起 理由
RaidenInfinity + 50 结帖

查看全部评分

Lv4.逐梦者 (版主)

梦石
0
星屑
6901
在线时间
7028 小时
注册时间
2013-11-2
帖子
1344

开拓者剧作品鉴家

2
发表于 2016-11-22 18:43:52 | 只看该作者
这是因为切换地图后公共事件会从头运行一次。

以下是测试后确定可用的。不过要注意,开启计时器开关(启动计时器)之前请务必关闭第二个开关,以免产生问题。



原理是先判定第二个开关,如果关闭(计时器未启动),就启动计时器及打开这个开关,标注已启动。这样,切换地图,公共事件重新运行时就不会重置计时器。另外我简化了你的事件,换成计时器在结束之前循环等待。计时器归零时关闭第二个开关后跳出循环。(然后计时器会重新启动。如果你不想这样,就把关闭的开关换成并行事件本身的开关

评分

参与人数 1梦石 +1 收起 理由
VIPArcher + 1 认可答案

查看全部评分

回复 支持 1 反对 0

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4598
在线时间
1206 小时
注册时间
2016-4-7
帖子
982

开拓者

3
发表于 2016-11-22 22:40:23 | 只看该作者
  1. class Timer

  2.   @@list = []

  3.   def self.update
  4.     @@list.each{|o| o.update if o != nil } if @@list != []
  5.   end

  6.   attr_reader :status

  7.   TimerEvent = Struct.new(:start_time, :time, :block)

  8.   def initialize
  9.     @@list.push(self)
  10.     @afters = []
  11.     @everys = []
  12.     @status = :run
  13.     @stops_time = 0
  14.   end

  15.   def start
  16.     return if @status == :run
  17.     @stops_time += Time.now - @stop_time
  18.     @status = :run
  19.   end

  20.   def stop
  21.     return if @status == :stop
  22.     @stop_time = Time.now
  23.     @status = :stop
  24.   end

  25.   def after(time, &block)
  26.     @afters.push object = TimerEvent.new(Time.now, time, block)
  27.     object
  28.   end

  29.   def every(time, &block)
  30.     @everys.push object = TimerEvent.new(Time.now, time, block)
  31.     object
  32.   end

  33.   def delete_every(object)
  34.     @everys.each do |o|
  35.       @everys.delete(o) if o == object
  36.     end
  37.   end

  38.   def delete_after(object)
  39.     @afters.each do |o|
  40.       @afters.delete(o) if o == object
  41.     end
  42.   end

  43.   def dispose
  44.     @@list.delete(self)
  45.     @afters.clear
  46.     @everys.clear
  47.   end

  48.   def update_afters
  49.     return if @afters == []
  50.     @afters.each do |o|
  51.       if Time.now - o.start_time - @stops_time >= o.time
  52.         o.block.call
  53.         @afters.delete(o)
  54.       end
  55.     end
  56.   end

  57.   def update_everys
  58.     return if @everys == []
  59.     @everys.each do |o|
  60.       if Time.now - o.start_time - @stops_time >= o.time
  61.         o.block.call
  62.         o.start_time = Time.now
  63.         @stops_time = 0
  64.       end
  65.     end
  66.   end

  67.   def update
  68.     update_afters
  69.     update_everys
  70.   end

  71. end
复制代码

在game loop里调用Timer.update
然后你可以通过事件代码创建各种计时器
使用方法可以参考这里 https://github.com/molingyu/rgui ... /core_plus.md#timer

评分

参与人数 1梦石 +1 收起 理由
VIPArcher + 1 我很赞同

查看全部评分

附庸的附庸不是我的附庸,女儿的女儿还是我的女儿。CK2沉迷ing
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
22 小时
注册时间
2015-6-28
帖子
43
4
 楼主| 发表于 2016-11-23 17:50:02 | 只看该作者
shitake 发表于 2016-11-22 22:40
在game loop里调用Timer.update
然后你可以通过事件代码创建各种计时器
使用方法可以参考这里 https://git ...

谢谢啦!!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
22 小时
注册时间
2015-6-28
帖子
43
5
 楼主| 发表于 2016-11-23 17:50:34 | 只看该作者
RaidenInfinity 发表于 2016-11-22 18:43
这是因为切换地图后公共事件会从头运行一次。

以下是测试后确定可用的。不过要注意,开启计时器开关(启动 ...

非常感谢!学习了!{:2_249:}
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-16 23:52

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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