| 赞 | 1  | 
 
| VIP | 0 | 
 
| 好人卡 | 0 | 
 
| 积分 | 11 | 
 
| 经验 | 3105 | 
 
| 最后登录 | 2020-5-18 | 
 
| 在线时间 | 110 小时 | 
 
 
 
 
 
Lv3.寻梦者 
	- 梦石
 - 0 
 
        - 星屑
 - 1109 
 
        - 在线时间
 - 110 小时
 
        - 注册时间
 - 2016-8-7
 
        - 帖子
 - 97
 
 
 
 | 
	
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员  
 
x
 
rt 
 
 
 
#encoding:utf-8 
#============================================================================== 
# ■ [PS0]双默认字体 
#        Draw_Text_DF 
#------------------------------------------------------------------------------ 
#  对 Bitmap.draw_text 进行了重定义。 
#------------------------------------------------------------------------------ 
#   若检测为纯中文,则使用默认字体; 
#   若检测为纯英文,则使用另一套字体。 
#   若检测结果为中英文混杂,则逐字描绘。 
#============================================================================== 
# [更新记录] 
#    - 2012.01.27 By 各种压力的猫君 
#      * 新写法自定义匹配更直观; 
#      * 更改一些语句的执行顺序以优化效率; 
#      * 重写基础x坐标获取方法,以兼容非等宽字体; 
#      * BUILD2: 修正基础x坐标的一处笔误 
#    - 2012.01.26 By 各种压力的猫君 
#      * 修正居中及居右坐标计算错误 
#    - 2012.01.25 By 各种压力的猫君 
#      * 重写逐字描绘方法,修正当对齐方式不为0时的错误 
#    - 2012.01.23 By 各种压力的猫君 
#      * 初版 
#------------------------------------------------------------------------------ 
# [使用方法] 
#    - 插入到MAIN以上即可。 
#============================================================================== 
$_PS0 = {} if $_PS0 == nil   
$_PS0["Draw_Text_DF"] = 20120127.2 
#============================================================================== 
# [PS0] 通用配置模块   
#============================================================================== 
module PS0 
  module Draw_Text_DF 
 
    # 是否对str做前检测(若设定为false则一直使用逐字描绘/两次描绘) 
    DO_PRE_CHECK = true 
 
    # 默认字体(在这里指定了就不要再在MAIN里指定了) 
    Font.default_name = "方正兰亭粗黑_GBK" 
 
    # 英文字体 
    ENG_FONT = "Monotype Corsiva" 
 
 
    # 作用范围 
    # 0:全部字体 
    # 1:仅默认字体(即特殊指定的除外) 
    DO_CHANGE = 1 
 
    # 中英文混排时的描绘方式 
    # 0:逐字描绘 
    # 1:分段描绘 
    DRAW_TYPE = 0 
 
    # 自定义匹配 
    # 若不需要符号请将REG2、REG3清空但保留外侧半角双引号 
    REG1 = "0-9A-Za-z "                 # 数字、大小写字母、半角空格 
    REG2 = ";:?!@#%^&*(){}[]=-+_/|,.<>" # 一般符号 
    REG3 = "\"\'\$\\"                   # 特殊符号(要在前面加"\") 
 
    # 生成真正的正则式(若不清楚切勿随意修改下一行) 
    REG = /[#{REG1 + (REG2+REG3).gsub!(/./) { "\\" + $& }}]/ 
 
  end 
end 
#============================================================================== 
 
class Bitmap 
  #-------------------------------------------------------------------------- 
  # ● Draw text 
  #-------------------------------------------------------------------------- 
  alias old_draw_text draw_text 
  def draw_text(*args) 
  #-------------------------------------------------------------------------- 
  # 当特殊字体且设定为不对特殊字体进行替换时,直接调用原有方式 
  if self.font.name != Font.default_name && PS0::Draw_Text_DF::DO_CHANGE == 1 
    old_draw_text(*args) 
  else 
  #-------------------------------------------------------------------------- 
    # 记录默认字体 
    last_font_name = self.font.name 
    # 获取参数 
    if args[0].is_a?(Rect) 
      rect, str, align = args[0..2] 
      x, y, width, height = rect.x, rect.y, rect.width, rect.height 
    else 
      x, y, width, height, str, align = args[0..5] 
    end 
    str = str.to_s 
    align = 0 if align.nil? 
    # 执行前检测 
    if PS0::Draw_Text_DF::DO_PRE_CHECK == true 
      if str.scan(PS0::Draw_Text_DF::REG).size == 0 # 纯中文 
        old_draw_text(*args) 
      elsif str.scan(PS0::Draw_Text_DF::REG).size == str.size # 纯英文 
        change_to_eng_font 
        old_draw_text(*args) 
      else 
        case PS0::Draw_Text_DF::DRAW_TYPE 
        when 0 ; draw_text_1by1(x, y, width, height, str, align) 
        when 1 ; draw_text_npass(x, y, width, height, str, align) 
        end 
      end 
    else 
      case PS0::Draw_Text_DF::DRAW_TYPE 
      when 0 ; draw_text_1by1(x, y, width, height, str, align) 
      when 1 ; draw_text_npass(x, y, width, height, str, align) 
      end 
    end 
    # 还原默认字体 
    self.font.name = last_font_name 
  end # <- 检测特殊字体 
  end 
  #-------------------------------------------------------------------------- 
  # ○ 逐字描绘 
  #-------------------------------------------------------------------------- 
  def draw_text_1by1(x, y, width, height, str, align) 
    # 记录默认字体 
    last_font_name = self.font.name 
    # 临时变量(x坐标偏移量) 
    ox = 0 
    # 根据不同对齐方式计算基础x坐标 
    if align == 0 # 居左 
      bx = x 
    else 
      # 分离两种字体对应的str以实现非等宽字体的长度识别 
      str1 = str.clone.gsub!(PS0::Draw_Text_DF::REG)            { "" } 
      str2 = str.clone.gsub!(/(?!#{PS0::Draw_Text_DF::REG})./)  { "" } 
      str_width = text_size(str1).width 
      change_to_eng_font 
      str_width += text_size(str2).width 
      case align 
      when 0 # 居左 
        bx = x 
      when 1 # 居中 
        bx = x + (width - str_width) / 2 
      when 2 # 居右 
        bx = x + (width - str_width) 
      end 
    end 
    # 给字符串结尾添加特殊符号 
    str += "\P" 
    # 提取单个文字 
    while (!(c = str.slice!(/./m)).nil?) 
      # 还原默认字体 
      self.font.name = last_font_name 
      # 当满足正则匹配则替换字体 
      change_to_eng_font if c.slice(PS0::Draw_Text_DF::REG) 
      # 把前面的特殊符号删去(兼容Window_Command类的矩形选框) 
      if c == "\P" 
        c = "" 
      else 
        # 调用原方法 
        old_draw_text((bx + ox), y, width, height, c, 0) 
        # 横坐标偏移量 
        ox += text_size(c).width 
      end 
    end 
  end 
  #-------------------------------------------------------------------------- 
  # ○ 变更为英文字体 
  #-------------------------------------------------------------------------- 
  def change_to_eng_font 
    self.font.name = PS0::Draw_Text_DF::ENG_FONT 
  end 
end 
 
 
 
 |   
 
 
 
 |