设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 14375|回复: 15
打印 上一主题 下一主题

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

[复制链接]

Lv2.观梦者

(?????)

梦石
0
星屑
728
在线时间
1327 小时
注册时间
2011-7-18
帖子
3184

贵宾

跳转到指定楼层
1
发表于 2012-1-23 22:30:16 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

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

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

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

RUBY 代码复制
  1. #encoding:utf-8
  2. #==============================================================================
  3. # ■ [PS0]双默认字体
  4. #        Draw_Text_DF
  5. #------------------------------------------------------------------------------
  6. #  对 Bitmap.draw_text 进行了重定义。
  7. #------------------------------------------------------------------------------
  8. #   若检测为纯中文,则使用默认字体;
  9. #   若检测为纯英文,则使用另一套字体。
  10. #   若检测结果为中英文混杂,则逐字描绘。
  11. #==============================================================================
  12. # [更新记录]
  13. #    - 2012.01.27 By 各种压力的猫君
  14. #      * 新写法自定义匹配更直观;
  15. #      * 更改一些语句的执行顺序以优化效率;
  16. #      * 重写基础x坐标获取方法,以兼容非等宽字体;
  17. #      * BUILD2: 修正基础x坐标的一处笔误
  18. #    - 2012.01.26 By 各种压力的猫君
  19. #      * 修正居中及居右坐标计算错误
  20. #    - 2012.01.25 By 各种压力的猫君
  21. #      * 重写逐字描绘方法,修正当对齐方式不为0时的错误
  22. #    - 2012.01.23 By 各种压力的猫君
  23. #      * 初版
  24. #------------------------------------------------------------------------------
  25. # [使用方法]
  26. #    - 插入到MAIN以上即可。
  27. #==============================================================================
  28. $_PS0 = {} if $_PS0 == nil  
  29. $_PS0["Draw_Text_DF"] = 20120127.2
  30. #==============================================================================
  31. # [PS0] 通用配置模块  
  32. #==============================================================================
  33. module PS0
  34.   module Draw_Text_DF
  35.  
  36.     # 是否对str做前检测(若设定为false则一直使用逐字描绘/两次描绘)
  37.     DO_PRE_CHECK = true
  38.  
  39.     # 默认字体(在这里指定了就不要再在MAIN里指定了)
  40.     Font.default_name = "隶书"
  41.  
  42.     # 英文字体
  43.     ENG_FONT = "Consolas"
  44.  
  45.     # 作用范围
  46.     # 0:全部字体
  47.     # 1:仅默认字体(即特殊指定的除外)
  48.     DO_CHANGE = 1
  49.  
  50.     # 中英文混排时的描绘方式
  51.     # 0:逐字描绘
  52.     # 1:分段描绘
  53.     DRAW_TYPE = 0
  54.  
  55.     # 自定义匹配
  56.     # 若不需要符号请将REG2、REG3清空但保留外侧半角双引号
  57.     REG1 = "0-9A-Za-z "                 # 数字、大小写字母、半角空格
  58.     REG2 = ";:?!@#%^&*(){}[]=-+_/|,.<>" # 一般符号
  59.     REG3 = "\"\'\$\\"                   # 特殊符号(要在前面加"\")
  60.  
  61.     # 生成真正的正则式(若不清楚切勿随意修改下一行)
  62.     REG = /[#{REG1 + (REG2+REG3).gsub!(/./) { "\\" + $& }}]/
  63.  
  64.   end
  65. end
  66. #==============================================================================
  67.  
  68. class Bitmap
  69.   #--------------------------------------------------------------------------
  70.   # ● Draw text
  71.   #--------------------------------------------------------------------------
  72.   alias old_draw_text draw_text
  73.   def draw_text(*args)
  74.   #--------------------------------------------------------------------------
  75.   # 当特殊字体且设定为不对特殊字体进行替换时,直接调用原有方式
  76.   if self.font.name != Font.default_name && PS0::Draw_Text_DF::DO_CHANGE == 1
  77.     old_draw_text(*args)
  78.   else
  79.   #--------------------------------------------------------------------------
  80.     # 记录默认字体
  81.     last_font_name = self.font.name
  82.     # 获取参数
  83.     if args[0].is_a?(Rect)
  84.       rect, str, align = args[0..2]
  85.       x, y, width, height = rect.x, rect.y, rect.width, rect.height
  86.     else
  87.       x, y, width, height, str, align = args[0..5]
  88.     end
  89.     str = str.to_s
  90.     align = 0 if align.nil?
  91.     # 执行前检测
  92.     if PS0::Draw_Text_DF::DO_PRE_CHECK == true
  93.       if str.scan(PS0::Draw_Text_DF::REG).size == 0 # 纯中文
  94.         old_draw_text(*args)
  95.       elsif str.scan(PS0::Draw_Text_DF::REG).size == str.size # 纯英文
  96.         change_to_eng_font
  97.         old_draw_text(*args)
  98.       else
  99.         case PS0::Draw_Text_DF::DRAW_TYPE
  100.         when 0 ; draw_text_1by1(x, y, width, height, str, align)
  101.         when 1 ; draw_text_npass(x, y, width, height, str, align)
  102.         end
  103.       end
  104.     else
  105.       case PS0::Draw_Text_DF::DRAW_TYPE
  106.       when 0 ; draw_text_1by1(x, y, width, height, str, align)
  107.       when 1 ; draw_text_npass(x, y, width, height, str, align)
  108.       end
  109.     end
  110.     # 还原默认字体
  111.     self.font.name = last_font_name
  112.   end # <- 检测特殊字体
  113.   end
  114.   #--------------------------------------------------------------------------
  115.   # ○ 逐字描绘
  116.   #--------------------------------------------------------------------------
  117.   def draw_text_1by1(x, y, width, height, str, align)
  118.     # 记录默认字体
  119.     last_font_name = self.font.name
  120.     # 临时变量(x坐标偏移量)
  121.     ox = 0
  122.     # 根据不同对齐方式计算基础x坐标
  123.     if align == 0 # 居左
  124.       bx = x
  125.     else
  126.       # 分离两种字体对应的str以实现非等宽字体的长度识别
  127.       str1 = str.clone.gsub!(PS0::Draw_Text_DF::REG)            { "" }
  128.       str2 = str.clone.gsub!(/(?!#{PS0::Draw_Text_DF::REG})./)  { "" }
  129.       str_width = text_size(str1).width
  130.       change_to_eng_font
  131.       str_width += text_size(str2).width
  132.       case align
  133.       when 0 # 居左
  134.         bx = x
  135.       when 1 # 居中
  136.         bx = x + (width - str_width) / 2
  137.       when 2 # 居右
  138.         bx = x + (width - str_width)
  139.       end
  140.     end
  141.     # 给字符串结尾添加特殊符号
  142.     str += "\P"
  143.     # 提取单个文字
  144.     while (!(c = str.slice!(/./m)).nil?)
  145.       # 还原默认字体
  146.       self.font.name = last_font_name
  147.       # 当满足正则匹配则替换字体
  148.       change_to_eng_font if c.slice(PS0::Draw_Text_DF::REG)
  149.       # 把前面的特殊符号删去(兼容Window_Command类的矩形选框)
  150.       if c == "\P"
  151.         c = ""
  152.       else
  153.         # 调用原方法
  154.         old_draw_text((bx + ox), y, width, height, c, 0)
  155.         # 横坐标偏移量
  156.         ox += text_size(c).width
  157.       end
  158.     end
  159.   end
  160.   #--------------------------------------------------------------------------
  161.   # ○ 变更为英文字体
  162.   #--------------------------------------------------------------------------
  163.   def change_to_eng_font
  164.     self.font.name = PS0::Draw_Text_DF::ENG_FONT
  165.   end
  166. end





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

评分

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

查看全部评分

Lv3.寻梦者

梦石
0
星屑
1293
在线时间
995 小时
注册时间
2014-12-14
帖子
3016

开拓者

16
发表于 2016-5-14 02:12:05 | 只看该作者
你好!在下有一事不明,一些字体【默认自带缩进】。

比如阁下范例图片中的字体,实现了“居中文字显示”,但是文字却不是顶格写的,左右两边各缩进了一点距离

这种情况如何避免呢,或者说,有没有可能在VA中实现word中【两端对齐】的功能呢?

在下遇到这种情况,觉得非常头痛!https://rpg.blue/thread-393404-1-1.html

希望阁下能够帮帮我,谢谢!



【RMVA教程】
---------------------
欲买桂花同载酒,终不似,少年游.
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
526
在线时间
452 小时
注册时间
2009-7-17
帖子
276
15
发表于 2012-9-17 11:36:03 | 只看该作者
能把英文改成日文么
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
29 小时
注册时间
2012-9-14
帖子
16
14
发表于 2012-9-17 10:26:19 | 只看该作者
额,如何更改汉字默认字体?
比如中文使用华康娃娃体
英文使用Gotica Bastard

把下载的字体直接放进文件夹
然后
    # 默认字体(在这里指定了就不要再在MAIN里指定了)
    Font.default_name = "隶书"

    # 英文字体
    ENG_FONT = "Consolas"
更改这里?
还需要改别的地方么。
还是需要变动脚本
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

13
发表于 2012-5-18 21:31:15 | 只看该作者
用了日文、韩文会怎样?
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
91 小时
注册时间
2012-3-3
帖子
65
12
发表于 2012-3-25 00:41:54 | 只看该作者
那字体需要放在游戏根目录还是让用户安装呢?

点评

囧rz。好吧,我自己研究研究……  发表于 2012-3-25 01:51
本脚本不适合初学者使用。  发表于 2012-3-25 01:49
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
66
在线时间
434 小时
注册时间
2006-5-25
帖子
201
11
发表于 2012-2-11 15:56:50 | 只看该作者
为什么有些时候放其他脚本再放这个字体会不变的?有时候先放这个脚本再放其他就正常了?前提是脚本的上下位置一样的


‘‘

补充问题:如何分别设置英文和中文的字体大小啊?换了个英文字体的却变小了。。。


──xmheart于2012-2-13 21:10补充以上内容’’

点评

问题解决了,前提是先让双默认字体脚本生效了再加其他脚本。= =不过要先新建工程再把旧的加回进去。  发表于 2012-2-11 23:21
要插多个脚本就自己想办法解决兼容问题 - - 特别是这种比较底层的。  发表于 2012-2-11 21:04
回复 支持 反对

使用道具 举报

Lv2.观梦者

Adam

梦石
0
星屑
713
在线时间
841 小时
注册时间
2010-8-24
帖子
2595
10
发表于 2012-1-31 10:49:11 | 只看该作者
那个......为什么只有数字更改字体汉字还是那丑八怪。

点评

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

评分

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

查看全部评分

嘛,摸了。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
66
在线时间
434 小时
注册时间
2006-5-25
帖子
201
9
发表于 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
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1281 小时
注册时间
2006-8-27
帖子
590
8
发表于 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 感谢指正

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-22 01:11

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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