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

Project1

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

[已经解决] 求助bug,yanfly的物品提示窗口

[复制链接]

Lv1.梦旅人

梦石
0
星屑
155
在线时间
38 小时
注册时间
2022-12-8
帖子
3
跳转到指定楼层
1
发表于 2022-12-27 21:40:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
在draw_item那里我重新写了下,想让文本居中,但是现在情况是每次清空后,文本就对不齐了,会往左偏一点,有没有大佬知道这是为啥
就是这两句:363行
temp=(YEA::EVENT_WINDOW::WINDOW_WIDTH-text_size(item).width)/2+24
draw_text_ex(temp, rect.y, item)

其实我就是想让文本居中下
  1. #==============================================================================
  2. #
  3. # ▼ Yanfly Engine Ace - 得失提示 v1.01
  4. # -- 最后更新: 2011.12.27
  5. # -- 使用难度: 简单, 普通
  6. # -- 需要脚本: 无
  7. #
  8. #==============================================================================

  9. $imported = {} if $imported.nil?
  10. $imported["YEA-EventWindow"] = true

  11. #==============================================================================
  12. # ▼ Updates
  13. # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  14. # 2011.12.27 - Bug Fixed: Used the wrong script to hide event window.
  15. # 2011.12.26 - Started Script and Finished.
  16. #
  17. #==============================================================================
  18. # ▼ 介绍
  19. # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  20. # 可以在得到或失去物品武器金钱等时,在画面左下角显示一个得失提示窗口。
  21. #
  22. #==============================================================================
  23. # ▼ 安装方式
  24. # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  25. # 打开脚本编辑器,将本脚本拷贝/复制到一个在▼ 插件脚本之下▼ Main之上的新
  26. # 脚本页/槽中.记得保存你的工程以使脚本生效.
  27. #
  28. # -----------------------------------------------------------------------------
  29. # 脚本 - 可使用的脚本.
  30. # -----------------------------------------------------------------------------
  31. # event_window_add_text(文本)
  32. # 以得失提示窗口的方式显示"文本"的脚本. 使用 \n 来分行.如果你想用文本代码,记得
  33. # 将单斜杠改为双斜杠,类似: \\n[2] 或 \\c[3] .
  34. #
  35. # event_window_clear_text
  36. # 消除全部得失提示窗口的脚本,可以在切换地图时使用.
  37. #
  38. #==============================================================================
  39. # ▼ 兼容性
  40. # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  41. # 本脚本仅为RPG Maker VX Ace编写.极不可能在无任何修改的情况下运行于RPG Maker VX.
  42. #
  43. #==============================================================================

  44. module YEA
  45.   module EVENT_WINDOW
  46.    
  47.     #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  48.     # - 得失提示窗口的开关 -
  49.     #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

  50.     HIDE_SWITCH = 24       # 开关开启时,关闭得失提示窗口的功能.
  51.    
  52.     #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  53.     # - 通用得失提示窗口设置 -
  54.     #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

  55.     NEW_MAP_CLEAR = true    # 是否在进入一个新地图前清空所有得失提示窗口?
  56.     WINDOW_WIDTH  = 640     # 得失提示窗口的宽度.
  57.     VISIBLE_TIME  = 180     # 在消失前等待的时间,即显示时间(帧).
  58.     MAX_LINES     = 1       # 显示的最大行数.
  59.     WINDOW_FADE   = 6       # 淡出速率.
  60.    
  61.     #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  62.     # - 得失提示窗口文本设置 -
  63.     #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

  64.     HEADER_TEXT = "\e}- "                # 文字开头文本.
  65.     FOUND_TEXT  = "\ec[6]获得\ec[0] "     # 获得的文本.
  66.     LOST_TEXT   = "\ec[4]失去\ec[0] "     # 失去的文本.
  67.     AMOUNT_TEXT = "×%s"                  # 数量的前缀.
  68.     CLOSER_TEXT = " -"                   # 文字结尾文本.
  69.    
  70.   end # EVENT_WINDOW
  71. end # YEA

  72. #==============================================================================
  73. # ▼ 编辑以下内容可能会出现电脑损坏、死机,电脑主人脑袋爆炸、昏迷、死亡或口臭
  74. # 所以编辑了后果自负。
  75. #==============================================================================

  76. #==============================================================================
  77. # ■ Switch
  78. #==============================================================================

  79. module Switch
  80.   
  81.   #--------------------------------------------------------------------------
  82.   # self.hide_event_window
  83.   #--------------------------------------------------------------------------
  84.   def self.hide_event_window
  85.     return false if YEA::EVENT_WINDOW::HIDE_SWITCH <= 0
  86.     return $game_switches[YEA::EVENT_WINDOW::HIDE_SWITCH]
  87.   end
  88.    
  89. end # Switch

  90. #==============================================================================
  91. # ■ Numeric
  92. #==============================================================================

  93. class Numeric
  94.   
  95.   #--------------------------------------------------------------------------
  96.   # new method: group_digits
  97.   #--------------------------------------------------------------------------
  98.   unless $imported["YEA-CoreEngine"]
  99.   def group; return self.to_s; end
  100.   end # $imported["YEA-CoreEngine"]
  101.    
  102. end # Numeric

  103. #==============================================================================
  104. # ■ Game_Temp
  105. #==============================================================================

  106. class Game_Temp
  107.   
  108.   #--------------------------------------------------------------------------
  109.   # public instance variables
  110.   #--------------------------------------------------------------------------
  111.   attr_accessor :event_window_data
  112.   
  113.   #--------------------------------------------------------------------------
  114.   # new method: add_event_window_data
  115.   #--------------------------------------------------------------------------
  116.   def add_event_window_data(text)
  117.     @event_window_data = [] if @event_window_data.nil?
  118.     return if text == ""
  119.     @event_window_data.push(text)
  120.   end
  121.   
  122.   #--------------------------------------------------------------------------
  123.   # new method: clear_event_window_data
  124.   #--------------------------------------------------------------------------
  125.   def clear_event_window_data
  126.     @event_window_data = []
  127.   end
  128.   
  129. end # Game_Temp

  130. #==============================================================================
  131. # ■ Game_Interpreter
  132. #==============================================================================

  133. class Game_Interpreter
  134.   
  135.   #--------------------------------------------------------------------------
  136.   # alias method: command_126
  137.   #--------------------------------------------------------------------------
  138.   alias game_interpreter_command_125_ew command_125
  139.   def command_125
  140.     game_interpreter_command_125_ew
  141.     value = operate_value(@params[0], @params[1], @params[2])
  142.     event_window_make_gold_text(value)
  143.   end
  144.   
  145.   #--------------------------------------------------------------------------
  146.   # alias method: command_126
  147.   #--------------------------------------------------------------------------
  148.   alias game_interpreter_command_126_ew command_126
  149.   def command_126
  150.     game_interpreter_command_126_ew
  151.     value = operate_value(@params[1], @params[2], @params[3])
  152.     event_window_make_item_text($data_items[@params[0]], value)
  153.   end
  154.   
  155.   #--------------------------------------------------------------------------
  156.   # alias method: command_127
  157.   #--------------------------------------------------------------------------
  158.   alias game_interpreter_command_127_ew command_127
  159.   def command_127
  160.     game_interpreter_command_127_ew
  161.     value = operate_value(@params[1], @params[2], @params[3])
  162.     event_window_make_item_text($data_weapons[@params[0]], value)
  163.   end
  164.   
  165.   #--------------------------------------------------------------------------
  166.   # alias method: command_128
  167.   #--------------------------------------------------------------------------
  168.   alias game_interpreter_command_128_ew command_128
  169.   def command_128
  170.     game_interpreter_command_128_ew
  171.     value = operate_value(@params[1], @params[2], @params[3])
  172.     event_window_make_item_text($data_armors[@params[0]], value)
  173.   end
  174.   
  175.   #--------------------------------------------------------------------------
  176.   # new method: event_window_make_gold_text
  177.   #--------------------------------------------------------------------------
  178.   def event_window_make_gold_text(value)
  179.     return unless SceneManager.scene_is?(Scene_Map)
  180.     return if Switch.hide_event_window
  181.     if value > 0
  182.       text = YEA::EVENT_WINDOW::FOUND_TEXT
  183.     elsif value < 0
  184.       text = YEA::EVENT_WINDOW::LOST_TEXT
  185.     else; return
  186.     end
  187.     text += sprintf("%s%s", value.abs.group, Vocab::currency_unit)
  188.     event_window_add_text(text)
  189.   end
  190.   
  191.   #--------------------------------------------------------------------------
  192.   # new method: event_window_make_item_text
  193.   #--------------------------------------------------------------------------
  194.   def event_window_make_item_text(item, value)
  195.     return unless SceneManager.scene_is?(Scene_Map)
  196.     return if Switch.hide_event_window
  197.     if value > 0
  198.       text = YEA::EVENT_WINDOW::FOUND_TEXT
  199.     elsif value < 0
  200.       text = YEA::EVENT_WINDOW::LOST_TEXT
  201.     else; return
  202.     end
  203.     text += sprintf("\ei[%d]%s", item.icon_index, item.name)
  204.     if value.abs > 1
  205.       fmt = YEA::EVENT_WINDOW::AMOUNT_TEXT
  206.       text += sprintf(fmt, value.abs.group)
  207.     end
  208.     event_window_add_text(text)
  209.   end
  210.   
  211.   #--------------------------------------------------------------------------
  212.   # new method: event_window_add_text
  213.   #--------------------------------------------------------------------------
  214.   def event_window_add_text(text)
  215.     return unless SceneManager.scene_is?(Scene_Map)
  216.     return if Switch.hide_event_window
  217.     text = YEA::EVENT_WINDOW::HEADER_TEXT + text
  218.     text += YEA::EVENT_WINDOW::CLOSER_TEXT
  219.     SceneManager.scene.event_window_add_text(text)
  220.   end
  221.   
  222.   #--------------------------------------------------------------------------
  223.   # new method: event_window_clear_text
  224.   #--------------------------------------------------------------------------
  225.   def event_window_clear_text
  226.     $game_temp.clear_event_window_data
  227.   end
  228.   
  229. end # Game_Interpreter

  230. #==============================================================================
  231. # ■ Window_EventWindow
  232. #==============================================================================

  233. class Window_EventWindow < Window_Selectable
  234.   
  235.   #--------------------------------------------------------------------------
  236.   # initialize
  237.   #--------------------------------------------------------------------------
  238.   def initialize
  239.     dw = YEA::EVENT_WINDOW::WINDOW_WIDTH
  240.     super((Graphics.width-dw)/2,0, dw, fitting_height(YEA::EVENT_WINDOW::MAX_LINES))
  241. #~     self.x -= 12
  242.     self.opacity = 0
  243.     self.contents_opacity = 0
  244.     @visible_counter = 0
  245.     modify_skin
  246.     deactivate
  247.   end
  248.   
  249.   #--------------------------------------------------------------------------
  250.   # modify_skin
  251.   #--------------------------------------------------------------------------
  252.   def modify_skin
  253.     dup_skin = self.windowskin.dup
  254.     dup_skin.clear_rect(64,  0, 64, 64)
  255.     dup_skin.clear_rect(64, 64, 32, 32)
  256.     self.windowskin = dup_skin
  257.   end
  258.   
  259.   #--------------------------------------------------------------------------
  260.   # item_max
  261.   #--------------------------------------------------------------------------
  262.   def item_max
  263.     return $game_temp.event_window_data ? $game_temp.event_window_data.size : 1
  264.   end
  265.   
  266.   #--------------------------------------------------------------------------
  267.   # update
  268.   #--------------------------------------------------------------------------
  269.   def update
  270.     super
  271.     self.visible = show_window?
  272.     update_visible_counter
  273.     update_contents_opacity
  274.   end
  275.   
  276.   #--------------------------------------------------------------------------
  277.   # show_window?
  278.   #--------------------------------------------------------------------------
  279.   def show_window?
  280.     return false if $game_message.visible
  281.     return true
  282.   end
  283.   
  284.   #--------------------------------------------------------------------------
  285.   # update_visible_counter
  286.   #--------------------------------------------------------------------------
  287.   def update_visible_counter
  288.     return if @visible_counter <= 0
  289.     @visible_counter -= 1
  290.   end
  291.   
  292.   #--------------------------------------------------------------------------
  293.   # update_contents_opacity
  294.   #--------------------------------------------------------------------------
  295.   def update_contents_opacity
  296.     return if @visible_counter > 0
  297.     return if self.contents_opacity <= 0
  298.     self.contents_opacity -= YEA::EVENT_WINDOW::WINDOW_FADE
  299.   end
  300.   
  301.   #--------------------------------------------------------------------------
  302.   # instant_hide
  303.   #--------------------------------------------------------------------------
  304.   def instant_hide
  305.     @visible_counter = 0
  306.     self.contents_opacity = 0
  307.   end
  308.   
  309.   #--------------------------------------------------------------------------
  310.   # add_text
  311.   #--------------------------------------------------------------------------
  312.   def add_text(text)
  313.     $game_temp.add_event_window_data(text)
  314.     refresh
  315.     self.contents_opacity = 255
  316.     @visible_counter = YEA::EVENT_WINDOW::VISIBLE_TIME
  317. #~     change_y_position
  318.     select(item_max - 1)
  319.   end
  320.   
  321.   #--------------------------------------------------------------------------
  322.   # change_y_position
  323.   #--------------------------------------------------------------------------
  324.   def change_y_position
  325.     maximum = [item_max, YEA::EVENT_WINDOW::MAX_LINES].min
  326.     self.y = Graphics.height - fitting_height(maximum) - 12
  327.   end
  328.   
  329.   #--------------------------------------------------------------------------
  330.   # refresh
  331.   #--------------------------------------------------------------------------
  332.   def refresh
  333.     create_contents
  334.     draw_all_items
  335.   end
  336.   
  337.   #--------------------------------------------------------------------------
  338.   # draw_item
  339.   #--------------------------------------------------------------------------
  340.   def draw_item(index)
  341.     $game_temp.clear_event_window_data if $game_temp.event_window_data.nil?
  342.     item = $game_temp.event_window_data[index]
  343.     return if item.nil?
  344.     rect = item_rect(index)
  345.     draw_background(rect)
  346.     temp=(YEA::EVENT_WINDOW::WINDOW_WIDTH-text_size(item).width)/2+24
  347.     draw_text_ex(temp, rect.y, item)
  348.   end
  349.   
  350.   #--------------------------------------------------------------------------
  351.   # draw_background
  352.   #--------------------------------------------------------------------------
  353.   def draw_background(rect)
  354.     back_colour1 = Color.new(0, 0, 0, 192)
  355.     back_colour2 = Color.new(0, 0, 0, 0)
  356.     temp_rect=rect.clone
  357.     temp_rect.width /= 2
  358.     contents.gradient_fill_rect(temp_rect, back_colour2, back_colour1)
  359.     temp_rect.x+=temp_rect.width
  360.     contents.gradient_fill_rect(temp_rect, back_colour1, back_colour2)
  361.   end
  362.   
  363. end # Window_EventWindow

  364. #==============================================================================
  365. # ■ Scene_Map
  366. #==============================================================================

  367. class Scene_Map < Scene_Base
  368.   
  369.   #--------------------------------------------------------------------------
  370.   # alias method: create_all_windows
  371.   #--------------------------------------------------------------------------
  372.   alias scene_map_create_all_windows_event_window create_all_windows
  373.   def create_all_windows
  374.     scene_map_create_all_windows_event_window
  375.     create_event_window
  376.   end
  377.   
  378.   #--------------------------------------------------------------------------
  379.   # new method: create_event_window
  380.   #--------------------------------------------------------------------------
  381.   def create_event_window
  382.     @event_window = Window_EventWindow.new
  383.   end
  384.   
  385.   #--------------------------------------------------------------------------
  386.   # new method: event_window_add_text
  387.   #--------------------------------------------------------------------------
  388.   def event_window_add_text(text)
  389.     @event_window.add_text(text)
  390.   end
  391.   
  392.   #--------------------------------------------------------------------------
  393.   # alias method: post_transfer
  394.   #--------------------------------------------------------------------------
  395.   alias scene_map_post_transfer_ew post_transfer
  396.   def post_transfer
  397.     $game_temp.clear_event_window_data if YEA::EVENT_WINDOW::NEW_MAP_CLEAR
  398.     @event_window.instant_hide
  399.     scene_map_post_transfer_ew
  400.   end
  401.   
  402. end # Scene_Map

  403. #==============================================================================
  404. #
  405. # ▼ End of File
  406. #
  407. #==============================================================================
