Project1

标题: draw_text必备扩展 [打印本页]

作者: 恐惧剑刃    时间: 2013-12-22 13:45
标题: draw_text必备扩展
本帖最后由 恐惧剑刃 于 2015-7-13 22:28 编辑

非常实用,而且脚本易修改。
另外脚本中不再置字体名、粗体以及斜体等的改变
(因为那玩意性价比太低了 - - !)
  1. #===========================================================================
  2. #  *  draw_text必备扩展
  3. #===========================================================================
  4. =begin

  5. !c[n]   改用n号颜色 *注 颜色在color处自定
  6. !s[n]   改用n号大小
  7. !k[n]   空n像素

  8. v[n]    n号变量

  9. i[n]        描绘id为n的物品的图标
  10. s[n]        描绘id为n的特技的图标
  11. w[n]        描绘id为n的武器的图标
  12. a[n]        描绘id为n的防具的图标

  13. \\n   手动换行(附带自动换行)

  14. =end



  15. class Window_Base < Window
  16.   def dl_draw_text(x, y, text)
  17.     #初始化数据
  18.     color_copy = self.contents.font.color.clone
  19.     text_copy = text
  20.     text_x,text_y = x,y
  21.     #正则
  22.     text_copy.gsub!(/!c\[([0-9]+)\]/) { "\001[#{$1}]" }
  23.     text_copy.gsub!(/!s\[([0-9]+)\]/) { "\002[#{$1}]" }
  24.     text_copy.gsub!(/!k\[([0-9]+)\]/) { "\003[#{$1}]" }
  25.     text_copy.gsub!(/i\[([0-9]+)\]/) { "\020[#{$1}]" }
  26.     text_copy.gsub!(/s\[([0-9]+)\]/) { "\021[#{$1}]" }
  27.     text_copy.gsub!(/w\[([0-9]+)\]/) { "\022[#{$1}]" }
  28.     text_copy.gsub!(/a\[([0-9]+)\]/) { "\023[#{$1}]" }
  29.     text_copy.gsub!(/v\[([0-9]+)\]/) { $game_variables[$1.to_i] }
  30.     text_copy.gsub!(/\\n/) { "\030" }
  31.     # 描绘每一个字
  32.     while ((c = text_copy.slice!(/./m)) != nil)
  33.       #颜色
  34.       if c == "\001"
  35.         text_copy.sub!(/\[([0-9]+)\]/, "")
  36.         self.contents.font.color = text_color($1.to_i)
  37.         next
  38.       end
  39.       #大小
  40.       if c == "\002"
  41.         text_copy.sub!(/\[([0-9]+)\]/, "")
  42.         self.contents.font.size = $1.to_i
  43.         next
  44.       end
  45.       #空像素
  46.       if c == "\003"
  47.         text_copy.sub!(/\[([0-9]+)\]/, "")
  48.         text_x += $1.to_i
  49.         if text_x > self.width - 40
  50.           text_x = 40 + text_x - self.width
  51.           text_y += self.contents.font.size
  52.         end
  53.         next
  54.       end
  55.       #物品
  56.       if c == "\020"
  57.         text_copy.sub!(/\[([0-9]+)\]/, "")
  58.         if !$data_items[$1.to_i].nil? and $data_items[$1.to_i].icon_name != ""
  59.           next if text_x + 24 > self.width - 32
  60.           bitmap = RPG::Cache.icon($data_items[$1.to_i].icon_name)
  61.           self.contents.blt(text_x, text_y, bitmap, Rect.new(0, 0, 24, 24))
  62.           text_x += 24
  63.         end
  64.         next
  65.       end
  66.       #特技
  67.       if c == "\021"
  68.         text_copy.sub!(/\[([0-9]+)\]/, "")
  69.         if !$data_skills[$1.to_i].nil? and $data_skills[$1.to_i].icon_name != ""
  70.           next if text_x + 24 > self.width - 32
  71.           bitmap = RPG::Cache.icon($data_skills[$1.to_i].icon_name)
  72.           self.contents.blt(text_x, text_y, bitmap, Rect.new(0, 0, 24, 24))
  73.           text_x += 24
  74.         end
  75.         next
  76.       end
  77.       #武器
  78.       if c == "\022"
  79.         text_copy.sub!(/\[([0-9]+)\]/, "")
  80.         if !$data_weapons[$1.to_i].nil? and $data_weapons[$1.to_i].icon_name != ""
  81.           next if text_x + 24 > self.width - 32
  82.           bitmap = RPG::Cache.icon($data_weapons[$1.to_i].icon_name)
  83.           self.contents.blt(text_x, text_y, bitmap, Rect.new(0, 0, 24, 24))
  84.           text_x += 24
  85.         end
  86.         next
  87.       end
  88.       #防具
  89.       if c == "\023"
  90.         text_copy.sub!(/\[([0-9]+)\]/, "")
  91.         if !$data_armors[$1.to_i].nil? and $data_armors[$1.to_i].icon_name != ""
  92.           next if text_x + 24 > self.width - 32
  93.           bitmap = RPG::Cache.icon($data_armors[$1.to_i].icon_name)
  94.           self.contents.blt(text_x, text_y, bitmap, Rect.new(0, 0, 24, 24))
  95.           text_x += 24
  96.         end
  97.         next
  98.       end
  99.       #换行
  100.       if c == "\030"
  101.         text_y += self.contents.font.size
  102.         next
  103.       end
  104.       cx = self.contents.text_size(c).width
  105.       self.contents.draw_text(text_x, text_y, cx, self.contents.font.size, c)
  106.       text_x += cx
  107.       #自动换行
  108.       if text_x > self.width - 40
  109.         text_x = 0
  110.         text_y += self.contents.font.size
  111.       end
  112.     end
  113.     self.contents.font.color = color_copy
  114.   end
  115. end
