扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 82|回复: 0

[转载发布] 如何让计时器数字变化的速度与游戏帧率一样快?

[复制链接]
累计送礼:
0 个
累计收礼:
0 个
  • TA的每日心情
    开心
    2025-7-8 01:43
  • 签到天数: 157 天

    连续签到: 2 天

    [LV.7]常住居民III

    2448

    主题

    498

    回帖

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    6
    卡币
    13119
    OK点
    16
    推广点
    0
    同能卷
    0
    积分
    16093

    灌水之王

    发表于 3 天前 | 显示全部楼层 |阅读模式
    想整一个类似合金装备里警报时的数字显示,最后一位数字的变化速度和游戏帧率一样,或者直接显示当前的帧也行。
    使用的计时器脚本
    RUBY 代码
    1. #---------
    2. #已经移植到RPG MAKER VX ACE
    3. #Lanza
    4. #---------
    5. #==============================================================================
    6. # ★ 多组多功能计时器 ★       -> by   芯☆淡茹水
    7. #==============================================================================
    8. # ● 使用方法:1,复制脚本,插入到 main 前。
    9. #
    10. #              2,启动计时:
    11. #                 
    12. #                 PS:注意这里!!!!!!!!!!!!!!
    13. #                 改为了$game_timer 而非原版$game_system
    14. #
    15. #                 事件 -> 脚本 :$game_timer.start_time(tit, min, switch, add)
    16. #
    17. #                 括号里的参数:tit    -> 标题 。比如:双倍经验时间;副本时间,等
    18. #                                         代入的参数为 字符串 。由于计时窗口宽度
    19. #                                         有限,标题最好不要超过 5 个汉字。
    20. #
    21. #                               min    -> 计时时间X分钟。(注意是分钟,可以是小数)
    22. #
    23. #                               switch -> 计时完成后打开的开关ID。
    24. #
    25. #                               add    -> 正计时标志。需要正计时写 true ,不需要
    26. #                                         时可不写。
    27. #
    28. #               3,中途取消计时:
    29. #        
    30. #                    事件 -> 脚本:$game_system.end_time(switch_id)
    31. #
    32. #                    括号里的参数:switch_id  -> 对应的计时器打开的开关ID。
    33. #==============================================================================
    34. # ● 说明:
    35. #           该计时器理论上可同时无限个计时。
    36. #
    37. #           计时窗口只在地图场景显示,战斗场景不显示计时窗口,但仍然会计时,
    38. #           其他场景不计时。
    39. #
    40. #           计时完成后自动打开启动计时时设置的开关,需要实现什么功能可通过事件,
    41. #           开关,公共事件,等,来协调完成。这个就自己开脑洞。
    42. #           可参照范例工程的示范(事件,公共事件)。
    43. #     
    44. #==============================================================================
    45. # ● 设置:
    46. module X☆R
    47.   #--------------------------------------------------------------------------
    48.   # 计时窗口 X 坐标。
    49.   TM_WINDOW_X = 280
    50.   #--------------------------------------------------------------------------
    51.   # 计时窗口 Y 坐标。
    52.   TM_WINDOW_Y = 15
    53.   #--------------------------------------------------------------------------
    54.   # 计时窗口标题字体颜色。
    55.   TM_TIT_COLOR = Color.new(255,0,0)
    56.   #--------------------------------------------------------------------------
    57.   # 计时窗时间字体颜色(30 秒以上)。
    58.   TM_TIME_COLOR1 = Color.new(255,0,0)
    59.   #--------------------------------------------------------------------------
    60.   # 计时窗时间字体颜色(10 - 30 秒)。
    61.   TM_TIME_COLOR2 = Color.new(255,0,0)
    62.   #--------------------------------------------------------------------------
    63.   # 计时窗时间字体颜色(0 - 10 秒)。
    64.   TM_TIME_COLOR3 = Color.new(255,0,0)
    65.   #--------------------------------------------------------------------------
    66.   # 最后 10 秒是否声音提示?
    67.   TM_SOUND_TIP = false
    68.   #--------------------------------------------------------------------------
    69.   # 声音提示的 SE 文件名。
    70.   TM_SOUND = "Switch1"
    71. end
    72. #==============================================================================
    73. class Time_Meter
    74.   attr_reader     :switch_id, :title, :add_count
    75.   attr_accessor   :sec, :max_sec
    76.   #--------------------------------------------------------------------------
    77.   def initialize(title, min, switch_id, add)
    78.     @title = title
    79.     @max_sec = @sec = Integer(min * 60)
    80.     @sec = 0if add
    81.     @switch_id = switch_id
    82.     @add_count = add ? 1 : -1
    83.   end
    84.   #--------------------------------------------------------------------------
    85.   def sec_judge
    86.     return@add_count > 0 ? @sec < @max_sec : @sec > 0
    87.   end
    88.   #--------------------------------------------------------------------------
    89.   def update
    90.     @sec += @add_countif sec_judge and Graphics.frame_count % Graphics.frame_rate == 0
    91.     unless sec_judge
    92.       $game_switches[@switch_id] = true
    93.       $game_map.need_refresh = true
    94.     end
    95.     if@data_sec != @secand@add_count < 0
    96.       @data_sec = @sec
    97.       if@sec < 10and X☆R::TM_SOUND_TIPand$scene.is_a?(Scene_Map)
    98.         Audio.se_play("Audio/SE/#{X☆R::TM_SOUND}", 80, 100)
    99.       end
    100.     end
    101.   end
    102. end
    103. #==============================================================================
    104. class Window_Tm < Sprite
    105.   #--------------------------------------------------------------------------
    106.   def initialize(x, y, time)
    107.     super()
    108.     self.x = x
    109.     self.y = y
    110.     self.z = 9999
    111.     @time = time
    112.     bitmap = Cache.character($game_player.character_name)
    113.     @b_width = bitmap.width / 8
    114.     @b_height = bitmap.height / 4
    115.   end
    116.   #--------------------------------------------------------------------------
    117.   def dispose
    118.     self.bitmap.disposeifself.bitmap
    119.     super
    120.   end
    121.   #--------------------------------------------------------------------------
    122.   def refresh
    123.     self.bitmap.disposeifself.bitmap
    124.     self.bitmap = Bitmap.new("Graphics/Pictures/Time_meter_back")
    125.     self.bitmap.font.size = 18
    126.     self.bitmap.font.bold = true
    127.     cx = self.bitmap.text_size(@time.title).width
    128.     self.bitmap.font.color = X☆R::TM_TIT_COLOR
    129.     self.bitmap.draw_text(35, 0, cx, 30, @time.title)
    130.     if@time.add_count > 0
    131.       color = X☆R::TM_TIME_COLOR1
    132.     else
    133.       color = @time.sec >= 30 ? X☆R::TM_TIME_COLOR1 :
    134.       (@time.sec >= 10 ? X☆R::TM_TIME_COLOR2 : X☆R::TM_TIME_COLOR3)
    135.     end
    136.     hour = @time.sec / 3600
    137.     min = @time.sec / 60 % 60
    138.     sec = @time.sec % 60
    139.     text = sprintf("%02d:%02d:%02d", hour, min, sec)
    140.     self.bitmap.font.color = color
    141.     self.bitmap.draw_text(130, 0, 90, 30, text, 2)
    142.   end
    143.   #--------------------------------------------------------------------------
    144.   def update
    145.     returnifself.disposed?
    146.     super
    147.     if@data_sec != @time.sec
    148.       @data_sec = @time.sec
    149.       refresh
    150.     end
    151.     ifself.x < $game_player.screen_x + @b_widthand
    152.      self.x + 240 > $game_player.screen_x - @b_widthand
    153.      self.y + 30 < $game_player.screen_yand
    154.      self.y > $game_player.screen_y - @b_height
    155.       self.opacity = 80
    156.     else
    157.       self.opacity = 255ifself.opacity < 255
    158.     end
    159.     dispose unless@time.sec_judge
    160.   end
    161. end
    162. #==============================================================================
    163. class Game_Timer
    164.   #--------------------------------------------------------------------------
    165.   alias add_initialize_xr initialize
    166.   def initialize
    167.     add_initialize_xr
    168.     @time_meters = []
    169.   end
    170.   #--------------------------------------------------------------------------
    171.   def time_meters
    172.     return@time_meters
    173.   end
    174.   #--------------------------------------------------------------------------
    175.   def start_time(title="", min=0, switch_id=0, add=false)
    176.     returnif min == 0or switch_id == 0
    177.     for t in@time_meters
    178.       if t.switch_id == switch_id
    179.         t.add_count > 0 ? t.max_sec += Integer(min * 60) : t.sec += Integer(min * 60)
    180.         return
    181.       end
    182.     end
    183.     @time_meters.push(Time_Meter.new(title, min, switch_id, add))
    184.   end
    185.   #--------------------------------------------------------------------------
    186.   def end_time(switch_id)
    187.     for t in@time_meters
    188.       if t.switch_id == switch_id
    189.         @time_meters.delete(t)
    190.       end
    191.     end
    192.   end
    193.   #--------------------------------------------------------------------------
    194.   alias old_update_xr update
    195.   def update
    196.     unless@time_meters.empty?
    197.       for time in@time_meters
    198.         time.update
    199.         unless time.sec_judge
    200.           @time_meters.delete(time)
    201.           next
    202.         end
    203.       end
    204.     end
    205.     old_update_xr
    206.   end
    207. end
    208. #==============================================================================
    209. class Scene_Map
    210.   #--------------------------------------------------------------------------
    211.   alias old_main_xr main
    212.   def main
    213.     @time_window = []
    214.     old_main_xr
    215.     @time_window.each{|t| t.dispose}
    216.   end
    217.   #--------------------------------------------------------------------------
    218.   alias old_update_xr update
    219.   def update
    220.     if@data_time != $game_timer.time_meters
    221.       @data_time = $game_timer.time_meters.clone
    222.       @time_window.each{|t| t.dispose}
    223.       unless$game_timer.time_meters.empty?
    224.         for i in0...$game_timer.time_meters.size
    225.           time = $game_timer.time_meters[i]
    226.           nx = X☆R::TM_WINDOW_X > 320 ? -240 : 240
    227.           nx = i / 8 * nx
    228.           x = X☆R::TM_WINDOW_X + nx ; y = i % 8 * 30 + X☆R::TM_WINDOW_Y
    229.           @time_window[i] = Window_Tm.new(x, y, time)
    230.         end
    231.       end
    232.     end
    233.     unless@time_window.empty?
    234.       for w in@time_window
    235.         w.update
    236.         @time_window.delete(w)if w.disposed?
    237.       end
    238.     end
    239.     old_update_xr
    240.   end
    241. end
    242. #==============================================================================
    复制代码

    求大佬解答
                本帖来自P1论坛作者grimstone线圈,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=497756  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2025-7-24 07:03 , Processed in 0.138553 second(s), 57 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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