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

Project1

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

[原创发布] [Done][脚本]高精度计时器[BY FantasyDR]

 关闭 [复制链接]

Lv2.观梦者

梦石
0
星屑
260
在线时间
1373 小时
注册时间
2005-10-16
帖子
5113

贵宾

跳转到指定楼层
1
发表于 2005-10-22 00:26:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
不知道以前有没有有人弄过类似的,不管了……发了再说……%_%
[10.18更新]
修正了进位未处理的Bug...-_-b很严重的bug啊……
『使用对象』
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 protected]
  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. def initialize(use_GetTime=false)
  22. # 初始化,根据系统选择不同精度计时器
  23. @qpFrequency = Win32API.new("kernel32","QueryPerformanceFrequency",'p','L')
  24. @qpCounter = Win32API.new("kernel32","QueryPerformanceCounter",'p','L')
  25. @tGetTime = Win32API.new("winmm","timeGetTime",'','L')

  26. @decimal=3
  27. @perf_cnt=" " * 8
  28. @time_start=" " * 8
  29. @time_now=" " * 8

  30. result = @qpFrequency.call(@perf_cnt)

  31. if use_GetTime
  32. result = 0
  33. end

  34. if result!=0
  35. @perf_flag=true
  36. else
  37. @perf_flag=false
  38. @perf_cnt=[1000,0].pack('LL')
  39. end

  40. #设置时间比例因数
  41. @time_scale=@perf_cnt.unpack('LL')
  42. @time_scale[0] /= 1000.0
  43. @time_scale[1] /= 1000.0

  44. #起始时间清零
  45. self.clear()
  46. end

  47. #-=====================-#
  48. # 计时器清零
  49. #-=====================-#
  50. def clear()
  51. if @perf_flag
  52. @qpCounter.call(@time_start)
  53. else
  54. @time_start=[@tGetTime.call(),0].pack('LL')
  55. end
  56. end

  57. #-==============================-#
  58. # 获取当前经过的时间,单位毫秒
  59. #-==============================-#
  60. def now()
  61. now_time = 0.0e1
  62. now_time += self.timer() - self.start()
  63. now_time /= self.scale()
  64. return self.debug(now_time)
  65. end

  66. #-==============================-#
  67. # 获取当前经过的时间,单位秒
  68. #-==============================-#
  69. def now_s()
  70. now_time = 0.0e1
  71. now_time += self.timer() - self.start()
  72. now_time /= (self.scale()*1000)
  73. return self.debug(now_time)
  74. end

  75. #-==============================-#
  76. # 帧错...
  77. #-==============================-#
  78. def debug(now_time)
  79. if @decimal>0
  80. now_time = (now_time * (10**@decimal)).floor/(10.0**@decimal)
  81. else
  82. now_time = now_time.floor
  83. end
  84. return now_time

  85. #以下用于debug模式
  86. if now_time < 0
  87. p "Timer Wrong!! Clear...",now_time,\
  88. @perf_flag,@qpCounter,@tGetTime,
  89. @time_now.unpack('LL')[0],@time_now.unpack('LL')[1],
  90. @time_start.unpack('LL')[0],@time_start.unpack('LL')[1]
  91. self.clear()
  92. return 0.0
  93. else
  94. return now_time
  95. end
  96. end

  97. #-=====================-#
  98. # 获取时间比例因数
  99. #-=====================-#
  100. def scale()
  101. return @time_scale[0]+\
  102. @time_scale[1]*0xffffffff
  103. end

  104. #-=====================-#
  105. # 获取起始滴答数
  106. #-=====================-#
  107. def start()
  108. return @time_start.unpack('LL')[0]+\
  109. @time_start.unpack('LL')[1]*0xffffffff
  110. end

  111. #-=====================-#
  112. # 获取当前的嘀哒数
  113. #-=====================-#
  114. def timer()
  115. if @perf_flag
  116. @qpCounter.call(@time_now)
  117. else
  118. @time_now=[@tGetTime.call(),0].pack('LL')
  119. end
  120. return @time_now.unpack('LL')[0]+\
  121. @time_now.unpack('LL')[1]*0xffffffff
  122. end
  123. end
  124. #-------------------------------------#
  125. # 初始化自身成一个全局变量
  126. #-------------------------------------#
  127. $sys_timer=SystemTimer.new()
  128. #-------------------------------------#
复制代码


              [本贴由 柳柳 于 2005-10-24 7:08:51 最后编辑]
我只个搬答案的
叔叔我已经当爹了~
婚后闪人了……

Lv2.观梦者

梦石
0
星屑
260
在线时间
1373 小时
注册时间
2005-10-16
帖子
5113

贵宾

2
 楼主| 发表于 2005-10-22 00:26:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
