查看: 73|回复: 0

[转载发布] 【移植】VA中的draw_text_ex

[复制链接]
  • TA的每日心情
    开心
    2 小时前
  • 签到天数: 37 天

    连续签到: 3 天

    [LV.5]常住居民I

    2028

    主题

    32

    回帖

    7260

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    0
    卡币
    5184
    OK点
    16
    积分
    7260
    发表于 同元一千年八月六日(秋) | 显示全部楼层 |阅读模式
    @VIPArcher draw_text_ex已经成功在RMXP中存活。
    除了移植外,还增加了一点点新的东西在里面,同时也改了一些东西。
    会用VA的可以在XP中直接使用,用XP人看看说明书即可。如果还是有问题,请参考范例~
    效果图:

    范例:

    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 = 128unless 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 += 8if contents.font.size = 16
    194.   end
    195.   #--------------------------------------------------------------------------
    196.   # ● 计算行高
    197.   #     restore_font_size : 计算完成后是否恢复原本的字体尺寸?
    198.   #--------------------------------------------------------------------------
    199.   def calc_line_height(text, restore_font_size = true)
    200.     result = [32, contents.font.size].max
    201.     last_font_size = contents.font.size
    202.     text.slice(/^.*$/).scan(/\e[\{\}]/).eachdo |esc|
    203.       make_font_bigger  if esc == "\e{"
    204.       make_font_smaller if esc == "\e}"
    205.       result = [result, contents.font.size].max
    206.     end
    207.     contents.font.size = last_font_size if restore_font_size
    208.     result
    209.   end
    210.   #--------------------------------------------------------------------------
    211.   # ● 绘制图标
    212.   #     enabled : 有效的标志。false 的时候使用半透明效果绘制
    213.   #--------------------------------------------------------------------------
    214.   def draw_icon(icon_name, x, y, enabled = true)
    215.     bitmap = RPG::Cache.icon(icon_name)
    216.     rect = Rect.new(0, 0, 24, 24)
    217.     contents.blt(x, y+4, bitmap, rect, enabled ? 255 : 128)
    218.   end
    219. end
    复制代码

                 本帖来自P1论坛作者j296196585,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=374240  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。

    本帖子中包含更多资源

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

    x
    天天去同能,天天有童年!
    回复 论坛版权

    使用道具 举报

    ahome_bigavatar:guest
    ahome_bigavatar:welcomelogin
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2024-5-10 12:00 , Processed in 0.051394 second(s), 44 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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