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

Project1

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

[已经解决] 关于Yami的pop message的问题

[复制链接]

Lv2.观梦者

梦石
0
星屑
251
在线时间
252 小时
注册时间
2013-11-9
帖子
97
跳转到指定楼层
1
发表于 2016-12-18 15:25:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 泪的苍白 于 2016-12-18 22:34 编辑

在pop message的基础上增加了二楼的Ace Message System:https://rpg.blue/forum.php?mod=viewthread&tid=381977
使用的pop message版本为这个:https://github.com/suppayami/rmv ... 20Pop%20Message.txt
出现空格的问题我首先在6R搜索了一下,发现了这个: 關於 Pop Message 的問題 - RPG Maker VX Ace 提问区 - 66RPG - Powered by Discuz!
但是根据二楼的修改仍然没有解决这个问题。
于是……在我抛弃了使用Ace Message System的\n<>字符显示之后,恢复了正常。
但是:如果我在输入以下文字:
【NPC】
我就是来打酱油的。\bm[1]

也就是在一号事件上面显示文字,但是会先出现:
【NPC】
再出现:
我就是来打酱油的。
↑分两次对话出现。
所以……如何解决这个问题。
另外关于fuki脚本,因为我找不到资源,之前找到一个在站里发过的,但是因为被其修改过,所以也用不起来……不知道会不会比pop更好用,如果pop的问题无法解决,有fuki脚本的人是否能发一份原版或者给一份链接?(请尽量不要翻墙OTL)

Scripts.zip

179.87 KB, 下载次数: 85

点评

scripts已上传  发表于 2016-12-18 22:38
如果可以的话还请提供工程或者Scripts.rvdata2,以便实测。可能是插件脚本的冲突也可能是自行改的时候搞砸了东西。  发表于 2016-12-18 16:09

评分

参与人数 1星屑 +50 收起 理由
VIPArcher + 50 结贴

查看全部评分

头像来自百度搜索,自改了一(小)部分。

Lv4.逐梦者 (版主)

梦石
0
星屑
6901
在线时间
7028 小时
注册时间
2013-11-2
帖子
1344

开拓者剧作品鉴家

2
发表于 2016-12-18 23:40:11 | 只看该作者
本帖最后由 RaidenInfinity 于 2016-12-18 23:41 编辑


RUBY 代码复制
  1. def adjust_pop_message(text = " ")
  2.     return unless SceneManager.scene_is?(Scene_Map)
  3.     unless @event_pop_id
  4.       if $imported["YEA-MessageSystem"]
  5.         adjust_message_window_size
  6.       end
  7.       return
  8.     end
  9.     n_line = cal_number_line(text)
  10.     text = text.split("\n").each{|s| s.gsub!(/\\\w*\[\w\]|\n/i,'')}.sort_by!{|s| s.length}.pop
  11.     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]
  12.     @real_lines = n_line
  13.     self.height = fitting_height(n_line)
  14.     self.width = cal_width_line(text) + 24 #<- 增加这个数字来调整后面的距离(如果不顺眼)
  15.     self.width += new_line_x
  16.     if self.width > YSE::POP_MESSAGE::LIMIT[:limit_width] && YSE::POP_MESSAGE::LIMIT[:limit_width] > 0
  17.       self.width = YSE::POP_MESSAGE::LIMIT[:limit_width]
  18.     end
  19.     create_contents
  20.     update_placement
  21.   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帮助文档可以提供充足的脚本知识。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
251
在线时间
252 小时
注册时间
2013-11-9
帖子
97
3
 楼主| 发表于 2016-12-20 01:54:17 | 只看该作者
本帖最后由 泪的苍白 于 2016-12-20 01:55 编辑
RaidenInfinity 发表于 2016-12-18 23:40
def adjust_pop_message(text = " ")
    return unless SceneManager.scene_is?(Scene_Map)
    unles ...


