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

Project1

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

[原创发布] [新手教程]文字自动换行

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
55
在线时间
323 小时
注册时间
2010-8-21
帖子
666
跳转到指定楼层
1
发表于 2011-2-19 10:07:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
[教程]文字自动换行
    新手请进 高手勿笑

# 有一句打错了位子了 抱歉 #

当然看这篇教程之前,自己要会写点脚本

本教程是针对游戏中窗口显示文字自动换行的思路及脚本.
比如写个帮助窗口1行显示不完,比较郁闷...

写之前当然要知道字符串有半角符号(比如数学书上的句号.),
和全角符号(比如语文书上的句号。)。半角符号占1字节,
全角符号(及中文符号)占3字节(UTF-8 文字编码,杯具的3字节,
一直以为是2字节)

RMXP默认字体大小为22号,也就是说一个汉字占22像素,一个半角英文
字符占11像素....

不过这都是废话...

好,废话再说点...文字自动换行思路是把一段长字符串拆成数组(Array),再靠小循环写上去,怎么拆?

比如
text = "66RPG"

有个String的方法 scan(re) (自己F1)
使用正则表达式 re 反复对字符串进行匹配操作,并以数组的形式返回匹配成功的子字符串。
正则表达式什么的在这不会涉及...只要符合正则表达式它会自动写到数组,很方便的说...
代表所有字符的是 /./
text = "66RPG"
print text.scan(/./) => ["6","6","R","P","G"]
嘿嘿,好邪恶...

把一段长字符串按1行能排多少拆写上去,怎么办
Bitmap类有个方法 text_size(text).width 返回字符串text的像素长度
这个后面说...知道这个就好了

好,正式开工!

在脚本栏找到Window_Help后,复制,再更名为Window_Help2:
7(行) class Window_Help2 < Window_Base
为方便测试,窗口大小改为640*480:
12     super(0, 0, 640, 480)
再把定义的 set_text 清空(21..31行删完)

理论上一行能排 640 - 32 - 4 * 2 字符长度(单位:像素)
640是窗口长度(self.width),32是窗口擦去的( Bitmap.new(width - 32, height - 32) )
4*2是左右各保留4像素(美观...?)

所以,在 set_text 下写到
line_width = self.width - 32 - 4 * 2
没忘记浏览(scan....)吧?
text_array = text.scan(/./)

有数组我就喜欢用for让 i 周游列国
不过先再建个空字符,及行数
temp_text= ""
lines = 0
for i in 0...text_array.size
  if self.contents.text_size(temp_str+text_array).width > line_width
    self.contents.draw_text(4, line*32, line_width , 32, temp_str)
    temp_str = ""
    line += 1
  end
  if i == text_array.size - 1
    self.contents.draw_text(4, line*32, line_width , 32, temp_str+text_array)
  end
  temp_str += text_array
# 竟然打错了,不知道误导了谁没,这句应该在这
end
大功告成!本教程结束...

那是不可能的,还没解释...

for i in 0...text_array.size
让 i 从0开始 到 text_array数组组数(不包括) 周游一下

if self.contents.text_size(temp_str+text_array
).width > line_width
当一排放不下时刻画字符串时...

self.contents.draw_text(4, line*32, line_width , 32, temp_str)
刻画字符串, y值是行数,1行32像素...

temp_str = ""
line += 1
清空待用字符串及行数+1,不用详细解释

temp_str += text_array
,追加字符串
为什么最后追加?
如果已经判定 > line_width 时,为时已晚,你懂的

if i == text_array.size - 1
当 i 已经周游完毕时再刻画(最后的)字符串

当然,有个小问题,当同时满足这2个条件时会出现bug,
但是理论上应该不会同时满足,这个bug不存在
但在写其他脚本的时候注意这一点,多用next

总结一下
用temp_str代表这行准备写的字符串
看看temp_str加上下一个字符串(但是没有真正加到temp_str上)是否超出长度
超出就把temp_str写下来,清空,行数+1准备写下1行
在末尾真正地加上"下一个字符串"
当然,如果是最后一行,直接写上去
先拆后组
好,完整代码如下:(就几行,我废话太多了...)

RUBY 代码复制
  1. #==============================================================================
  2. # ■ Window_Help2
  3. #==============================================================================
  4.  
  5. class Window_Help2 < Window_Base
  6.   #--------------------------------------------------------------------------
  7.   # ● 初始化对像
  8.   #--------------------------------------------------------------------------
  9.   def initialize
  10.     super(0, 0, 640, 480)
  11.     self.contents = Bitmap.new(width - 32, height - 32)
  12.   end
  13.   #--------------------------------------------------------------------------
  14.   # ● 设置文本
  15.   #     text  : 窗口显示的字符串
  16.   #--------------------------------------------------------------------------
  17.   def set_text(text)
  18.     line_width = self.width - 32 - 4 * 2
  19.     text_array = text.scan(/./)
  20.     temp_str = ""
  21.     line = 0
  22.     for i in 0...text_array.size
  23.       if self.contents.text_size(temp_str+text_array).width > line_width
  24.         self.contents.draw_text(4, line*32, line_width , 32, temp_str)
  25.         temp_str = ""
  26.         line += 1
  27.       end
  28.       if i == text_array.size - 1
  29.         self.contents.draw_text(4, line*32, line_width , 32, temp_str+text_array)
  30.       end
  31.       temp_str += text_array # 竟然打错了,不知道误导了谁没,这句应该在这
  32.     end
  33.   end
  34. end


当然要测试测试:

RUBY 代码复制
  1. class Scene_Temp
  2.   def main
  3.     Window_Help2.new.set_text("六6RPG 半角RP,全角G,只是测试而已! "*10)
  4.     Graphics.transition
  5.     loop do
  6.       Graphics.update
  7.     end
  8.   end
  9. end


地图调用
$scene = Scene_Temp.new 就可以了,当然,以上代码需插在Main前

好了,差不多了,第1次写教程,别骂我就行(貌似没有教什么东东)....

点评

Scene_Temp是什么  发表于 2011-2-19 11:52
>>猛戳>>MetalSagaR游戏主页<<这里<<
欢迎提供您的意见

Lv2.观梦者

梦石
0
星屑
574
在线时间
169 小时
注册时间
2008-10-29
帖子
431
2
发表于 2011-2-19 13:59:00 | 只看该作者
本帖最后由 clap_pl 于 2011-2-19 13:59 编辑

嗯 受教了 学到东西了 非常感谢
废话不多
写教程一定要把看教程的人当成什么都不懂的傻瓜(我不介意)
娓娓道来
再次感谢
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-28 21:58

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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