本帖最后由 RaidenInfinity 于 2016-12-18 23:41 编辑
def adjust_pop_message(text = " ") return unless SceneManager.scene_is?(Scene_Map) unless @event_pop_id if $imported["YEA-MessageSystem"] adjust_message_window_size end return end n_line = cal_number_line(text) text = text.split("\n").each{|s| s.gsub!(/\\\w*\[\w\]|\n/i,'')}.sort_by!{|s| s.length}.pop n_line = YSE::POP_MESSAGE::LIMIT[:limit_line] if YSE::POP_MESSAGE::LIMIT[:limit_line] > 0 && cal_number_line(text) > YSE::POP_MESSAGE::LIMIT[:limit_line] @real_lines = n_line self.height = fitting_height(n_line) self.width = cal_width_line(text) + 24 #<- 增加这个数字来调整后面的距离(如果不顺眼) self.width += new_line_x if self.width > YSE::POP_MESSAGE::LIMIT[:limit_width] && YSE::POP_MESSAGE::LIMIT[:limit_width] > 0 self.width = YSE::POP_MESSAGE::LIMIT[:limit_width] end create_contents update_placement end
def adjust_pop_message(text = " ")
return unless SceneManager.scene_is?(Scene_Map)
unless @event_pop_id
if $imported["YEA-MessageSystem"]
adjust_message_window_size
end
return
end
n_line = cal_number_line(text)
text = text.split("\n").each{|s| s.gsub!(/\\\w*\[\w\]|\n/i,'')}.sort_by!{|s| s.length}.pop
n_line = YSE::POP_MESSAGE::LIMIT[:limit_line] if YSE::POP_MESSAGE::LIMIT[:limit_line] > 0 && cal_number_line(text) > YSE::POP_MESSAGE::LIMIT[:limit_line]
@real_lines = n_line
self.height = fitting_height(n_line)
self.width = cal_width_line(text) + 24 #<- 增加这个数字来调整后面的距离(如果不顺眼)
self.width += new_line_x
if self.width > YSE::POP_MESSAGE::LIMIT[:limit_width] && YSE::POP_MESSAGE::LIMIT[:limit_width] > 0
self.width = YSE::POP_MESSAGE::LIMIT[:limit_width]
end
create_contents
update_placement
end
将adjust_pop_message替换成上面这个方法。基本上实测后发现你的这份脚本(应该是加了ace message之后出的事),adjust_pop_message中代入的参数(text)不是一行一行的而是一整段文字。比如如果两行123,text会是"123\n123"。
你会遇到那样的问题是因为 gsub! (移除控制符的方法)在 cal_new_line (计算行数的方法)的上面,结果行数计算出了问题。
但是直接把gsub!改到在cal_new_line下面会造成更屌的问题,就是比如两行123,那么行数计算的时候会是算123123的,结果就两倍长度了。
大概这就是你在搜索之前遇到的问题。我解决那帖(控制符导致长度误判)时是基于Pop Message本身罢了,因为当时实际测试时得出的就是那样的结果。
那么这次我的解决原理是:
text = text.split("\n").each{|s| s.gsub!(/\\\w*\[\w\]|\n/i,'')}.sort_by!{|s| s.length}.pop
这行看起来超级难懂,不过我可以一一解释。
首先text.split("\n")是把一个文字,根据分割符来生成数组,比如 12345\n123\n1234 会生成 ["12345","123","1234"] 这个数组。
生成了数组之后,我直接在后面调用each(迭代循环数组内的内容),用gsub!来移除控制符(比如颜色)。
下一个就是sort_by!,按照字的长度来排序(顺序)。于是上述的数组会变成["123","1234","12345"]
最后就是pop方法,用于移除并返回数组内的最后一个内容,也就是最长的"12345"。
那么下面的cal_width_line(text)就能得出正确的文字长度了。在新工程(然后复制Scripts.rvdata2)内实测有效。
脚本是非常神奇的事物。如果有能力的话,还请粗略地学下。本区置顶的汉化版F1帮助文档可以提供充足的脚本知识。 |