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

Project1

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

[已经解决] 请问如何让Window_Help中的文字分行

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
28 小时
注册时间
2008-12-23
帖子
35
跳转到指定楼层
1
发表于 2015-7-13 00:44:21 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

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

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

x

如图,我把Window_Help的大小变了一下,从640,64变成了160,480.希望能借此扩宽它的文字范围。
但是问题马上来了,文字仍然只有刚开始一行,这导致稍长一点的文字就只能显示前面一小部分,而不会分到下一行。
求问如何让Window_Help中的文字每六个字就分一行,急求各位大师解决。
我的游戏我自己做

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

10
发表于 2015-7-14 09:01:54 | 只看该作者
风清翔 发表于 2015-7-13 21:00
顺便附送修改后的脚本,希望能帮上后来者一点小忙。

首先自己解决问题了可喜可贺,接下来我们就说说'\n'的问题。
'\n'原本是一个字符,表示的是换行符,很多语言里面都有这个约定。但是,在RMXP的物品“说明”一栏中,是不支持这种转义符的书写的,如果你在“说明”的框里面写'\n'的话,它会被拆成两个字符'\'和'n',而不是作为'\n'的一个整体看待。因此,你将数据库中物品说明载入到脚本中时,'\'在脚本中的表示方法是'\\',后面再跟一个'n',连起来就是你看到的'\\n'。所以,如果把split中的参数改为"\\n"的话,脚本就变成了识别"\n"的draw_text,而不是识别换行符'\n'(在这里注意二者的区别)的draw_text。原有脚本没有考虑到数据库不支持'\n'的表示方法,因此需要做改动。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
28 小时
注册时间
2008-12-23
帖子
35
9
 楼主| 发表于 2015-7-13 21:00:49 | 只看该作者
  1. class Bitmap
  2.   alias :draw_text2 :draw_text unless defined? draw_text2
  3.   def draw_text(*args)
  4.     case  args.size
  5.     when 2
  6.       rect = args[0]
  7.       text = args[1].split("\\n")
  8.       align = 0
  9.     when 3
  10.       rect = args[0]
  11.       text = args[1].split("\\n")
  12.       align = args[2]%3
  13.     when 5
  14.       rect = Rect.new(*(args[0,4]))
  15.       text = args[4].split("\\n")
  16.       align = 0
  17.     when 6
  18.       rect = Rect.new(*(args[0,4]))
  19.       text = args[4].split("\\n")
  20.       align = args[5]%3
  21.     else
  22.       raise ArgumentError,"错误的参数个数(#{args.size} to 2,3,5,6)."
  23.     end
  24.     return if text.empty?
  25.     wmax = [text.map{|t| self.text_size(t).width}.max,rect.width].min
  26.     h = self.text_size(text[0]).height
  27.     hmax = [h*text.size,rect.height].min
  28.     y = rect.y+(rect.height-hmax)/2
  29.     x = align==0 ? rect.x : align==2 ? rect.x+rect.width-wmax : rect.x+(rect.width-wmax)/2
  30.     text.each_with_index{|t,i|
  31.       draw_text2(x,y+i*h,wmax,h,t,align)
  32.     }
  33.     self
  34.   end
  35. end
复制代码
顺便附送修改后的脚本,希望能帮上后来者一点小忙。
我的游戏我自己做
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
28 小时
注册时间
2008-12-23
帖子
35
8
 楼主| 发表于 2015-7-13 20:58:50 | 只看该作者

好吧各位,我自己解决了……
用的是3L给的https://rpg.blue/thread-330587-1-1.html
但是似乎因为这脚本不适合我的1。03的XP,或者说不适合帮助窗口,所以需要一定程度的修改。
首先,第二行的第三个冒号一定要去掉,不然必定报错。
然后这时候测试的话,虽然不报错了,但是\n的换行效果却没有

我偶然想到会不会是split("\n")这里出了问题,于是,我在Window_Help的draw_text前加上了这样一行:
p text.split("\n")
然后我看到了这个:

我注意到一个细节:似乎因为某种原因,在帮助栏里的“\n”变成了“\\n”
然后我试了试 p text.split("\\n")

……
我立刻明白了:在数据库的介绍栏里所打的文字,其中的“\n”不知因为何种原因被替换成了“\\n”,导致\n无法分行
受到这个启发,我立刻把换行脚本里的“\n”全部替换成了“\\n”

于是……就成功了……
总之感谢各位的帮助,一波三折之下终于结束了这脑浆炸裂的旅程,也算可喜可贺吧233
我的游戏我自己做
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
28 小时
注册时间
2008-12-23
帖子
35
7
 楼主| 发表于 2015-7-13 18:30:55 | 只看该作者
