| 赞 | 20 |
| VIP | |
| 好人卡 | |
| 积分 | 13 |
| 经验 | |
| 最后登录 | 2019-7-17 |
| 在线时间 | 995 小时 |
- 梦石
- 0
- 星屑
- 1297
- 在线时间
- 995 小时
- 注册时间
- 2014-12-14
- 回帖
- 2939

|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
本帖最后由 Vortur 于 2018-3-30 17:16 编辑
[fold=前言]
本文试图探讨RGSS3文字显示的内容,阅读结束后,读者应该可以用代码实现“显示文字”
当文字过多时,常常发生字符宽度出错的情况:
;本文之后,希望大家都能愉快地解决这个问题
下一集我们讨论《输入部件》
[/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] |
|