幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1789|回复: 6

【RGSS脚本】高精度计时器 by FantasyDR [2005.10.18]

[复制链接]

50

主题

994

帖子

6699

积分

管理员

爱干啥干啥!

Rank: 9Rank: 9Rank: 9

积分
6699
发表于 2005-10-7 16:08:26 | 显示全部楼层 |阅读模式
不知道以前有没有有人弄过类似的,不管了……发了再说……%_%

[10.18更新]
修正了使用CPU嘀哒数计时出现的错误,忘记进位了^_^bb

『使用对象』
RPG Maker XP
(废话-_-|||)

『内容简介』
这个脚本的起因是因为,RGSS的内部时钟隐藏不可见,计时竟然是用帧频率和帧数相除换算出来的。
这个时间,只能是模糊的时间,要做到精确计时,不可能-_-b

而且,帧频率可以变,幅度在0~40之间,这样算出的时间可以说在动作游戏里根本无法使用。
因此调用API做了个高精度计时器。

『加入方法』
在Main之前随便插入一个脚本标题,比如System_Timer,拷贝最下方脚本框内所有内容进入这个标题,然后就可以调用了。

『调用方法』
下面是3个调用方法,针对不同需要

1、输入脚本事件:
$game_variables[变量号码]=$sys_timer.now_s()
将目前时间保存到变量中,单位“秒”

2、输入脚本事件:
$game_variables[变量号码]=$sys_timer.now()
将目前时间保存到变量中,单位“毫秒”

3、输入脚本事件:
$sys_timer.clear()
计时器归零。

PS:详细内容,或者RGSS使用者,参考脚本内注释。

『声明』
本脚本内容均为原创,虽然无多少高深技术含量,但是希望转载时候保留作者信息。


『脚本内容』
  1. # ------------------------------------------------------------------------
  2. # 高精度计时器 by FantasyDR
  3. # ------------------------------------------------------------------------
  4. # E-mail: [email]fnd@163.net[/email]
  5. # ------------------------------------------------------------------------
  6. # 2005.10.18
  7. # ------------------------------------------------------------------------
  8. # 该类已经被定义为全局变量 $sys_timer
  9. # 如果只需要精确到毫秒,请设置初始化参数为true
  10. # decimal属性设置返回时间值的小数位数。
  11. # ------------------------------------------------------------------------
  12. # 下面是一些有用的方法列表,调用时写:$sys_timer.方法名
  13. # 例如 $sys_timer.clear()
  14. # ------------------------------------------------------------------------
  15. # clear() :计时器清零
  16. #   now() :获取当前经过的时间,单位毫秒
  17. # now_s() :获取当前经过的时间,单位秒
  18. # ------------------------------------------------------------------------
  19. class SystemTimer
  20.   attr_accessor:decimal  #小数位数设定,默认为3
  21.   
  22.   def initialize(use_GetTime=false)
  23.     # 初始化,根据系统选择不同精度计时器
  24.     @qpFrequency = Win32API.new("kernel32","QueryPerformanceFrequency",'p','L')
  25.     @qpCounter = Win32API.new("kernel32","QueryPerformanceCounter",'p','L')
  26.     @tGetTime = Win32API.new("winmm","timeGetTime",'','L')
  27.    
  28.     @decimal=3
  29.     @perf_cnt=" " * 8
  30.     @time_start=" " * 8
  31.     @time_now=" " * 8
  32.    
  33.     result = @qpFrequency.call(@perf_cnt)
  34.    
  35.     if use_GetTime
  36.       result = 0
  37.     end
  38.    
  39.     if result!=0
  40.       @perf_flag=true
  41.     else
  42.       @perf_flag=false
  43.       @perf_cnt=[1000,0].pack('LL')
  44.     end
  45.    
  46.     #设置时间比例因数
  47.     @time_scale=@perf_cnt.unpack('LL')
  48.     @time_scale[0] /= 1000.0
  49.     @time_scale[1] /= 1000.0
  50.    
  51.     #起始时间清零
  52.     self.clear()
  53.   end
  54.   
  55.   #-=====================-#
  56.   # 计时器清零
  57.   #-=====================-#
  58.   def clear()
  59.     if @perf_flag
  60.       @qpCounter.call(@time_start)
  61.     else
  62.       @time_start=[@tGetTime.call(),0].pack('LL')
  63.     end
  64.   end
  65.   
  66.   #-==============================-#
  67.   # 获取当前经过的时间,单位毫秒
  68.   #-==============================-#
  69.   def now()
  70.     now_time = 0.0e1
  71.     now_time += self.timer() - self.start()
  72.     now_time /= self.scale()
  73.     return self.debug(now_time)
  74.   end
  75.   
  76.   #-==============================-#
  77.   # 获取当前经过的时间,单位秒
  78.   #-==============================-#
  79.   def now_s()
  80.     now_time = 0.0e1
  81.     now_time += self.timer() - self.start()
  82.     now_time /= (self.scale()*1000)   
  83.     return self.debug(now_time)
  84.   end
  85.   
  86.   #-==============================-#
  87.   # 帧错...
  88.   #-==============================-#
  89.   def debug(now_time)
  90.     if @decimal>0
  91.      now_time = (now_time * (10**@decimal)).floor/(10.0**@decimal)
  92.     else
  93.      now_time = now_time.floor
  94.     end
  95.     return now_time
  96.    
  97.     #以下用于debug模式
  98.     if now_time < 0
  99.       p "Timer Wrong!! Clear...",now_time,\
  100.         @perf_flag,@qpCounter,@tGetTime,
  101.         @time_now.unpack('LL')[0],@time_now.unpack('LL')[1],
  102.         @time_start.unpack('LL')[0],@time_start.unpack('LL')[1]
  103.       self.clear()
  104.       return 0.0
  105.     else
  106.       return now_time
  107.     end
  108.   end
  109.   
  110.   #-=====================-#
  111.   # 获取时间比例因数
  112.   #-=====================-#
  113.   def scale()
  114.     return @time_scale[0]+\
  115.            @time_scale[1]*0xffffffff
  116.   end
  117.   
  118.   #-=====================-#
  119.   # 获取起始滴答数
  120.   #-=====================-#
  121.   def start()
  122.     return @time_start.unpack('LL')[0]+\
  123.            @time_start.unpack('LL')[1]*0xffffffff
  124.   end
  125.   
  126.   #-=====================-#
  127.   # 获取当前的嘀哒数
  128.   #-=====================-#
  129.   def timer()
  130.     if @perf_flag
  131.       @qpCounter.call(@time_now)
  132.     else
  133.       @time_now=[@tGetTime.call(),0].pack('LL')
  134.     end
  135.     return @time_now.unpack('LL')[0]+\
  136.            @time_now.unpack('LL')[1]*0xffffffff
  137.   end
  138. end
  139. #-------------------------------------#
  140. # 初始化自身成一个全局变量
  141. #-------------------------------------#
  142. $sys_timer=SystemTimer.new()
  143. #-------------------------------------#