kuerlulu 发表于 2015-7-13 14:07
https://rpg.blue/thread-330587-1-1.html
无脑的识别换行符draw_text

前两个冒号去了还是没用,仍然报错,我把三个冒号都去了试试,不报错了,但是没有分行效果

点评

说实在,这脚本是不是不适合用在XP上……  发表于 2015-7-13 18:32
我的游戏我自己做
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
28 小时
注册时间
2008-12-23
帖子
35
6
 楼主| 发表于 2015-7-13 18:22:42 | 只看该作者
kuerlulu 发表于 2015-7-13 14:07
https://rpg.blue/thread-330587-1-1.html
无脑的识别换行符draw_text


哪里复制错了吗?

点评

你把第二行的头两个冒号去掉试试  发表于 2015-7-13 18:28
我的游戏我自己做
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
28 小时
注册时间
2008-12-23
帖子
35
5
 楼主| 发表于 2015-7-13 18:16:57 | 只看该作者
wolves 发表于 2015-7-13 01:53
首先我们换行习惯用/n
所以在处理字符串换行的时候要用到split
把一个字符串分割成多个字符串的数组,每个 ...

经测试无效……不知道为什么
我的游戏我自己做
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
28 小时
注册时间
2008-12-23
帖子
35
4
 楼主| 发表于 2015-7-13 18:09:40 | 只看该作者
kuerlulu 发表于 2015-7-13 14:07
https://rpg.blue/thread-330587-1-1.html
无脑的识别换行符draw_text


这个有问题……

点评

我自己测试没问题呀 你确定复制对了?  发表于 2015-7-13 18:10
我的游戏我自己做
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
76
在线时间
1379 小时
注册时间
2012-7-5
帖子
1698

开拓者

3
发表于 2015-7-13 14:07:06 | 只看该作者
https://rpg.blue/thread-330587-1-1.html
无脑的识别换行符draw_text

评分

参与人数 1星屑 +150 收起 理由
RyanBern + 150 认可答案

查看全部评分


  -fk: -azogi:
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
155
在线时间
332 小时
注册时间
2013-7-6
帖子
356
2
发表于 2015-7-13 01:53:58 | 只看该作者
首先我们换行习惯用/n
所以在处理字符串换行的时候要用到split
把一个字符串分割成多个字符串的数组,每个元素都是一行的文字。
  1. def set_text(text, align = 0)
  2.     # 如果文本和对齐方式的至少一方与上次的不同
  3.     if text != @text or align != @align
  4.       # 再描绘文本
  5.       self.contents.clear
  6.       self.contents.font.color = normal_color
  7.       self.contents.draw_text(4, 0, self.width - 40, 32, text, align)
  8.       @text = text
  9.       @align = align
  10.       @actor = nil
  11.     end
  12.     self.visible = true
  13.   end
复制代码
这是help里的显示文字部分

我们在帮助里查找到draw_text相关的如下资料:
  1. draw_text(x, y, width, height, str[, align])
  2. draw_text(rect, str[, align])
  3. 在该位图的矩形(x,y,width,height)或 rect(Rect)中描绘字符串 str。

  4. 如果文本的长度超过矩形的宽度的话,则自动缩放为 60% 再描绘。

  5. 水平方向默认为左对齐,但是当 align 指定为 1 时为居中对齐,指定为 2 时为右对齐。垂直方向则总为居中对齐。

  6. 这个处理需要花费时间,尽量不要在每 1 帧中重描绘字符串。

复制代码
也就是说我们不能直接通过一个draw_text来实现多行文本。
所以我们要进行分割后循环
  1. def set_text(text, align = 0)
  2.     # 如果文本和对齐方式的至少一方与上次的不同
  3.     if text != @text or align != @align
  4.       # 再描绘文本
  5.       a=text.split("/n")
  6.       self.contents.clear
  7.       self.contents.font.color = normal_color
  8.       b=0#记录行数
  9.       a.each do |i|#循环输出
  10.         self.contents.draw_text(4, 32*b, self.width - 40, 32, i, align)
  11.         b+=1
  12.       end
  13.       @text = text
  14.       @align = align
  15.       @actor = nil
  16.     end
  17.     self.visible = true
  18.   end
复制代码
电脑没有电了,没进行测试- -

点评

无论是\n还是/n都无效……  发表于 2015-7-13 19:30
显示文章的时候总有人喜欢这么用,所以我就这么设定了,严格来讲是应该用\n  发表于 2015-7-13 19:25
没测试也不至于把 \n 打成 /n 吧……  发表于 2015-7-13 13:31

评分

参与人数 1星屑 +90 收起 理由
RyanBern + 90 塞糖

查看全部评分

偶是熬夜学编程的傻子
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-28 20:02

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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