查看: 4054|回复: 3

[已经过期] 字符宽度 文字宽度 字符尺寸 文字尺寸 文字挤 文字压缩

[复制链接]
梦石
0
星屑
1297
在线时间
995 小时
注册时间
2014-12-14
回帖
2939

开拓者

发表于 2018-3-30 18:11:43 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 Vortur 于 2018-3-30 17:16 编辑

[fold=前言]
  本文试图探讨RGSS3文字显示的内容,阅读结束后,读者应该可以用代码实现“显示文字”
  当文字过多时,常常发生字符宽度出错的情况: 201150y5x6tzs6jbv6k68f.png ;本文之后,希望大家都能愉快地解决这个问题
  下一集我们讨论《输入部件》



  [/fold]
正文
[fold=两种字符绘制方式]

RM中,共有【两种】字符绘制方式(它们都通过“bitmap”来绘制字符):
  1. 用“Window”类的名为“contents”的属性生成“bitmap”,再用“contents”调用“draw_text”方法绘制字符
  对于“Window”类的“contents”属性,【F1帮助文档】的描述是:“窗口内容位图(Bitmap)的引用”
  在代码中,用“某window类的实例.contents = Bitmap.new(1, 1)”这类方式创建位图,然后直接使用“contents.draw_text(x坐标, y坐标, 宽, 高, 文字内容, 对齐方式)”绘制字符
  我们可以用“p contents.methods”知道“contents”中都有哪些方法;但无法知道“contents”源码是怎样的。其中,“rect”方法或许是字符压缩的罪魁祸首:或许当字符宽度大于“rect”时,它就将被压缩。此外,“contents”拥有“fill_rect”方法,就像“Sprite实例.bitmap.fill_rect”一样使用。

  2. 用“Sprite”类的名为“bitmap”的属性直接生成“bitmap”,再用“bitmap”调用“draw_text”方法绘制字符
  对于“Sprite”类的“bitmap”属性,【F1汉化文档】的描述是:“精灵传输元位图(Bitmap)的引用;”
  在代码中,用“某Sprite的实例.bitmap = Bitmap.new(1,1)”这类方式创建位图,然后用“Sprite的实例.bitmap.draw_text(x坐标, y坐标, 宽, 高, 文字内容, 对齐方式)”绘制字符




  [/fold][fold=draw_text]

draw_text有两种写法:
  draw_text(x坐标, y坐标, 宽, 高, 文字内容, 对齐方式)
  draw_text(矩形, 文字内容, 对齐方式)



