Project1

标题: 【XP】系统计时器美化脚本 [打印本页]

作者: SailCat    时间: 2012-4-28 02:36
标题: 【XP】系统计时器美化脚本
本帖最后由 Sion 于 2013-12-17 16:17 编辑

使用说明:复制本脚本全部内容,插入Main之前,或者直接全文替换掉Sprite_Timer的内容
将附件1下载后存为"Timer.png"放在pictures文件夹下
美化显示效果有两种:
效果1:码表式(带1个小数位)第14行赋值为true
效果2:电子表式(不带小数位,冒号会跳动)第14行赋值为false
不管哪一种方式,整数秒的时间退位时,都有滑动效果
你也可以把第14行改为赋值为某开关,以便实现动态控制计时器的显示效果

  1. #==============================================================================
  2. # ■ Sprite_Timer
  3. #------------------------------------------------------------------------------
  4. #  显示计时器用的活动块。监视 $game_system 、活动块状态
  5. # 自动变化。
  6. #==============================================================================

  7. class Sprite_Timer < Sprite
  8.   #--------------------------------------------------------------------------
  9.   # ● 初始化对像
  10.   #--------------------------------------------------------------------------
  11.   def initialize
  12.     super
  13.     @use_decimal = false
  14.     if @use_decimal
  15.       self.bitmap = Bitmap.new(126, 32)
  16.     else
  17.       self.bitmap = Bitmap.new(90, 32)
  18.     end
  19.     self.x = 640 - self.bitmap.width
  20.     self.y = 0
  21.     self.z = 500
  22.     update
  23.   end
  24.   #--------------------------------------------------------------------------
  25.   # ● 释放
  26.   #--------------------------------------------------------------------------
  27.   def dispose
  28.     if self.bitmap != nil
  29.       self.bitmap.dispose
  30.     end
  31.     super
  32.   end
  33.   #--------------------------------------------------------------------------
  34.   # ● 刷新画面
  35.   #--------------------------------------------------------------------------
  36.   def update
  37.     super
  38.     # 设置计时器执行中为可见
  39.     self.visible = $game_system.timer_working
  40.     # 如果有必要再次描绘计时器
  41.     if $game_system.timer * 10 / Graphics.frame_rate != @total_sec
  42.       # 计算总计秒数
  43.       @total_sec = $game_system.timer * 10 / Graphics.frame_rate
  44.       # 生成计时器显示用字符串
  45.       min = @total_sec / 600
  46.       sec = (@total_sec % 600) / 10
  47.       dec = @total_sec % 10
  48.       # 使用小数的情况下,总是刷新
  49.       if @use_decimal
  50.         text = sprintf("%02d:%02d.%1d", min, sec, dec)
  51.       # 不使用小数,只有小数为是0 5 7 8 9时才刷新
  52.       elsif dec > 6 or dec == 0
  53.         text = sprintf("%02d:%02d", min, sec)
  54.       elsif dec == 5
  55.         text = sprintf("%02d %02d", min, sec)
  56.       end
  57.       # 需要刷新的情况下
  58.       if text != nil
  59.         # 清除位图
  60.         self.bitmap.clear
  61.         # 切割时间字符串
  62.         timer_array = text.scan(/./).reverse
  63.         # 从右向左填充
  64.         x = self.bitmap.width - 18
  65.         # 如果10秒内用红色,60秒内用黄色,其他时间用绿色
  66.         if @total_sec < 100
  67.           rect_y = 64
  68.         elsif @total_sec < 600
  69.           rect_y = 32
  70.         else
  71.           rect_y = 0
  72.         end
  73.         # 循环每一个字符填充位图
  74.         is_dec = @use_decimal
  75.         is_changing = true
  76.         for char in timer_array
  77.           if char == ":"
  78.             bitmap.blt(x, 0, RPG::Cache.picture("Timer"),
  79.               Rect.new(180, rect_y, 18, 32))
  80.           elsif char == "."
  81.             bitmap.blt(x, 0, RPG::Cache.picture("Timer"),
  82.               Rect.new(198, rect_y, 18, 32))
  83.             is_dec = false
  84.           elsif char != " "
  85.             timer_x = char.to_i * 18
  86.             # 需要显示完整数字的情况下
  87.             if is_dec or !is_changing or dec < 8
  88.               bitmap.blt(x, 0, RPG::Cache.picture("Timer"),
  89.                 Rect.new(timer_x, rect_y, 18, 32))
  90.             # 显示滑动数字
  91.             elsif dec == 9
  92.               timer_x_old = (char.to_i + 1) % 10 * 18
  93.               bitmap.blt(x, 11, RPG::Cache.picture("Timer"),
  94.                 Rect.new(timer_x_old, rect_y, 18, 21))
  95.               bitmap.blt(x, 0, RPG::Cache.picture("Timer"),
  96.                 Rect.new(timer_x, rect_y + 21, 18, 11))
  97.               is_changing = false if char.to_i < 9
  98.             elsif dec == 8
  99.               timer_x_old = (char.to_i + 1) % 10 * 18
  100.               bitmap.blt(x, 21, RPG::Cache.picture("Timer"),
  101.                 Rect.new(timer_x_old, rect_y, 18, 11))
  102.               bitmap.blt(x, 0, RPG::Cache.picture("Timer"),
  103.                 Rect.new(timer_x, rect_y + 11, 18, 21))
  104.               is_changing = false if char.to_i < 9
  105.             end
  106.           end
  107.           x -= 18
  108.         end
  109.       end
  110.     end
  111.   end
  112. end
复制代码
附件1:

效果示意图:

作者: 天使喝可乐    时间: 2012-4-28 12:01
会加重系统负担吗……
作者: 越前リョーマ    时间: 2012-4-28 22:32
电子表加自己PS个电子数字感觉效果还是应该不错的……
作者: SailCat    时间: 2012-5-2 21:32
天使喝可乐 发表于 2012-4-28 12:01
会加重系统负担吗……

不会的,测试过了,每4帧才重绘一次(码表模式),电子表模式每40帧重绘5次

作者: 永远の路克酱    时间: 2012-5-2 21:56
我看到fps怎么才1
作者: SailCat    时间: 2012-5-2 22:08
永远の路克酱 发表于 2012-5-2 21:56
我看到fps怎么才1

截图的时候开了QQ……真正测试的时候fps没下过39
作者: 七夕小雨    时间: 2012-5-3 16:12
不知道是不是有点强迫症= =
看到
if @use_decimal

      self.bitmap = Bitmap.new(126, 32)

    else

      self.bitmap = Bitmap.new(90, 32)

    end
就想改写为 self.bitmap  = @use_decimal ? Bitmap.new(126, 32) : Bitmap.new(90, 32)




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