抱歉,回复迟了。学生党可以上网的时间不是很多,另外再次耽误您的一些时间。
首先非常感谢您详细地解答,经过测试已经成功了,虽然使用\n<>的呼出名称窗口导致的空格还是存在……不过抛弃掉就好了。
脚本稍微懂一点,不过也只是简单地会在原始脚本或他人写好的脚本上修改一点东西,而像对话/战斗这类脚本,因为并不熟悉,我修改起来就比较有心无力。之前使用的工具是XP,因为部分原因才转到VA的,发现RGSS3跟RGSS差别实在有点大……
看了您的解决原理之后,想再次请教您一些问题。
一、
gsub!(/\\\w*\[\w\]|\n/i,'')
这一段,是否可以类比于XP对话脚本中的
  1.                         # 为了方便、将 "\\\\" 变换为 "\000"
  2.                         text.gsub!(/\\\\/) { "\000" }
  3.                         # "\\C" 变为 "\001" 、"\\G" 变为 "\002"
  4.                         text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
  5.                         text.gsub!(/\\[Gg]/) { "\002" }
复制代码
这些部分呢?(因为对XP更熟悉一点,所以原谅我用XP做类比吧OTL 虽然这些脚本的意思我也并不是很懂- -)
二、“迭代循环”去搜了一下但不是很能理解,不知道是否可以举例说明一下?
头像来自百度搜索,自改了一(小)部分。
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
6901
在线时间
7028 小时
注册时间
2013-11-2
帖子
1344

开拓者剧作品鉴家

4
发表于 2016-12-20 09:24:15 | 只看该作者
本帖最后由 RaidenInfinity 于 2016-12-20 09:25 编辑

RGSS3毕竟是第三代,代码更精简更整洁了。是非常容易上手的。(我个人看到XP脚本只能说头疼啊啊啊)

我修改了一下,因为发现一点小错误,主要是多了一个*,原理下面会说到

  1. text = text.split("\n").each{|s| s.gsub!(/\\\w*\[\w*\]/i,'')}.sort_by!{|s| s.length}.pop
复制代码


迭代(反复运用同一个函数运算),在ruby里一般指for, each, times之类的方法。
例子:[1,2,3,4].each{|i| p i} #=> 控制台会显示1 2 3 4 (有分行)

gsub 是String(字符串)的内建方法,用于替换字符。你应该会奇怪为啥有些方法后面有加感叹号(!)。
后缀!的方法会对原数据造成“破坏性的改动”。(Array的sort!,select!等也是同个道理)
例子: text = text.gsub("1","2") 和 text.gsub!("1,","2") 效果是一样的,而后者比较短。

gsub支持直接的字符串搜寻或者正则表达式搜寻。正则表达式在置顶汉化版F1帮助文档的附录内有粗略说明。

那么/\\\w*\[\w*\]/的意思是什么呢?
首先正则表达式必须由/ /开头和结尾。在编辑器内颜色会变成紫色。
把里面的东西拆开来是这样:
\\ -> 对应一个 \ 符号 (特殊符号如 \ < > [ ] 必须前缀一个\来对应该符号本身
\w* -> 寻找并跳过任何字符,直到遇见下一个目标字符
\[ -> 对应一个 [ 符号
\w*  -> 寻找并跳过任何字符,直到遇见下一个目标字符
\] -> 对应一个 ] 符号

(|\n被移除了,因为我意识到split已经吃掉了\n,不再需要处理了。这也是为啥名字框会出问题,因为本来\n是预留给换行符的,而该脚本作者没有考量到吧)

所以很明显 如果我有 \c[123],\对应\\,c对应\w*, [ 对应 \[, 123对应\w*,]对应\]

正则表达式还有个用途就是取出字符串里的值,这又是另一回事了。(可以看帮助文档附录)

点评

实际上我需要等另一位版主来处理。  发表于 2016-12-24 10:46
唔0 0版主,问题已经解决了XD你可以把帖子的分类设置为已经解决了ww  发表于 2016-12-24 10:08
大致上明白了><非常感谢您耐心的解答!帮了大忙~  发表于 2016-12-21 14:33

评分

参与人数 2星屑 +115 梦石 +1 收起 理由
VIPArcher + 100 + 1 认可答案
泪的苍白 + 15 塞糖w表达谢意~

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-17 01:49

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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