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

Project1

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

[原创发布] 【移植】VA中的draw_text_ex

[复制链接]

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

跳转到指定楼层
1
发表于 2014-12-4 18:58:58 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 RyanBern 于 2015-2-11 20:27 编辑

@VIPArcher draw_text_ex已经成功在RMXP中存活。
除了移植外,还增加了一点点新的东西在里面,同时也改了一些东西。
会用VA的可以在XP中直接使用,用XP人看看说明书即可。如果还是有问题,请参考范例~
效果图:

范例:
Project5.rar (188.97 KB, 下载次数: 94)
RUBY 代码复制
  1. #============================================================================
  2. # 更方便地在窗口中描绘文字:移植VA中的 draw_text_ex (for XP)
  3. #----------------------------------------------------------------------------
  4. # 移植 By :RyanBern
  5. #============================================================================
  6. #============================================================================
  7. # 使用方法:
  8. #     在Window_Base或者是其子类下,使用draw_text_ex(x, y, text)对文本进行绘制
  9. #     注意这个和 RGSS1 的不一样,RGSS1的 draw_text 定义在 Bitmap 类上。
  10. #     所以使用的方法为self.draw_text_ex(x, y, text)而非self.contents.draw_text_ex()
  11. #     text 中可以使用控制符,现在支持的控制符如下:
  12. #----------------------------------------------------------------------------
  13. # \n             :换行
  14. # \\v[n]         : 第 n 号变量
  15. # \\n[n]         : ID为 n 的队员的名字
  16. # \\p[n]         : 队伍中 第 n 个队员(从上至下)的名字
  17. # \\c[n]         : 字体变为编号为 n 的颜色(参考默认对话框)
  18. # \\ic[filename] : 描绘文件名为filename的图标
  19. # \\g            : 描绘当前队伍的金钱
  20. # \\I            : 斜体
  21. # \\i            : 取消斜体
  22. # \\B            : 粗体
  23. # \\b            : 取消粗体
  24. # \\{            : 字号加大一些(+8,不能超过64号字)
  25. # \\}            : 字号变小一些(-8,不能小于16号字)
  26. # \\\\           : '\'这个文字本身
  27. #----------------------------------------------------------------------------
  28. # 注:由于转义字符的缘故,字符串必须用双引号
  29. #----------------------------------------------------------------------------
  30. # 例:text = "\\I你好!\\i\n\\{I\\} am RyanBern!\n\\v[1]\\ic[001-Weapon01]\n\\g"
  31. #        self.draw_text_ex(0, 0, text)
  32. # 实际描绘效果为:
  33. #   (斜体)你好!(取消斜体)
  34. #   (字号32)I(字号24) am RyanBern!
  35. #   (1号变量的值)(图标001-Weapon01)
  36. #   (金钱数量+货币单位)
  37. #============================================================================
  38. class Window_Base < Window
  39.   #--------------------------------------------------------------------------
  40.   # ● 绘制带有控制符的文本内容
  41.   #--------------------------------------------------------------------------
  42.   def draw_text_ex(x, y, text)
  43.     reset_font_settings
  44.     text = convert_escape_characters(text)
  45.     pos = {:x => x, :y => y, :new_x => x, :height => calc_line_height(text)}
  46.     process_character(text.slice!(/./m), text, pos) until text.empty?
  47.   end
  48.   #--------------------------------------------------------------------------
  49.   # ● 更改内容绘制颜色
  50.   #     enabled : 有效的标志。false 的时候使用半透明效果绘制
  51.   #--------------------------------------------------------------------------
  52.   def change_color(color, enabled = true)
  53.     self.contents.font.color = color
  54.     self.contents.font.color.alpha = 128 unless enabled
  55.   end
  56.   #--------------------------------------------------------------------------
  57.   # ● 重置字体设置
  58.   #--------------------------------------------------------------------------
  59.   def reset_font_settings
  60.     change_color(normal_color)
  61.     contents.font.size = Font.default_size
  62.     contents.font.bold = false
  63.     contents.font.italic = false
  64.   end
  65.   #--------------------------------------------------------------------------
  66.   # ● 进行控制符的事前变换
  67.   #    在实际绘制前、将控制符替换为实际的内容。
  68.   #    为了减少歧异,文字「\」会被首先替换为转义符(\e)。
  69.   #--------------------------------------------------------------------------
  70.   def convert_escape_characters(text)
  71.     result = text.to_s.clone
  72.     result.gsub!(/\\/)            { "\e" }
  73.     result.gsub!(/\e\e/)          { "\\" }
  74.     result.gsub!(/\eC/i)          { "\e\001" }
  75.     result.gsub!(/\eic/i)         { "\e\002" }
  76.     result.gsub!(/\e\{/)          { "\e\003" }
  77.     result.gsub!(/\e\}/)          { "\e\004" }
  78.     result.gsub!(/\eI/)           { "\e\005" }
  79.     result.gsub!(/\ei/)           { "\e\006" }
  80.     result.gsub!(/\eB/)           { "\e\007" }
  81.     result.gsub!(/\eb/)           { "\e\008" }
  82.     result.gsub!(/\eV\[(\d+)\]/i) { $game_variables[$1.to_i] }
  83.     result.gsub!(/\eN\[(\d+)\]/i) { actor_name($1.to_i) }
  84.     result.gsub!(/\eP\[(\d+)\]/i) { party_member_name($1.to_i) }
  85.     result.gsub!(/\eG/i)          { $game_party.gold.to_s + $data_system.words.gold }
  86.     result
  87.   end
  88.   #--------------------------------------------------------------------------
  89.   # ● 获取第 n 号角色的名字
  90.   #--------------------------------------------------------------------------
  91.   def actor_name(n)
  92.     actor = n >= 1 ? $game_actors[n] : nil
  93.     actor ? actor.name : ""
  94.   end
  95.   #--------------------------------------------------------------------------
  96.   # ● 获取第 n 号队伍成员的名字
  97.   #--------------------------------------------------------------------------
  98.   def party_member_name(n)
  99.     actor = n >= 1 ? $game_party.actors[n - 1] : nil
  100.     actor ? actor.name : ""
  101.   end
  102.   #--------------------------------------------------------------------------
  103.   # ● 文字的处理
  104.   #     c    : 文字
  105.   #     text : 绘制处理中的字符串缓存(字符串可能会被修改)
  106.   #     pos  : 绘制位置 {:x, :y, :new_x, :height}
  107.   #--------------------------------------------------------------------------
  108.   def process_character(c, text, pos)
  109.     case c
  110.     when "\r"   # 回车
  111.       return
  112.     when "\n"   # 换行
  113.       process_new_line(text, pos)
  114.     when "\f"   # 翻页
  115.       process_new_page(text, pos)
  116.     when "\e"   # 控制符
  117.       process_escape_character(obtain_escape_code(text), text, pos)
  118.     else        # 普通文字
  119.       process_normal_character(c, pos)
  120.     end
  121.   end
  122.   #--------------------------------------------------------------------------
  123.   # ● 处理普通文字
  124.   #--------------------------------------------------------------------------
  125.   def process_normal_character(c, pos)
  126.     text_width = self.contents.text_size(c).width
  127.     self.contents.draw_text(pos[:x], pos[:y], text_width * 2, pos[:height], c)
  128.     pos[:x] += text_width
  129.   end
  130.   #--------------------------------------------------------------------------
  131.   # ● 处理换行文字
  132.   #--------------------------------------------------------------------------
  133.   def process_new_line(text, pos)
  134.     pos[:x] = pos[:new_x]
  135.     pos[:y] += pos[:height]
  136.     pos[:height] = calc_line_height(text)
  137.   end
  138.   #--------------------------------------------------------------------------
  139.   # ● 处理翻页文字
  140.   #--------------------------------------------------------------------------
  141.   def process_new_page(text, pos)
  142.   end
  143.   #--------------------------------------------------------------------------
  144.   # ● 获取控制符的实际形式(这个方法会破坏原始数据)
  145.   #--------------------------------------------------------------------------
  146.   def obtain_escape_code(text)
  147.     text.slice!(/^[\001\002\003\004\005\006\007\008]/)
  148.   end
  149.   #--------------------------------------------------------------------------
  150.   # ● 获取控制符的参数(这个方法会破坏原始数据)
  151.   #--------------------------------------------------------------------------
  152.   def obtain_escape_param(text)
  153.     text.slice!(/^\[(.+?)\]/)
  154.     return $1 || ""
  155.   end
  156.   #--------------------------------------------------------------------------
  157.   # ● 控制符的处理
  158.   #     code : 控制符的实际形式(比如“\C[1]”是“C”)
  159.   #     text : 绘制处理中的字符串缓存(字符串可能会被修改)
  160.   #     pos  : 绘制位置 {:x, :y, :new_x, :height}
  161.   #--------------------------------------------------------------------------
  162.   def process_escape_character(code, text, pos)
  163.     case code
  164.     when "\001"
  165.       change_color(text_color(obtain_escape_param(text).to_i)) rescue change_color(0)
  166.     when "\002"
  167.       process_draw_icon(obtain_escape_param(text), pos)
  168.     when "\003"
  169.       make_font_bigger
  170.     when "\004"
  171.       make_font_smaller
  172.     when "\005"
  173.       self.contents.font.italic = true
  174.     when "\006"
  175.       self.contents.font.italic = false
  176.     when "\007"
  177.       self.contents.font.bold = true
  178.     when "\008"
  179.       self.contents.font.bold = false
  180.     end
  181.   end
  182.   #--------------------------------------------------------------------------
  183.   # ● 处理控制符指定的图标绘制
  184.   #--------------------------------------------------------------------------
  185.   def process_draw_icon(icon_index, pos)
  186.     draw_icon(icon_index, pos[:x], pos[:y])
  187.     pos[:x] += 24
  188.   end
  189.   #--------------------------------------------------------------------------
  190.   # ● 放大字体尺寸
  191.   #--------------------------------------------------------------------------
  192.   def make_font_bigger
  193.     contents.font.size += 8 if contents.font.size <= 64
  194.   end
  195.   #--------------------------------------------------------------------------
  196.   # ● 缩小字体尺寸
  197.   #--------------------------------------------------------------------------
  198.   def make_font_smaller
  199.     contents.font.size -= 8 if contents.font.size >= 16
  200.   end
  201.   #--------------------------------------------------------------------------
  202.   # ● 计算行高
  203.   #     restore_font_size : 计算完成后是否恢复原本的字体尺寸?
  204.   #--------------------------------------------------------------------------
  205.   def calc_line_height(text, restore_font_size = true)
  206.     result = [32, contents.font.size].max
  207.     last_font_size = contents.font.size
  208.     text.slice(/^.*$/).scan(/\e[\{\}]/).each do |esc|
  209.       make_font_bigger  if esc == "\e{"
  210.       make_font_smaller if esc == "\e}"
  211.       result = [result, contents.font.size].max
  212.     end
  213.     contents.font.size = last_font_size if restore_font_size
  214.     result
  215.   end
  216.   #--------------------------------------------------------------------------
  217.   # ● 绘制图标
  218.   #     enabled : 有效的标志。false 的时候使用半透明效果绘制
  219.   #--------------------------------------------------------------------------
  220.   def draw_icon(icon_name, x, y, enabled = true)
  221.     bitmap = RPG::Cache.icon(icon_name)
  222.     rect = Rect.new(0, 0, 24, 24)
  223.     contents.blt(x, y+4, bitmap, rect, enabled ? 255 : 128)
  224.   end
  225. end