复制代码

作者: chd114    时间: 2013-12-23 14:44
能给些示意图效果图吗?
作者: 无脑之人    时间: 2013-12-23 22:16
效果真赞,干脆向里面加什么[b][\b]算了XD
不过原版的那种奇葩写法【/的那个】阁下要不要进行识别呢【支持了内嵌表达式就没必要了其实- -】
「打死我都不会向ruby问效率的233333」
作者: 恐惧剑刃    时间: 2013-12-26 18:53
强势更新自顶
作者: 天地有正气    时间: 2013-12-26 20:19
效果真心华丽呢!
感觉楼主水平提高了不少呢!加油!
作者: fux2    时间: 2013-12-27 17:33
一看你这个就有严重的问题- -文字自动缩放功能不是被吃了么。
作者: 恐惧剑刃    时间: 2013-12-27 17:50
fux2 发表于 2013-12-27 17:33
一看你这个就有严重的问题- -文字自动缩放功能不是被吃了么。

自动缩放?不懂求教
作者: fux2    时间: 2013-12-28 11:08
恋′挂机 发表于 2013-12-27 17:50
自动缩放?不懂求教

你把标题的新游戏三个字改成8个字或者以上,你用原版描绘和自己这个脚本分开试就知道。
作者: 恐惧剑刃    时间: 2013-12-28 11:41
fux2 发表于 2013-12-28 11:08
你把标题的新游戏三个字改成8个字或者以上,你用原版描绘和自己这个脚本分开试就知道。 ...

已做简单处理
作者: chd114    时间: 2013-12-28 22:07
这个脚本效果很好但是这后遗症好蛋疼···放了之后还要改坐标···如果不用了还得改回去···
作者: 恐惧剑刃    时间: 2013-12-28 22:54
chd114 发表于 2013-12-28 22:07
这个脚本效果很好但是这后遗症好蛋疼···放了之后还要改坐标···如果不用了还得改回去··· ...

坐标偏移主要是HP SP的描绘,时间的描绘
不使用默认描绘方法的话问题不大吧
作者: chd114    时间: 2013-12-28 22:58
恋′挂机 发表于 2013-12-28 22:54
坐标偏移主要是HP SP的描绘,时间的描绘
不使用默认描绘方法的话问题不大吧 ...

