Project1

标题: 多组计时器功能请教一下 [打印本页]

作者: jiushiainilip19    时间: 2016-1-21 23:36
标题: 多组计时器功能请教一下
用的是芯大的脚本多组计时器
这个脚本里是从0开始计算时间的  我游戏中是属于建造生产类型
能否增加剩余时间的计算  希望大神帮帮忙!
@芯☆淡茹水  不知道能@到吗?
RUBY 代码复制
  1. #==============================================================================
  2. # ★ 多组多功能计时器 ★       -> by   芯☆淡茹水
  3. #==============================================================================
  4. # ● 使用方法:1,复制脚本,插入到 main 前。
  5. #
  6. #              2,启动计时:
  7. #
  8. #                 事件 -> 脚本 :$game_system.start_time(tit, min, switch, add)
  9. #
  10. #                 括号里的参数:tit    -> 标题 。比如:双倍经验时间;副本时间,等
  11. #                                         代入的参数为 字符串 。由于计时窗口宽度
  12. #                                         有限,标题最好不要超过 5 个汉字。
  13. #
  14. #                               min    -> 计时时间X分钟。(注意是分钟,可以是小数)
  15. #
  16. #                               switch -> 计时完成后打开的开关ID。
  17. #
  18. #                               add    -> 正计时标志。需要正计时写 true ,不需要
  19. #                                         时可不写。
  20. #
  21. #               3,中途取消计时:
  22. #        
  23. #                    事件 -> 脚本:$game_system.end_time(switch_id)
  24. #
  25. #                    括号里的参数:switch_id  -> 对应的计时器打开的开关ID。
  26. #==============================================================================
  27. # ● 说明:
  28. #           该计时器理论上可同时无限个计时。
  29. #
  30. #           计时窗口只在地图场景显示,战斗场景不显示计时窗口,但仍然会计时,
  31. #           其他场景不计时。
  32. #
  33. #           计时完成后自动打开启动计时时设置的开关,需要实现什么功能可通过事件,
  34. #           开关,公共事件,等,来协调完成。这个就自己开脑洞。
  35. #           可参照范例工程的示范(事件,公共事件)。
  36. #     
  37. #==============================================================================
  38. # ● 设置:
  39. module X☆R
  40.   #--------------------------------------------------------------------------
  41.   # 计时窗口 X 坐标。
  42.   TM_WINDOW_X = 400
  43.  
  44.   #--------------------------------------------------------------------------
  45.   # 计时窗口 Y 坐标。
  46.   TM_WINDOW_Y = 0
  47.  
  48.   #--------------------------------------------------------------------------
  49.   # 计时窗口标题字体颜色。
  50.   TM_TIT_COLOR = Color.new(0,255,255)
  51.  
  52.   #--------------------------------------------------------------------------
  53.   # 计时窗时间字体颜色(30 秒以上)。
  54.   TM_TIME_COLOR1 = Color.new(0,85,0)
  55.  
  56.   #--------------------------------------------------------------------------
  57.   # 计时窗时间字体颜色(10 - 30 秒)。
  58.   TM_TIME_COLOR2 = Color.new(255,120,0)
  59.  
  60.   #--------------------------------------------------------------------------
  61.   # 计时窗时间字体颜色(0 - 10 秒)。
  62.   TM_TIME_COLOR3 = Color.new(200,0,0)
  63.  
  64.   #--------------------------------------------------------------------------
  65.   # 最后 10 秒是否声音提示?
  66.   TM_SOUND_TIP = true
  67.  
  68.   #--------------------------------------------------------------------------
  69.   # 声音提示的 SE 文件名。
  70.   TM_SOUND = "032-Switch01"
  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 = 0 if 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_count if 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 != @sec and @add_count < 0
  96.       @data_sec = @sec
  97.       if @sec < 10 and X☆R::TM_SOUND_TIP and $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 = RPG::Cache.character($game_player.character_name, $game_player.character_hue)
  113.     @b_width = bitmap.width / 8
  114.     @b_height = bitmap.height / 4
  115.   end
  116.   #--------------------------------------------------------------------------
  117.   def dispose
  118.     self.bitmap.dispose if self.bitmap
  119.     super
  120.   end
  121.   #--------------------------------------------------------------------------
  122.   def refresh
  123.     self.bitmap.dispose if self.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.     return if self.disposed?
  146.     super
  147.     if @data_sec != @time.sec
  148.       @data_sec = @time.sec
  149.       refresh
  150.     end
  151.     if self.x < $game_player.screen_x + @b_width and
  152.      self.x + 240 > $game_player.screen_x - @b_width and
  153.      self.y + 30 < $game_player.screen_y and
  154.      self.y > $game_player.screen_y - @b_height
  155.       self.opacity = 80
  156.     else
  157.       self.opacity = 255 if self.opacity < 255
  158.     end
  159.     dispose unless @time.sec_judge
  160.   end
  161. end
  162. #==============================================================================
  163. class Game_System
  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.     return if min == 0 or 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_system.time_meters
  221.       @data_time = $game_system.time_meters.clone
  222.       @time_window.each{|t| t.dispose}
  223.       unless $game_system.time_meters.empty?
  224.         for i in 0...$game_system.time_meters.size
  225.           time = $game_system.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. #==============================================================================

作者: 还我昨天    时间: 2016-1-28 15:06
看样作者解决了,但是可以请教一下计时器怎么用吗
作者: 冷峻逸    时间: 2016-1-28 15:21
提示: 作者被禁止或删除 内容自动屏蔽




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