不知道以前有没有有人弄过类似的,不管了……发了再说……%_%
[10.18更新]
修正了进位未处理的Bug...-_-b很严重的bug啊……
『使用对象』
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 protected]
  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. def initialize(use_GetTime=false)
  22. # 初始化,根据系统选择不同精度计时器
  23. @qpFrequency = Win32API.new("kernel32","QueryPerformanceFrequency",'p','L')
  24. @qpCounter = Win32API.new("kernel32","QueryPerformanceCounter",'p','L')
  25. @tGetTime = Win32API.new("winmm","timeGetTime",'','L')

  26. @decimal=3
  27. @perf_cnt=" " * 8
  28. @time_start=" " * 8
  29. @time_now=" " * 8

  30. result = @qpFrequency.call(@perf_cnt)

  31. if use_GetTime
  32. result = 0
  33. end

  34. if result!=0
  35. @perf_flag=true
  36. else
  37. @perf_flag=false
  38. @perf_cnt=[1000,0].pack('LL')
  39. end

  40. #设置时间比例因数
  41. @time_scale=@perf_cnt.unpack('LL')
  42. @time_scale[0] /= 1000.0
  43. @time_scale[1] /= 1000.0

  44. #起始时间清零
  45. self.clear()
  46. end

  47. #-=====================-#
  48. # 计时器清零
  49. #-=====================-#
  50. def clear()
  51. if @perf_flag
  52. @qpCounter.call(@time_start)
  53. else
  54. @time_start=[@tGetTime.call(),0].pack('LL')
  55. end
  56. end

  57. #-==============================-#
  58. # 获取当前经过的时间,单位毫秒
  59. #-==============================-#
  60. def now()
  61. now_time = 0.0e1
  62. now_time += self.timer() - self.start()
  63. now_time /= self.scale()
  64. return self.debug(now_time)
  65. end

  66. #-==============================-#
  67. # 获取当前经过的时间,单位秒
  68. #-==============================-#
  69. def now_s()
  70. now_time = 0.0e1
  71. now_time += self.timer() - self.start()
  72. now_time /= (self.scale()*1000)
  73. return self.debug(now_time)
  74. end

  75. #-==============================-#
  76. # 帧错...
  77. #-==============================-#
  78. def debug(now_time)
  79. if @decimal>0
  80. now_time = (now_time * (10**@decimal)).floor/(10.0**@decimal)
  81. else
  82. now_time = now_time.floor
  83. end
  84. return now_time

  85. #以下用于debug模式
  86. if now_time < 0
  87. p "Timer Wrong!! Clear...",now_time,\
  88. @perf_flag,@qpCounter,@tGetTime,
  89. @time_now.unpack('LL')[0],@time_now.unpack('LL')[1],
  90. @time_start.unpack('LL')[0],@time_start.unpack('LL')[1]
  91. self.clear()
  92. return 0.0
  93. else
  94. return now_time
  95. end
  96. end

  97. #-=====================-#
  98. # 获取时间比例因数
  99. #-=====================-#
  100. def scale()
  101. return @time_scale[0]+\
  102. @time_scale[1]*0xffffffff
  103. end

  104. #-=====================-#
  105. # 获取起始滴答数
  106. #-=====================-#
  107. def start()
  108. return @time_start.unpack('LL')[0]+\
  109. @time_start.unpack('LL')[1]*0xffffffff
  110. end

  111. #-=====================-#
  112. # 获取当前的嘀哒数
  113. #-=====================-#
  114. def timer()
  115. if @perf_flag
  116. @qpCounter.call(@time_now)
  117. else
  118. @time_now=[@tGetTime.call(),0].pack('LL')
  119. end
  120. return @time_now.unpack('LL')[0]+\
  121. @time_now.unpack('LL')[1]*0xffffffff
  122. end
  123. end
  124. #-------------------------------------#
  125. # 初始化自身成一个全局变量
  126. #-------------------------------------#
  127. $sys_timer=SystemTimer.new()
  128. #-------------------------------------#
复制代码


              [本贴由 柳柳 于 2005-10-24 7:08:51 最后编辑]
我只个搬答案的
叔叔我已经当爹了~
婚后闪人了……

Lv1.梦旅人

创世.神隐

梦石
0
星屑
86
在线时间
194 小时
注册时间
2005-10-15
帖子
4037
3
发表于 2005-10-26 21:44:12 | 只看该作者
能用在哪方面呢?能介绍一下吗?
Blog:https://wssyxz.com
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2005-10-22
帖子
81
4
发表于 2005-10-26 22:06:30 | 只看该作者
如果你需要你的游戏计时功能是和实际时间一样的话,用这个计时器。

如果你在游戏里面需要精确到毫秒的计时器,可以用这个。
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

指引者

梦石
0
星屑
50
在线时间
2 小时
注册时间
2005-10-25
帖子
375
5
发表于 2005-10-27 00:30:11 | 只看该作者
用得着那么精确吗?  如果真是精确到毫秒得话 可以用来作游戏里面得跑路时间
    嗯不错  我偷走了哈{/dy}{/dy}{/dy}{/dy}
↓这是啥-- [IMG][/IMG]
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2005-10-22
帖子
81
6
发表于 2005-10-27 01:42:00 | 只看该作者
看你的游戏了。
我的游戏用得着,所以我做了这个~

这个是真实时间,如果游戏很卡的话,那么这个时间依然保持不变。原有的计时器,如果游戏帧速改变了,时间亦会改变-_-b至少我是这样理解的……

看情况使用。
签名被屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-25 17:28

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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