评分

参与人数 3星屑 +500 梦石 +1 收起 理由
怪蜀黍 + 350 + 1 发布奖励
kuerlulu + 30
VIPArcher + 120 塞糖

查看全部评分

头像被屏蔽

Lv3.寻梦者

梦石
0
星屑
2379
在线时间
912 小时
注册时间
2014-10-14
帖子
1331

开拓者

2
发表于 2014-12-4 20:28:01 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv3.寻梦者

梦石
0
星屑
2379
在线时间
912 小时
注册时间
2014-10-14
帖子
1331

开拓者

3
发表于 2014-12-4 20:54:20 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1457
在线时间
724 小时
注册时间
2010-9-22
帖子
178
4
发表于 2014-12-7 23:07:19 | 只看该作者
亲爱的,你这玩儿意有毛病,我用完以后不光没换行,还把我的description搞全乱码了,我新建了一工程最后还是乱码。。。你是怎么做的?

点评

这次再看看?修复了不能描绘中文的问题,里面有个范例可以看下。  发表于 2014-12-7 23:56
实在是抱歉,测试的时候忘记中文的问题了……给我一些时间我修复下。  发表于 2014-12-7 23:43

评分

参与人数 1星屑 +60 收起 理由
RyanBern + 60 塞糖

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

【欧皇】

梦石
3
星屑
2066
在线时间
1004 小时
注册时间
2013-8-19
帖子
3486

开拓者

5
发表于 2014-12-24 13:10:14 手机端发表。 | 只看该作者
好强大的样子⊙o⊙等上电脑再试试
来自: Android客户端
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

6
发表于 2015-2-11 20:01:55 | 只看该作者
本帖最后由 taroxd 于 2015-2-11 20:04 编辑
  1.   def obtain_escape_param(text)
  2.     text.slice!(/^\[(.+)\]/)
  3.     return $1 || ""
  4.   end
复制代码
请将其中的正则表达式改为 /^\[(.+?)\]/

不然的话一行写两个控制符就是个杯具

VA 中是用 \d 的所以问题不大。既然用 . 了就应该注意一下

评分

参与人数 1星屑 +66 收起 理由
RyanBern + 66 已修改

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-27 07:50

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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