复制代码

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
20965
在线时间
9334 小时
注册时间
2012-6-19
帖子
7106

开拓者短篇九导演组冠军

2
发表于 2022-12-27 23:21:48 | 只看该作者
本帖最后由 喵呜喵5 于 2022-12-27 23:28 编辑

text_size 不会处理转义符
text_size 计算文字尺寸时是不会处理这些转义符的,它会简单粗暴的直接根据文字的原始内容计算尺寸
因此第一个bug 是你用 text_size 计算出来的文字实际宽度是不准确的
bug 的影响就是你以为计算的结果可以让文字能保证居中,实际转义符多了位置偏左偏右都有可能

draw_text_ex 会修改窗口后续所有文本的字体大小
在 draw_text_ex 的文本中,遇到 \{ 时会让对应字体大小缩小,你配置的提示文本用到了这个特性。文字大小变化靠的是修改当前窗口的 contents.font.size 属性来实现的
因为 draw_text_ex 最开始都会调用 reset_font_settings 将字体的尺寸恢复为初始值保证每次绘制相同内容的结果都是一样的所以普通代码这样做没问题
但是在还没恢复初始值时你调用了 text_size ,而 text_size 是根据 contents.font.size 来计算文字宽度的结果的
所以,在 draw_text_ex 前加入一段代码:p contents.font.size 就会注意到:窗口在输出第一段提示的时候和输出后续几段提示的时候当前字体大小实际上不一样的,
因此就是你游戏里的表现在相同的提示文本下,第一段的位移和其他几段不一样

为什么是每次清空后文本就对不齐了
因为每次清空后会调用 refresh 方法,会删掉当前窗口的 content 新创建一个,相当于将字体大小恢复为初始值

解决方向
提供以下四种思路你自己挑个简单的:
1. 在 draw_text_ex 后面手动加上 reset_font_settings 重置一下字体大小,这样每次调用 text_size 时当前窗口的字体大小都是一致的了,然后大家就都是歪的了(喂)
2. 不使用 \{ ,而是直接在 create_contents 后面加上 contents.font.size = XXX 来手动设置字体大小,保证每次调用 text_size 时当前窗口的字体大小都是一致的
3. CLOSER_TEXT 里加上 \} 把文字尺寸复原回来
4. 自己写一个能正确处理转义符的 text_size 方法,参考我这脚本的 207 行 https://script.miaowm5.com/post/1 (我看了眼,代码实现太复杂了还是别参考了)(喂)
实现思路实际上就是在一个透明窗口上调用 draw_text_ex 绘制完文字后,看绘制完文字时的光标位置,从而得出实际的文字长度
回复 支持 1 反对 0

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
20965
在线时间
9334 小时
注册时间
2012-6-19
帖子
7106

开拓者短篇九导演组冠军

3
发表于 2022-12-27 23:33:25 | 只看该作者
题外话:
这脚本的功能我没看懂,为啥就显示获得1个物品却需要把所有获得的物品都记录下来,并且每次获得物品还用全部都描绘一遍
这要是一直不触发切换地图自动清空的行为而疯狂获得物品,游戏不就炸了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
155
在线时间
38 小时
注册时间
2022-12-8
帖子
3
4
 楼主| 发表于 2022-12-28 10:33:39 | 只看该作者
喵呜喵5 发表于 2022-12-27 23:21
text_size 不会处理转义符
text_size 计算文字尺寸时是不会处理这些转义符的,它会简单粗暴的直接根据文字 ...

感谢喵佬
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-29 15:43

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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