Project1

标题: 关于va计时器切换地图重新计时问题 [打印本页]

作者: 逆回十六夜    时间: 2016-11-22 18:08
标题: 关于va计时器切换地图重新计时问题
如题,我设置了一个30分钟的计时器在公共事件里面,然后换一个地图就给我重新归到30分钟了...

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

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

QQ截图20161122180818.png

作者: RaidenInfinity    时间: 2016-11-22 18:43
这是因为切换地图后公共事件会从头运行一次。

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



原理是先判定第二个开关,如果关闭(计时器未启动),就启动计时器及打开这个开关,标注已启动。这样,切换地图,公共事件重新运行时就不会重置计时器。另外我简化了你的事件,换成计时器在结束之前循环等待。计时器归零时关闭第二个开关后跳出循环。(然后计时器会重新启动。如果你不想这样,就把关闭的开关换成并行事件本身的开关
作者: shitake    时间: 2016-11-22 22:40
  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
作者: 逆回十六夜    时间: 2016-11-23 17:50
shitake 发表于 2016-11-22 22:40
在game loop里调用Timer.update
然后你可以通过事件代码创建各种计时器
使用方法可以参考这里 https://git ...

谢谢啦!!
作者: 逆回十六夜    时间: 2016-11-23 17:50
RaidenInfinity 发表于 2016-11-22 18:43
这是因为切换地图后公共事件会从头运行一次。

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

非常感谢!学习了!{:2_249:}




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