draw_text有如下特点:
  1. “文字内容”若不是字符串对象,则会自动转换成字符串
  2. 若文字长度超过区域的宽度,文字宽度会自动缩小到 60%(#这里“区域宽度”的含义不明,或许指的是“bitmap”的矩形“rect”)
  这应该就是字符宽度错误的原因
  3. “对齐方式”有两种设置
  “0”表示居左,“1”为居中,“2”是 居右;垂直方向总是居中对齐




  [/fold]下面我们以“Sprite”、“bitmap”、“draw_text”为切入点,开始代码的编写
[fold=一、【p】]
  首先,勾选“菜单栏”中,“测试”工具中,“显示主控制台”项。对左边这些名词陌生的话,可以戳【这里】,嘿嘿嘿...更基础的教程在哪里呢...
  然后,删除“脚本编辑器”中的所有条目
  最后,新建空白条目,写下这些代码:
[pre lang="ruby"]
module StageManager
        class << self
                def run
                        p 1
                        rgss_stop
                end
        end
end
rgss_main { StageManager.run }  #  运行一遍“SceneManager”模块中,“run”方法
  [/pre]或者写下这些代码:[pre lang="ruby"]
module StageManager
        def self.run
                p 1
                rgss_stop
        end
end
rgss_main { StageManager.run }  #  运行一遍“SceneManager”模块中,“run”方法
  [/pre]  对于RM,当进入游戏后,程序将加载脚本编辑器中的脚本;当加载到“rgss_main { StageManager.run }”语句时,游戏正式开始运作。所以,“rgss_main { StageManager.run } ”必须放在所有代码之后
  “StageManager”是一个模块,模块的定义由“module”开始,到对应的“end”为止。“模块”中方法的定义与“类”不同:要么将所有方法都写在“class << self”与“end”之间,要么将所有的方法名前都写一个“self.”
  “run”是一个方法,方法的定义由“def”开始,到对应的“end”为止
  “class << self”是啥在下也不清楚,这种写法可以大面积省略“def”后的“self.”字段
  “p”表示在控制台显示数值“1”,关于这个语句,请务必牢记,今后的排错,就全靠它啦❤
  “rgss_stop”表示暂停程序的运行



  [/fold][fold=二、显示字符]
  首先,删除“p 1”
  然后,在“StageManager”模块的“run”方法中,“rgss_stop”的前面写下这些代码:[pre lang="ruby"]
actor = Sprite.new
actor.bitmap = Bitmap.new(60,60)
actor.bitmap.draw_text(0,0,40,40,"a",1)
  [/pre]  “actor”是一个变量。变量就是“变量名”+“变量值”;对于上述代码,等号左边的为变量名,右边的为变量值
  写完这些,运行游戏,即可显示文字“a”了



  [/fold][fold=三、实例变量,类与实例]
  上文中,“actor”是一个局部变量,它只能在“同一个方法中”或“同一个代码块中”(代码块是什么,这里暂且不表)生效。若需让它跨越不同的方法生效,就需要用到【实例变量】了,实例变量就是局部变量前增加一个“@”
  如果将【实例】视为一件产品,那么【类】就是产品的图纸。而实例变量就是产品中的变量,同一类生成的不同实例中,同名实例变量的值可以不同。类需要通过“变量 = 类.new”的方式生成实例

  首先,删除第二步中增设的代码,在“run”方法中,写下“@actor = Sprite.new”
  然后,在“StageManager”中新建一个方法“creat_actor”,在其中写下“@actor.bitmap = Bitmap.new(60,60)”与“@actor.bitmap.draw_text(0,0,40,40,"a",1)”
  最后,在“run”方法中调用“creat_actor”;最终“StageManager”如下:[pre lang="ruby"]
module StageManager
        def self.run
                @actor = Sprite.new
                creat_actor
                rgss_stop
        end
        def self.creat_actor
                @actor.bitmap = Bitmap.new(60,60)
                @actor.bitmap.draw_text(0,0,40,40,"a",1)
        end
end
[/pre]  通过测试,字符“a”仍能成功显示;但若将所有“@”去掉,系统就会报错,这是因为局部变量无法跨越不同方法生效



  [/fold]
附录
[fold=字符与尺寸]
对于字符,共有四种尺寸:
  1. 精灵尺寸
  2. 位图尺寸
  3. 矩形尺寸
  4. 文字尺寸



这四种尺寸有【7】种组合方式要留意:
  精灵与位图;精灵尺寸无法直接操作;设置位图后,精灵尺寸自动置为位图大小
  精灵与矩形;精灵尺寸无法直接操作;设置矩形后,精灵尺寸自动置为矩形大小
  精灵-位图-矩形;如若位图与矩形不匹配,精灵尺寸遵从两者中最后修改的那个
  精灵与文字;无直接关系
  位图与矩形;位图设置后,矩形尺寸自动置为位图大小;矩形修改后,位图尺寸不受影响
  位图与文字;位图是文字的画板,位图过小文字将绘制不完整;文字有自己的绘制尺寸,若文字绘制尺寸大于位图,文字也会绘制不完整
  矩形与文字;矩形是文字的画板,两者关系同位图-文字



  [/fold][fold=工程文件]
你能找到这个文件的使用方法吗?❤
Scripts.zip (402 Bytes, 下载次数: 2)



[/fold]
【RMVA教程】
---------------------
欲买桂花同载酒,终不似,少年游.
梦石
0
星屑
34457
在线时间
5096 小时
注册时间
2012-11-19
回帖
4715

开拓者

发表于 2018-3-31 09:04:31 | 显示全部楼层
本帖最后由 芯☆淡茹水 于 2018-3-31 09:07 编辑

   嘛~, 个人觉得,写这类东西,最基本的首先应该是严谨一点,不然容易带偏别人。

随意截了2点:

1, 1.PNG
不管是 Window 还是 Sprite ,都是生成 Bitmap 对象来进行各种描绘,何来两种之说?
描绘功能和 Window 还是 Sprite 还是其它什么的,本身没有关系。只是 Bitmap 在干这事。
你这样区分为两种,别人还以为这俩的 Bitmap 有区别来着。
我家和你家不同,但是我家的平底锅和你家的平底锅功能一样,都能炒菜煎蛋,买新锅时都是生成的  平底锅.new  

2, 2.PNG
这个或许有人就有疑问了,那 居左 对齐是怎么搞的?
你这样叙述,不能很好的把对齐方式完整的阐述出来。
对齐方式:0 :居左对齐 ; 1 :居中对齐 ; 2 :居右对齐
                 缺省值是 0 。<省略对齐方式默认为 0(居左对齐)>

点评

嗯❤受教啦❤  发表于 2018-3-31 11:06
xp vx va mv  va mz 各类型脚本/插件定制
回复

使用道具 举报

梦石
0
星屑
1297
在线时间
995 小时
注册时间
2014-12-14
回帖
2939

开拓者

 楼主| 发表于 2018-3-31 22:45:25 | 显示全部楼层
本帖最后由 Vortur 于 2018-3-31 04:46 编辑
芯☆淡茹水 发表于 2018-3-30 15:04
嘛~, 个人觉得,写这类东西,最基本的首先应该是严谨一点,不然容易带偏别人。

随意截了2点:


这贴好冷啊
您好!
  “居左”的问题业已改正!谢谢!~
  关于“ Window 还是 Sprite ,都是生成 Bitmap 对象来进行各种描绘,何来两种之说”这条...是在下的疏漏,现已补上“两者殊途同归”,也谢谢您的赐教!~

P.S.在下记得,用过您的脚本呢!~膜拜ing...



  
【RMVA教程】
---------------------
欲买桂花同载酒,终不似,少年游.
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部