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

Project1

 找回密码
 注册会员
搜索

关于va计时器切换地图重新计时问题

查看数: 2262 | 评论数: 4 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2016-11-22 18:08

正文摘要:

如题,我设置了一个30分钟的计时器在公共事件里面,然后换一个地图就给我重新归到30分钟了... 求解...怎么搞才能让计时器切换地图都继续计时呢... {:2_249:} ...

回复

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

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

非常感谢!学习了!{:2_249:}
逆回十六夜 发表于 2016-11-23 17:50:02
shitake 发表于 2016-11-22 22:40
在game loop里调用Timer.update
然后你可以通过事件代码创建各种计时器
使用方法可以参考这里 https://git ...

谢谢啦!!
shitake 发表于 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 我很赞同

查看全部评分

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

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



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

评分

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

查看全部评分

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

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

GMT+8, 2024-11-17 01:32

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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