查看: 17038|回复: 15

[通用发布] [PS0]双默认字体 v20120127.2【中英文使用不同字体】

[复制链接]

(?????)

梦石
0
星屑
872
在线时间
1327 小时
注册时间
2011-7-18
回帖
3036

贵宾

发表于 2012-1-23 22:30:16 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 各种压力的猫君 于 2012-2-6 19:06 编辑

[pre lang="ruby"]#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 = "隶书"
   
    # 英文字体
    ENG_FONT = "Consolas"
   
    # 作用范围
    # 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[/pre]

双默认字体0.png
双默认字体.png

虽说是PS0的脚本,但是这次不止VA可用,XP/VX也兼容(也就是说draw_text这定义基本没变过……)

评分

参与人数 2星屑 +1204 收起 理由
satgo1546 + 4 正对我的需要,Thanks~
忧雪の伤 + 1200 奖赏条例

查看全部评分

名侦探小柯

梦石
10
星屑
4410
在线时间
3740 小时
注册时间
2006-9-6
回帖
36596

极短27获奖MZ评测员开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

发表于 2012-1-23 22:39:45 | 显示全部楼层
围观好物,截图里的那个空格是手动打的吧 = =?

点评

避免误会我把截图换掉了- -  发表于 2012-1-25 18:47
“测试”开头的那行么……是的没错 = =  发表于 2012-1-23 22:41
不定期回归 ~ 游戏开发之旅
———————————————————————————————
回复

使用道具 举报

Fuzzy Ginkgo

梦石
0
星屑
61105
在线时间
1933 小时
注册时间
2010-6-26
回帖
1535

烫烫烫开拓者

发表于 2012-1-23 23:16:33 | 显示全部楼层
本帖最后由 orzfly 于 2012-1-23 23:17 编辑

Shy07的东西果然被你放出来了。
PS0是个啥东西啊啊啊

逐字描绘效率太低了吧……能匹配多少就匹配多少描绘吧……
我希望有cache.....

点评

匹配多了反而麻烦。RMXP的显示文章就是一字一字描绘的,没见效率差到哪去。另外我这渣本子都没问题了还怕主流配置出问题么……  发表于 2012-1-25 05:56
PS0理论上只为VA服务 - - 这次是特例兼容了 = =  发表于 2012-1-24 22:34
我也不知道PS0是什么……  发表于 2012-1-24 12:56
Organization for Popularization (of RPG Maker VX Ace) and Standardization (of Ruby Game Scripting System 3), RMVX Ace普及化暨RGSS3标准化组织,简称PS0(读作:PS Zero或PS 零)  发表于 2012-1-23 23:52
是我的啦 > < !  发表于 2012-1-23 23:25
我的言论只代表我个人的观点,不代表雇主及/或任何第三方的立场。
Opinions expressed are solely my own and do not express the views or opinions of my employer and/or any third parties.
捐赠 | GitHub
回复

使用道具 举报

虚構歪曲

梦石
0
星屑
354
在线时间
1196 小时
注册时间
2010-12-18
回帖
3842

贵宾

发表于 2012-1-24 12:56:37 | 显示全部楼层
我会告诉你你写的有点复杂么?不,不会。

点评

群里慢慢说~  发表于 2012-1-24 13:25
呃……求解 = =  发表于 2012-1-24 13:24
回复

使用道具 举报

梦石
0
星屑
50
在线时间
1281 小时
注册时间
2006-8-27
回帖
550
发表于 2012-1-25 15:54:55 | 显示全部楼层
本帖最后由 wbsy8241 于 2012-1-25 16:01 编辑

BUG提交

如果文字非左对齐 就会1次描出所有文字 也就不会再区分 中英了
等等 (我的VA新建工程里没用)

点评

先计算x坐标我想过了 字体不一样取得的宽是不一样的 所以不能先计算x  发表于 2012-1-25 21:04

评分