汗···要是能把自动的一并调整就好了···感觉调这种自动的好违和···
作者: 恐惧剑刃    时间: 2013-12-31 13:41
最终版更新,人工置顶
作者: fux2    时间: 2013-12-31 15:22
换行功能的存在已经完全废掉了draw_text接收描绘Rect参数的意义,干脆只接受XY好了.
另外缩放怎么能整体缩放……应该用接收参数的Rect.width除以全部字体描绘的text_size - -才正常吧。
作者: 恐惧剑刃    时间: 2013-12-31 15:53
fux2 发表于 2013-12-31 15:22
换行功能的存在已经完全废掉了draw_text接收描绘Rect参数的意义,干脆只接受XY好了.
另外缩放怎么能整体缩 ...

说得是,会尽快修改
作者: chd114    时间: 2013-12-31 16:09
恋′挂机 发表于 2013-12-31 15:53
说得是,会尽快修改

那这最终版是什么情况···
作者: 斯塔萨菲雅    时间: 2013-12-31 18:16
本帖最后由 斯塔萨菲雅 于 2013-12-31 18:18 编辑

用了下效果还不错……
这个能实现XP的Window_help里说明文字的换行么。。
自己琢磨了一下结果换行的文字全叠在一起了,又不知道y坐标要怎么改才对……不会脚本太要命了= =
作者: 1243852    时间: 2013-12-31 21:27
没有VA的么?
作者: 恐惧剑刃    时间: 2014-1-1 12:18
三版本通用更新
作者: 1243852    时间: 2014-1-1 13:26
多谢楼主。。
作者: chd114    时间: 2014-1-1 13:38
话说这脚本其实还有很大改进空间···比如显示角色名称、状态名称、技能等等
作者: chd114    时间: 2014-1-1 13:43
  1. =begin

  2. by 薄凉看客
  3. 感谢 fux2 的帮助!
  4. 改进:Chd114

  5. 使用方法
  6. blkk_text(rect, str, align)
  7. blkk_text(x, y, width, height, str, align)

  8. 若str不是字符串对象,则会先调用 to_s 方法转换成字符串

  9. str所支持的控制符:
  10. !N[n] 显示ID为n的角色名
  11. !V[n] 显示n号变量值
  12. !C[n] 文字颜色改变(draw_color可自定义颜色)
  13. !II[n] 显示n号物品的图标
  14. !IW[n] 显示n号武器的图标
  15. !IA[n] 显示n号防具的图标
  16. !IS[n] 使用n号技能的图标
  17. !换行 手动换行
  18. !S[n] 使用n号字体大小

  19. =end

  20. # 即无视draw_text的参数width和height
  21. # width = 字符本身的宽度 height = 32
  22. $忽略默认宽高 = false

  23. # 彩色底 控制条件 建议命令窗口中使用
  24. $color_floor = false

  25. class Bitmap
  26.   alias text_old draw_text unless method_defined? :text_old
  27.   def draw_text(*arg)
  28.     if arg[0].is_a?(Rect)
  29.       color_coo = self.font.color.clone
  30.       self.font.color = Color.new(0, 0, 0)
  31.       rect_x = arg[0].x
  32.       rect_y = arg[0].y
  33.       rect_width = arg[0].width
  34.       rect_height = arg[0].height
  35.       rect = Rect.new(rect_x, rect_y, rect_width, rect_height)
  36.       for i in 1..4
  37.         rect.set(rect_x + 1, rect_y, rect_width, rect_height) if i == 1
  38.         rect.set(rect_x - 1, rect_y, rect_width, rect_height) if i == 2
  39.         rect.set(rect_x, rect_y + 1, rect_width, rect_height) if i == 3
  40.         rect.set(rect_x, rect_y - 1, rect_width, rect_height) if i == 4
  41.         text_old(rect, arg[1], arg[2] == nil ? 0 : arg[2])
  42.       end
  43.       self.font.color = color_coo
  44.       rect.set(rect_x, rect_y, rect_width, rect_height)
  45.       text_old(rect, arg[1], arg[2] == nil ? 0 : arg[2])
  46.     else
  47.       color_coo = self.font.color.clone
  48.       self.font.color = Color.new(0, 0, 0)
  49.       text_old(
  50.       arg[0] + 1, arg[1], arg[2], arg[3], arg[4], arg[5] == nil ? 0 : arg[5])
  51.       text_old(
  52.       arg[0] - 1, arg[1], arg[2], arg[3], arg[4], arg[5] == nil ? 0 : arg[5])
  53.       text_old(
  54.       arg[0], arg[1] + 1, arg[2], arg[3], arg[4], arg[5] == nil ? 0 : arg[5])
  55.       text_old(
  56.       arg[0], arg[1] - 1, arg[2], arg[3], arg[4], arg[5] == nil ? 0 : arg[5])
  57.       self.font.color = color_coo
  58.       text_old(
  59.       arg[0], arg[1], arg[2], arg[3], arg[4], arg[5] == nil ? 0 : arg[5])
  60.     end
  61.   end
  62.   def blkk_text(*arg)
  63.     if arg[0].is_a?(Rect)
  64.       rect_x = arg[0].x
  65.       rect_y = arg[0].y
  66.       rect_width = arg[0].width
  67.       rect_height = arg[0].height
  68.       rect = Rect.new(rect_x, rect_y, rect_width, rect_height)
  69.       text = arg[1]
  70.       align = arg[2] == nil ? 0 : arg[2]
  71.     else
  72.       x,y,width,height,text = arg[0],arg[1],arg[2],arg[3],arg[4]
  73.       align = arg[5] == nil ? 0 : arg[5]
  74.     end
  75.     size_copy = self.font.size
  76.     color_coo = self.font.color.clone
  77.     if $color_floor
  78.       ca = [[255, 128][rand(2)], [255, 128][rand(2)], [255, 128][rand(2)]]
  79.       for s in 0...width
  80.         self.fill_rect(x + s, y, 1, height, Color.new(
  81.         ca[0], ca[1], ca[2], 255 - s * 320 / width))
  82.       end
  83.     end
  84.     copy_text = text.clone
  85.     i_rect = Rect.new(0, 0, 24, 24)
  86.     begin
  87.       text = copy_text
  88.       text.gsub!(/\![V]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
  89.     end until copy_text == text
  90.     text.gsub!(/\![N]\[([0-9]+)\]/) do
  91.       $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
  92.     end
  93.     text.gsub!(/\\\\/) { "\000" }
  94.     text.gsub!(/\![C]\[([0-9]+)\]/) { "\001[#{$1}]" }
  95.     text.gsub!(/\![II]\[([0-9]+)\]/) { "\002[#{$1}]" }
  96.     text.gsub!(/\![IW]\[([0-9]+)\]/) { "\003[#{$1}]" }
  97.     text.gsub!(/\![IA]\[([0-9]+)\]/) { "\004[#{$1}]" }
  98.     text.gsub!(/\![IS]\[([0-9]+)\]/) { "\005[#{$1}]" }
  99.     text.gsub!(/\![S]\[([0-9]+)\]/) { "\006[#{$1}]" }
  100.     while ((c = text.slice!(/./m)) != nil)
  101.       if c == "\000"
  102.         c = "\\"
  103.       end
  104.       if c == "\001"
  105.         text.sub!(/\[([0-9]+)\]/, "")
  106.         color_coo = draw_color($1.to_i)
  107.         next
  108.       end
  109.       if c == "\002"
  110.         text.sub!(/\[([0-9]+)\]/, "")
  111.         unless arg[0].is_a?(Rect)
  112.           begin
  113.           self.blt(
  114.           x, y + 3, RPG::Cache.icon($data_items[$1.to_i].icon_name), i_rect)
  115.           x += 24
  116.           rescue
  117.           icon_index = $data_items[$1.to_i].icon_index
  118.           bitmap = Cache.system("Iconset")
  119.           rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
  120.           self.blt(x, y + 3, bitmap, rect)
  121.           end
  122.         else
  123.           begin
  124.           self.blt(
  125.           rect_x, rect_y + 3, RPG::Cache.icon(
  126.           $data_items[$1.to_i].icon_name), i_rect)
  127.           rect_x += 24
  128.           rescue
  129.           icon_index = $data_items[$1.to_i].icon_index
  130.           bitmap = Cache.system("Iconset")
  131.           rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
  132.           self.blt(x, y + 3, bitmap, rect)
  133.           end
  134.         end
  135.         next
  136.       end
  137.       if c == "\003"
  138.         text.sub!(/\[([0-9]+)\]/, "")
  139.         unless arg[0].is_a?(Rect)
  140.           begin
  141.           self.blt(
  142.           x, y + 3, RPG::Cache.icon(
  143.           $data_weapons[$1.to_i].icon_name), i_rect)
  144.           x += 24
  145.           rescue
  146.           icon_index = $data_weapons[$1.to_i].icon_index
  147.           bitmap = Cache.system("Iconset")
  148.           rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
  149.           self.blt(x, y + 3, bitmap, rect)
  150.           end
  151.         else
  152.           begin
  153.           self.blt(
  154.           rect_x, rect_y + 3, RPG::Cache.icon(
  155.           $data_weapons[$1.to_i].icon_name), i_rect)
  156.           rect_x += 24
  157.           rescue
  158.           icon_index = $data_weapons[$1.to_i].icon_index
  159.           bitmap = Cache.system("Iconset")
  160.           rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
  161.           self.blt(x, y + 3, bitmap, rect)
  162.           end
  163.         end
  164.         next
  165.       end
  166.       if c == "\004"
  167.         text.sub!(/\[([0-9]+)\]/, "")
  168.         unless arg[0].is_a?(Rect)
  169.           begin
  170.           self.blt(
  171.           x, y + 3, RPG::Cache.icon(
  172.           $data_armors[$1.to_i].icon_name), i_rect)
  173.           x += 24
  174.           rescue
  175.           icon_index = $data_armors[$1.to_i].icon_index
  176.           bitmap = Cache.system("Iconset")
  177.           rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
  178.           self.blt(x, y + 3, bitmap, rect)
  179.           end
  180.         else
  181.           begin
  182.           self.blt(
  183.           rect_x, rect_y + 3, RPG::Cache.icon(
  184.           $data_armors[$1.to_i].icon_name), i_rect)
  185.           rect_x += 24
  186.           rescue
  187.           icon_index = $data_armors[$1.to_i].icon_index
  188.           bitmap = Cache.system("Iconset")
  189.           rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
  190.           self.blt(x, y + 3, bitmap, rect)
  191.           end
  192.         end
  193.         next
  194.       end
  195.       if c == "\005"
  196.         text.sub!(/\[([0-9]+)\]/, "")
  197.         unless arg[0].is_a?(Rect)
  198.           begin
  199.           self.blt(
  200.           x, y + 3, RPG::Cache.icon(
  201.           $data_skills[$1.to_i].icon_name), i_rect)
  202.           x += 24
  203.           rescue
  204.           icon_index = $data_skills[$1.to_i].icon_index
  205.           bitmap = Cache.system("Iconset")
  206.           rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
  207.           self.blt(x, y + 3, bitmap, rect)
  208.           end
  209.         else
  210.           begin
  211.           self.blt(
  212.           rect_x, rect_y + 3, RPG::Cache.icon(
  213.           $data_skills[$1.to_i].icon_name), i_rect)
  214.           rect_x += 24
  215.           rescue
  216.           icon_index = $data_skills[$1.to_i].icon_index
  217.           bitmap = Cache.system("Iconset")
  218.           rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
  219.           self.blt(x, y + 3, bitmap, rect)
  220.           end
  221.         end
  222.         next
  223.       end
  224.       if c == "\006"
  225.         text.sub!(/\[([0-9]+)\]/, "")
  226.         self.font.size = $1.to_i
  227.         next
  228.       end
  229.       self.font.color = Color.new(0, 0, 0)
  230.       if $忽略默认宽高
  231.         self.font.color = color_coo
  232.         if arg[0].is_a?(Rect)
  233.           draw_text(rect.set(
  234.           rect_x, rect_y, self.text_size(c).width, 32), c, align)
  235.           rect_x += self.text_size(c).width
  236.         else
  237.           draw_text(x, y, self.text_size(c).width, 32, c, align)
  238.           x += self.text_size(c).width
  239.         end
  240.       else
  241.         self.font.color = color_coo
  242.         if arg[0].is_a?(Rect)
  243.           draw_text(rect.set(
  244.           rect_x, rect_y, rect_width, rect_height), c, align)
  245.           rect_x += self.text_size(c).width
  246.         else
  247.           draw_text(x, y, width, height, c, align)
  248.           x += self.text_size(c).width
  249.         end
  250.       end
  251.     end
  252.     self.font.size = size_copy
  253.   end
  254.   def draw_color(n)
  255.     return Color.new(255, 255, 255, 255) if n == 0
  256.     return Color.new(128, 128, 255, 255) if n == 1
  257.     return Color.new(255, 128, 128, 255) if n == 2
  258.     return Color.new(128, 255, 128, 255) if n == 3
  259.     return Color.new(128, 255, 255, 255) if n == 4
  260.     return Color.new(255, 128, 255, 255) if n == 5
  261.     return Color.new(255, 255, 128, 255) if n == 6
  262.     return Color.new(192, 192, 192, 255) if n == 7
  263.     return normal_color
  264.   end
  265. end

  266. class Bitmap
  267.   alias blkk_text_old blkk_text
  268.   def blkk_text(*arg)
  269.     if arg[0].is_a?(Rect)
  270.       rect_x = arg[0].x
  271.       rect_y = arg[0].y
  272.       rect_width = arg[0].width
  273.       rect_height = arg[0].height
  274.       rect = Rect.new(rect_x, rect_y, rect_width, rect_height)
  275.       unless arg[1].is_a?(String)
  276.         arg[1] = arg[1].to_s
  277.       end
  278.       y_plus = 0
  279.       arg[1].split("!换行").each{
  280.       |i| blkk_text_old(rect.set(
  281.       rect_x, rect_y + y_plus, rect_width, rect_height),
  282.       i, arg[2] == nil ? 0 : arg[2]) ; y_plus += 32}
  283.     else
  284.       unless arg[4].is_a?(String)
  285.         arg[4] = arg[4].to_s
  286.       end
  287.       y_plus = 0
  288.       arg[4].split("!换行").each{
  289.       |i| blkk_text_old(
  290.       arg[0], arg[1] + y_plus, arg[2], arg[3], i, arg[5] == nil ? 0 : arg[5]) ;
  291.       y_plus += 32}
  292.     end
  293.   end
  294. end
复制代码

作者: 恐惧剑刃    时间: 2014-1-1 13:51
chd114 发表于 2014-1-1 13:43

这样貌似不可以啊。。。

text.gsub!(/\![IW]\[([0-9]+)\]/) { "\003[#{$1}]" }

然后 !I[n] 和 !W[n] 都会触发条件

摘自F1 : /[abc]/ 表示只要匹配 "a"、"b"、"c" 中任何一个即可。
作者: chd114    时间: 2014-1-1 13:53
恋′挂机 发表于 2014-1-1 13:51
这样貌似不可以啊。。。

text.gsub!(/\!\[([0-9]+)\]/) { "\003[#{$1}]" }

你发个工程看下···
作者: 恐惧剑刃    时间: 2014-1-1 13:57
chd114 发表于 2014-1-1 13:53
你发个工程看下···

text.gsub!(/\!IW\[([0-9]+)\]/) { "\003[#{$1}]" }

去掉 [] 就可以了
作者: chd114    时间: 2014-1-1 14:14
恋′挂机 发表于 2014-1-1 13:57
text.gsub!(/\!IW\[([0-9]+)\]/) { "\003[#{$1}]" }

去掉 [] 就可以了

全部都去掉[]?




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