复制代码

“放下屠刀,立地成佛” 故应先杀生,然后再成佛。

(\\_/) (-_-) ()+() this is bunny priest.
回复

使用道具 举报

122

主题

3954

帖子

24万

积分

超级版主

传说中的Bunny坑神~!

Rank: 8Rank: 8

积分
244543

声命组铜赏

发表于 2005-10-7 18:45:09 | 显示全部楼层
原来XP的记时系统这么弱……= =|||
果然EB是越来越不厚道了……
技术帖,要顶。^^(偶尔也灌之……)
http://www.nvlmaker.net/
回复 支持 反对

使用道具 举报

50

主题

994

帖子

6699

积分

管理员

爱干啥干啥!

Rank: 9Rank: 9Rank: 9

积分
6699
 楼主| 发表于 2005-10-7 19:11:49 | 显示全部楼层
EB的东西总有一点点诡异。

比如10s不调用Graphics.update方法的话,系统会死锁,然后自动弹出。
这样,如果播放长一点的AVI,还得不停的Graphics.update,屏幕会一闪一闪。

有些13点的设定。

“放下屠刀,立地成佛” 故应先杀生,然后再成佛。

(\\_/) (-_-) ()+() this is bunny priest.
回复 支持 反对

使用道具 举报

9

主题

94

帖子

2622

积分

⑥精研

积分
2622
发表于 2005-10-7 19:35:17 | 显示全部楼层
(响应版主号召偶尔也灌水之……)

看此帖时的心情:

第一楼:好啊!!正好在作片头,恩,可以搞定了…………(狂喜ing)

第二楼:…………(这个缺点在看脚本时已经知道了,所以没反应)

第三楼:…………一闪一闪…………(心情谷底中|||||||)
回复 支持 反对

使用道具 举报

50

主题

994

帖子

6699

积分

管理员

爱干啥干啥!

Rank: 9Rank: 9Rank: 9

积分
6699
 楼主| 发表于 2005-10-8 16:41:58 | 显示全部楼层
嗯……是两件事情吧?
似乎,计时器和AVI播放的事情,不太搭界的说。

“放下屠刀,立地成佛” 故应先杀生,然后再成佛。

(\\_/) (-_-) ()+() this is bunny priest.
回复 支持 反对

使用道具 举报

9

主题

94

帖子

2622

积分

⑥精研

积分
2622
发表于 2005-10-9 21:03:48 | 显示全部楼层
计时器用来掐音乐播放(对白)时间用的。
其实我现在的op是用pt做的连续帧动画,所以无论是一张一张图的插,还是直接编辑成AVI,2种方法都可行。
用AVI就不用掐秒了,不过现在看起来还是只能掐秒阿~~~~(干脆把所有背景音乐和对白混响成一个文件算了~~~自暴自弃ing~~)
回复 支持 反对

使用道具 举报

50

主题

994

帖子

6699

积分

管理员

爱干啥干啥!

Rank: 9Rank: 9Rank: 9

积分
6699
 楼主| 发表于 2005-10-18 17:17:54 | 显示全部楼层
小更新了一下,除去一个致命bug-_-b

PS:怎么看都是矛盾的话XD

“放下屠刀,立地成佛” 故应先杀生,然后再成佛。

(\\_/) (-_-) ()+() this is bunny priest.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2025-6-25 03:17 , Processed in 0.013282 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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