Project1

标题: 请教关于描绘颜色转义符的相关问题。 [打印本页]

作者: 文雅夕露    时间: 2018-4-7 21:52
标题: 请教关于描绘颜色转义符的相关问题。
也不知道该怎么说明比较好。
就是在一个新的帮助窗口使用转移符描绘部分文字颜色。
但是这个帮助窗口已经是按字描绘的。
就是想让逐个字描绘的效果跟更改颜色的效果共存。
脚本如下:
RUBY 代码复制
  1. class Window_Help2 < Window_Base
  2.   #--------------------------------------------------------------------------
  3.   # * 物件初始化
  4.   #--------------------------------------------------------------------------
  5.   def initialize
  6.     super(0, 0, 544, WLH + 48)
  7.     self.opacity = 0
  8.   end
  9.   #--------------------------------------------------------------------------
  10.   # ● 设置文本
  11.   #     text  : 窗口显示的字符串
  12.   #     align : 对齐方式 (0..左对齐、1..中间对齐、2..右对齐)
  13.   #--------------------------------------------------------------------------
  14.     def set_text(text, align = 0)
  15.     # 如果文本和对齐方式的至少一方与上次的不同
  16.     if text != @text or align != @align
  17.       self.contents.clear
  18.       self.contents.font.color = normal_color
  19.   #  text.gsub!(/\\C\[([0-9]+)\]/i) { "\x01[#{$1}]" }
  20.   #  loop do
  21.   #    c = text.slice!(/./m)
  22.   #    case c
  23.   #    when nil
  24. #      break
  25. #      when "|"
  26. #       @text_pos[:x] = 0
  27.   #      @text_pos[:y] += 24
  28. #     when "\x01"
  29. #       text.sub!(/\[([0-9]+)\]/, "")
  30. #       self.contents.font.color = text_color($1.to_i)
  31. #       next
  32. #     else
  33. #       self.contents.font.color = normal_color
  34. #     end
  35. #   end
  36.       # 初始化文本数组
  37.       @text_array = text.split("")
  38.       #记录文本位置
  39.       @text_pos = {:x=>0,:y=>0}
  40.       @text = text
  41.       @align = align
  42.       @actor = nil
  43.     end
  44.     self.visible = true
  45.   end
  46.   #--------------------------------------------------------------------------
  47.   # ● 逐个字开始描绘
  48.   #--------------------------------------------------------------------------
  49.   def play_onetext
  50.   tx = @text_array.shift  #获取并删除文字数组第一个字。
  51.   cw = contents.text_size(tx).width #获取描绘这个字需要的宽度。
  52.   if @text_pos[:x] + cw > Helpset::Width_MAX   #如果描绘的坐标X加上宽度超过 xxx ,就换行。
  53.       @text_pos[:x] = 0
  54.       @text_pos[:y] += 24    #假如行距是 32 。
  55.   end
  56.   self.contents.draw_text(@text_pos[:x], @text_pos[:y], cw, 32, tx)  #描绘这个文字。
  57.   @text_pos[:x] += cw   #宽度累加。
  58. end
  59.   #--------------------------------------------------------------------------
  60.   # ● 刷新
  61.   #--------------------------------------------------------------------------
  62.   def update
  63.   play_onetext if @text_array && @text_array.size > 0 && Graphics.frame_count % Helpset::Move == 0
  64.   end
  65. end

这是没加转义符的例图:

但为什么加了转义符之后帮助窗口就不显示内容了?


难道是我的写法出了什么问题吗?
请前辈们帮助我,指导我,谢谢。

作者: 百里_飞柳    时间: 2018-4-7 22:53
本帖最后由 百里_飞柳 于 2018-4-7 22:54 编辑
  1. #--------------------------------------------------------------------------
  2. # ● 逐个字开始描绘
  3. #--------------------------------------------------------------------------
  4. def play_onetext
  5.   tx = @text_array.shift  #获取并删除文字数组第一个字。
  6.   cw = contents.text_size(tx).width #获取描绘这个字需要的宽度。
  7.   if @text_pos[:x] + cw > Helpset::Width_MAX   #如果描绘的坐标X加上宽度超过 xxx ,就换行。
  8.       @text_pos[:x] = 0
  9.       @text_pos[:y] += 24    #假如行距是 32 。
  10.   end
  11.   self.contents.draw_text(@text_pos[:x], @text_pos[:y], cw, 32, tx)  #描绘这个文字。
  12.   @text_pos[:x] += cw   #宽度累加。
  13. end
复制代码

你这里是把文字拆成了一个个的字符并进行绘制,而如果你想加入转义符的话,那就再在这之间加入个判定
以及,你这个split后的 \  符号变成什么了,是 \\ 还是 \e ,如果字符串是 '' 形式,则为 \\,否则我ruby里测试是自动替换成 \e
  1. #--------------------------------------------------------------------------
  2. # ● 逐个字开始描绘
  3. #--------------------------------------------------------------------------
  4. def play_onetext
  5.   tx = @text_array.shift  #获取并删除文字数组第一个字。

  6.   if tx == '\e' # 此处修改成你字符串中 \ 符号变更
  7.     # 读取出转义符
  8.     t_ = ''; code = ""
  9.     while t_ != '['
  10.       code += t_
  11.       t_ = @text_array.shift
  12.     end
  13.     # 读取出方括号内参数
  14.     t_ = ''; param = ""
  15.     while t_ != ']'
  16.       param += t_
  17.       t_ = @text_array.shift
  18.     end
  19.     # 分析
  20.     case code
  21.     when "c"
  22.       self.contents.font.color = text_color(param.to_i)
  23.     end
  24.     return # 防止绘制转义符
  25.   end

  26.   cw = contents.text_size(tx).width #获取描绘这个字需要的宽度。
  27.   if @text_pos[:x] + cw > Helpset::Width_MAX   #如果描绘的坐标X加上宽度超过 xxx ,就换行。
  28.       @text_pos[:x] = 0
  29.       @text_pos[:y] += 24    #假如行距是 32 。
  30.   end
  31.   self.contents.draw_text(@text_pos[:x], @text_pos[:y], cw, 32, tx)  #描绘这个文字。
  32.   @text_pos[:x] += cw   #宽度累加。
  33. end
复制代码

当然这只是抛砖引玉,只考虑了有[]传入参数的转义符,具体你可以自己尝试,仿照默认的window message绘制也可以




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