扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 100|回复: 0

[转载发布] [新手教程]文字自动换行

[复制链接]
累计送礼:
0 个
累计收礼:
0 个
  • TA的每日心情
    开心
    昨天 18:01
  • 签到天数: 114 天

    连续签到: 4 天

    [LV.6]常住居民II

    2339

    主题

    404

    回帖

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    6
    卡币
    10635
    OK点
    16
    推广点
    0
    同能卷
    0
    积分
    13406

    灌水之王

    发表于 2024-4-19 19:23:35 | 显示全部楼层 |阅读模式
    [教程]文字自动换行
        新手请进 高手勿笑

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

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

    本教程是针对游戏中窗口显示文字自动换行的思路及脚本.
    比如写个帮助窗口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. class Window_Help2 < Window_Base
    5.   #--------------------------------------------------------------------------
    6.   # ● 初始化对像
    7.   #--------------------------------------------------------------------------
    8.   def initialize
    9.     super(0, 0, 640, 480)
    10.     self.contents = Bitmap.new(width - 32, height - 32)
    11.   end
    12.   #--------------------------------------------------------------------------
    13.   # ● 设置文本
    14.   #     text  : 窗口显示的字符串
    15.   #--------------------------------------------------------------------------
    16.   def set_text(text)
    17.     line_width = self.width - 32 - 4 * 2
    18.     text_array = text.scan(/./)
    19.     temp_str = ""
    20.     line = 0
    21.     for i in0...text_array.size
    22.       ifself.contents.text_size(temp_str+text_array).width > line_width
    23.         self.contents.draw_text(4, line*32, line_width , 32, temp_str)
    24.         temp_str = ""
    25.         line += 1
    26.       end
    27.       if i == text_array.size - 1
    28.         self.contents.draw_text(4, line*32, line_width , 32, temp_str+text_array)
    29.       end
    30.       temp_str += text_array # 竟然打错了,不知道误导了谁没,这句应该在这
    31.     end
    32.   end
    33. end
    复制代码


    当然要测试测试:

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


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

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

                 本帖来自P1论坛作者沙漠点灰,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=167993  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。

    送花

    喜欢

    晕倒

    路过

    雷人

    得意

    丢鸡蛋

    高兴
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2025-3-15 15:18 , Processed in 0.144562 second(s), 53 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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