参与人数 2星屑 +452 收起 理由
忧雪の伤 + 320 奖赏条例
各种压力的猫君 + 132 感谢提交,20120125版已修正

查看全部评分

回复

使用道具 举报

(?????)

梦石
0
星屑
872
在线时间
1327 小时
注册时间
2011-7-18
回帖
3036

贵宾

 楼主| 发表于 2012-1-26 20:04:45 | 显示全部楼层
wbsy8241 发表于 2012-1-25 15:54
BUG提交

如果文字非左对齐 就会1次描出所有文字 也就不会再区分 中英了

先计算x坐标宽度没问题。
对齐有问题那个是因为我写错了 …… 20120126已修正
回复

使用道具 举报

梦石
0
星屑
50
在线时间
61 小时
注册时间
2011-7-24
回帖
72
发表于 2012-1-26 20:26:26 | 显示全部楼层
这...能够干嘛?没看懂。

点评

大部分中文字体的英文和数字很难看,这样可以用另一套英文字体。  发表于 2012-1-26 20:30
回复

使用道具 举报

梦石
0
星屑
50
在线时间
1281 小时
注册时间
2006-8-27
回帖
550
发表于 2012-1-26 21:32:05 | 显示全部楼层
本帖最后由 wbsy8241 于 2012-1-26 21:46 编辑
各种压力的猫君 发表于 2012-1-26 20:04
先计算x坐标宽度没问题。
对齐有问题那个是因为我写错了 …… 20120126已修正 ...


abcdefghijklmnopqrstuvwxyz0123456789           宋体
abcdefghijklmnopqrstuvwxyz0123456789         Tahoma
abcdefghijklmnopqrstuvwxyz0123456789                Times New Roman

只有等宽字计算出来的宽才是一样的 比如宋体
  1. bitmap = Bitmap.new(100,100)
  2. p "字号 #{bitmap.font.size}"
  3. bitmap.font.name = "黑体"
  4. p "黑体    测w试=>#{bitmap.text_size("测w试").width}"
  5. bitmap.font.name = "Tahoma"
  6. p "Tahoma  测w试=>#{bitmap.text_size("测w试").width}"
复制代码
字号 24
黑体    测w试=>60
Tahoma  测w试=>55

点评

了解,把两部分分开来计算宽度然后求和。避免版本号重复过0点再更新。  发表于 2012-1-26 21:54

评分

参与人数 2星屑 +332 收起 理由
忧雪の伤 + 200 奖赏条例
各种压力的猫君 + 132 感谢指正

查看全部评分

回复

使用道具 举报

梦石
0
星屑
66
在线时间
434 小时
注册时间
2006-5-25
回帖
178
发表于 2012-1-28 21:13:29 | 显示全部楼层
用双默认字体加羽化字符会有点卡,是我设置得不对还是我机能问题?


‘

经检验,卡机造成原因不是在双默认字体那里,而是在羽化字符那。。= =


──xmheart于2012-1-29 01:20补充以上内容’

点评

反正我05年的渣渣本子都秒出,我想这脚本效率应该不差。羽化字符应该会消耗大一点。  发表于 2012-1-29 00:47
因为都对draw_text进行了重定义,不冲突都是奇迹了。你可以先试试单独用你的羽化字符脚本看看效率如何。PS0脚本不提供对非PS0脚本的兼容补丁。  发表于 2012-1-29 00:46
回复

使用道具 举报

Adam

梦石
0
星屑
1118
在线时间
841 小时
注册时间
2010-8-24
回帖
2460
发表于 2012-1-31 10:49:11 | 显示全部楼层
那个......为什么只有数字更改字体汉字还是那丑八怪。

点评

没水啊坟蛋.....问个问题扣(哗——)的分  发表于 2012-1-31 15:17

评分

参与人数 1星屑 -10 收起 理由
忧雪の伤 -10 求你们不要水了。

查看全部评分

嘛,摸了。
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部