Project1

标题: 求助,求一个显示姓名框的脚本 [打印本页]

作者: kikou酱    时间: 2019-9-10 10:14
标题: 求助,求一个显示姓名框的脚本
如题,想要做到下图这种效果
立绘脚本用的是又一立绘对话框,但是姓名框搜了好几遍没找到能用的,不是报错就是冲突,来求一个,谢谢各位

3ID6_~~2P}CUVY2OT{RWJ`6.png (71.46 KB, 下载次数: 35)

3ID6_~~2P}CUVY2OT{RWJ`6.png

作者: 百里_飞柳    时间: 2019-9-10 10:37
咳,我觉得很难不冲突,推荐就按又一对话框的帖子里那种做法,第一行写名称,后三行写对话吧
毕竟不要因为这个其实没人在意的东西卡住制作……
作者: kikou酱    时间: 2019-9-10 10:38
百里_飞柳 发表于 2019-9-10 10:37
咳,我觉得很难不冲突,推荐就按又一对话框的帖子里那种做法,第一行写名称,后三行写对话吧
毕竟不要因为 ...

但是按这个来有的时候写旁白第一行还是会出现中括号并且更改颜色,就很苦恼了
作者: KB.Driver    时间: 2019-9-10 22:24
本帖最后由 KB.Driver 于 2019-9-10 22:28 编辑

本人脚本盲,捣鼓了半天做了个比较差的Demo,希望站里的脚本大神(当然包括脚本原作者)手下留情。。
直接在新建工程里测试的,效果见下面gif。

原版效果

增加小窗

其他测试


使用方法:显示文字时,写<说话人的名字/> ,如


脚本:(插入原脚本之下、main之上)
RUBY 代码复制
  1. #encoding=utf-8
  2. #
  3. # YAWMP+ - NameWindow by Calendar99
  4. # Version: 1.0.0
  5. # Time: 2019.9.10
  6. #
  7. # 依存关系:
  8. #   需要插入YAWMP(Yet Another Window Message with Portrait)之下、main之上
  9. #
  10. # 使用方法:
  11. #   事件中显示文字时,写<说话人的名字/>
  12. #   则显示时会出现"说话人的名字"的姓名窗口
  13. #   另外,若该姓名是作为单独一行存在的,文字会自动删除空行
  14. #
  15. # 问题报告:
  16. #   未支持文字的缩放带来的窗口大小与绘制位置变化
  17. #
  18.  
  19. module CLD99
  20.   module YAWMP_PATCH
  21.  
  22.     # 直接禁用名字识别功能(推荐禁用)
  23.     #   禁用 = true 启用 = false
  24.     #
  25.     FORBID_NAME_SYSTEM = true
  26.  
  27.     # 姓名框 X 坐标微调
  28.     #   正整数 = 往右   负整数 = 往左
  29.     X_OFFSET = 0
  30.  
  31.     # 姓名框 Y 坐标微调
  32.     #   正整数 = 往下   负整数 = 往上
  33.     Y_OFFSET = 4
  34.  
  35.   end
  36. end
  37.  
  38. class Game_Message
  39.   attr_accessor :talker          # 用于姓名框显示
  40.   attr_accessor :name_window_pos # 用于姓名框位置
  41.  
  42.   # [别名修改]清除
  43.   #
  44.   alias clear_for_yawmp_name_window clear
  45.   def clear
  46.     clear_for_yawmp_name_window # 原方法
  47.     @talker = ''
  48.     @name_window_pos = {}
  49.   end
  50.  
  51.   # [别名修改]添加内容
  52.   #
  53.   alias add_for_yawmp_name add
  54.   def add(text)
  55.     text = text.sub(/<(.*)\/>\n?/, '')
  56.     @talker = $1 if $1
  57.     @texts.push(text) unless text.empty?
  58.   end
  59. end
  60.  
  61. class Window_Message
  62.  
  63.   # [别名修改]生成所有窗口
  64.   #
  65.   alias create_all_windows_for_yawmp_name_window create_all_windows
  66.   def create_all_windows
  67.     create_all_windows_for_yawmp_name_window    # 原方法
  68.     @name_window = CLD99::Window_Name.new(self) # 生成姓名窗口
  69.   end
  70.  
  71.   # [别名修改]更新所有窗口
  72.   #
  73.   alias update_all_windows_for_yawmp_name_window update_all_windows
  74.   def update_all_windows
  75.     update_all_windows_for_yawmp_name_window    # 原方法
  76.     @name_window.update                         # 更新姓名窗口
  77.   end
  78.  
  79.   # [别名修改]翻页处理
  80.   #
  81.   alias new_page_for_yawmp_name_window new_page
  82.   def new_page(text, pos)
  83.     new_page_for_yawmp_name_window(text, pos)   # 原方法
  84.     $game_message.name_window_pos = pos.dup     # 传递位置
  85.   end
  86.  
  87.   # [别名修改]打开窗口
  88.   #
  89.   alias open_for_yawmp_name_window open
  90.   def open
  91.     open_for_yawmp_name_window                  # 原方法
  92.     name = $game_message.talker
  93.     if name && !name.empty?                     # 需要姓名窗口
  94.       @name_window.refresh
  95.       @name_window.open.activate
  96.     end
  97.   end
  98.  
  99.   # [别名修改]关闭窗口
  100.   #
  101.   alias close_for_yawmp_name_window close
  102.   def close
  103.     close_for_yawmp_name_window                 # 原方法
  104.     @name_window.close
  105.   end
  106.  
  107.   # [覆盖]处理所有内容
  108.   #
  109.   def process_all_text
  110.     text = convert_escape_characters $game_message.all_text
  111.     skin_id = YAWMP.get_variable YAWMP::Dialogbox[:var_skin]
  112.     if @background.zero? # normal background
  113.       #unless YAWMP.get_switch YAWMP::Name[:swi_disable]    # 原来的条件
  114.       if !YAWMP.get_switch(YAWMP::Name[:swi_disable]) &&    # 此处修改了条件
  115.          !CLD99::YAWMP_PATCH::FORBID_NAME_SYSTEM            #
  116.         ls = text.split "\n"
  117.         if ls[0] && !ls[0].empty?
  118.           ldeco = YAWMP::Name[:deco][0]
  119.           rdeco = YAWMP::Name[:deco][1]
  120.           color = YAWMP::Name[:color][:default]
  121.           YAWMP::Name[:color][:name].each do |name, ncolor|
  122.             if name.is_a? String
  123.               if ls[0].start_with? name
  124.                 color = ncolor
  125.                 break
  126.               end
  127.             elsif name.is_a? Regexp
  128.               if ls[0].match name
  129.                 color = ncolor
  130.                 break
  131.               end
  132.             end
  133.           end
  134.           YAWMP::Name[:color][:face].each do |face, fcolor|
  135.             if face.is_a? String
  136.               if $game_message.face_name.downcase.start_with? face.downcase
  137.                 color = fcolor
  138.                 break
  139.               end
  140.             elsif face.is_a? Regexp
  141.               if $game_message.face_name.match face
  142.                 color = fcolor
  143.                 break
  144.               end
  145.             end
  146.           end
  147.           YAWMP::Name[:skin][:name].each do |name, nskin|
  148.             if name.is_a? String
  149.               if ls[0].start_with? name
  150.                 skin_id = nskin
  151.                 break
  152.               end
  153.             elsif name.is_a? Regexp
  154.               if ls[0].match name
  155.                 skin_id = nskin
  156.                 break
  157.               end
  158.             end
  159.           end
  160.           YAWMP::Name[:skin][:face].each do |face, fskin|
  161.             if face.is_a? String
  162.               if $game_message.face_name.downcase.start_with? face.downcase
  163.                 skin_id = fskin
  164.                 break
  165.               end
  166.             elsif face.is_a? Regexp
  167.               if $game_message.face_name.match face
  168.                 skin_id = fskin
  169.                 break
  170.               end
  171.             end
  172.           end
  173.           ls[0] = "\e>\ec[#{color}]#{ldeco}#{ls[0]}#{rdeco}\ec[0]"
  174.           text = ls.join "\n" + "\s" * YAWMP::Name[:indent]
  175.         end
  176.       end
  177.     end
  178.     load_dialogbox skin_id
  179.     #open_and_wait # 将open_and_wait运行的位置由此处往后推迟了两行
  180.     pos = {}
  181.     new_page text, pos
  182.     open_and_wait
  183.     process_character(text.slice!(0, 1), text, pos) until text.empty?
  184.   end
  185. end
  186.  
  187. class CLD99::Window_Name
  188.  
  189.   # 方法代理
  190.   #
  191.   [:update, :convert_escape_characters, :text_size,
  192.    :open, :close].each do |symbol|
  193.     define_method symbol do |*args|
  194.       @window.send(symbol, *args)
  195.     end   
  196.   end
  197.  
  198.   # 初始化
  199.   #
  200.   def initialize(message_window)
  201.     @message_window = message_window
  202.     @window_bag = {} # 容纳窗口的哈希
  203.     # 自身并不是窗口,在内部包含窗口
  204.     init_window(window_width, window_height)
  205.   end
  206.  
  207.   # 生成内部窗口
  208.   #
  209.   def init_window(width, height)
  210.     if @window                             # 需要处理先前窗口
  211.       openness = @window.openness
  212.       @window.visible = false              # 隐藏窗口
  213.       @window.contents.clear               # 清除文本
  214.     else
  215.       openness = 0
  216.     end
  217.  
  218.     if @window_bag[[width, height]]          # 已有同属性窗口
  219.       @window = @window_bag[[width, height]] # 取出窗口
  220.       @window.visible = true                 # 显示窗口
  221.     else
  222.       @window = Window_Base.new(0, 0, width, height)
  223.       @window_bag[[width, height]] = @window # 将此窗口按属性储存
  224.     end
  225.  
  226.     @window.openness = openness
  227.     @window.deactivate
  228.   end
  229.  
  230.   # 边距尺寸
  231.   #
  232.   def padding
  233.     return 12
  234.   end
  235.  
  236.   # 获取窗口的宽度
  237.   #
  238.   def window_width(text_width = 136)
  239.     return text_width + padding * 2
  240.   end
  241.  
  242.   # 获取窗口的高度
  243.   #
  244.   def window_height(line_height = 24)
  245.     visible_line_number = 1
  246.     return line_height * visible_line_number + padding * 2
  247.   end
  248.  
  249.   # 刷新
  250.   #
  251.   def refresh
  252.     return raise "@window illegal" if !@window || !@window.is_a?(Window)
  253.     return if (name = $game_message.talker).empty?
  254.     return if (pos = $game_message.name_window_pos).empty?
  255.     line_height = 24
  256.     name = convert_escape_characters(name) # 处理控制文字
  257.     text_width = text_width(name)
  258.     if pos[:height] != line_height || @window.width != text_width
  259.       # 大小不匹配 重新创建窗口
  260.       init_window(window_width(text_width), window_height(pos[:height]))
  261.     end
  262.     @window.x = pos[:x] + padding + CLD99::YAWMP_PATCH::X_OFFSET # 决定窗口X坐标
  263.     @window.y = @message_window.y - @window.height + CLD99::YAWMP_PATCH::Y_OFFSET
  264.     # 绘制名字
  265.     process_all_text(pos, name)
  266.   end
  267.  
  268.   # 文字宽度
  269.   #
  270.   def text_width(original_text)
  271.     text = original_text.dup
  272.     icon_number = 0
  273.     text.gsub!(/\e/, "\\")                             # 恢复出转义符
  274.     text.gsub!(/\\I\[\d+\]/i){ icon_number += 1; ''}   # 消除图标并统计数量
  275.     text.gsub!(/\\(?:[\{\}\$\.\|!<>\^\\]|[A-Z]+)(?:\[\d+\])?/i, '') # 清除控制符,便于准确测量长度
  276.     @window.text_size(text).width + icon_number * 24
  277.   end
  278.  
  279.   # 绘制名字(总体)
  280.   #
  281.   def process_all_text(pos, text)
  282.     pos[:x] = 0 # 文字绘制前x坐标清零
  283.     @window.contents.clear
  284.     @window.reset_font_settings
  285.     process_character(text.slice!(0, 1), text, pos) until text.empty?
  286.   end
  287.  
  288.   # 绘制名字(单个)
  289.   #
  290.   def process_character(c, text, pos)
  291.     case c
  292.     when "\r", "\n", "\f" # 无事发生
  293.     else
  294.       @window.process_character(c, text, pos)
  295.     end
  296.   end
  297. end

作者: kikou酱    时间: 2019-9-11 07:44
KB.Driver 发表于 2019-9-10 22:24
本人脚本盲,捣鼓了半天做了个比较差的Demo,希望站里的脚本大神(当然包括脚本原作者)手下留情。。
直接 ...

谢谢大佬!ww




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