本帖最后由 RaidenInfinity 于 2017-5-5 13:05 编辑
施工现场 - 4.2 位图,图像精灵,矩形
位图(Bitmap),又称点阵图,是使用像素阵列(Pixel array)来表示的图像。
什么是像素?像素就是图像显示的基本单位。一个点,一个颜色。
像素的英文叫Pixel。这是由图片(Picture)和元素(Element)的英文单词混合而成的。
那么我们可以将RM里面的位图理解成一个存着像素的二维数组。
如果不记得什么叫二维数组,那就请拉上去再看一次章节1.6。
像素也是位图大小的单位。假设我们有一个宽32像素,高32像素的图片,那么这个图片里面就有1024个像素。(32 * 32 = 1024)
再提醒一次:每一个像素也就是每个点都有一个颜色。
为什么我们要知道这个呢?这是非常重要的基础概念。图片越大,图片内像素的数量就越多,占的内存也就越大。
当然,对这个位图的操作(会在另一个部分里解说),需要的运算时间也就越长。
不过,现在我们暂时不深入讨论这些关于效率的问题。
在RMVA,创建位图(Bitmap)的方式有两种:
1. 从文件中读取,在解码后载入内存
2. 创建空的位图,全部像素的颜色值都是 (0, 0, 0, 0)
目前,我们只看前者。后者将在“位图操作”的部分进一步说明。
RMVA的F1帮助文档对Bitmap创建的说明是这样的:
Bitmap.new(filename) 载入由 filename 参数所指定的图像,生成一个 Bitmap 对象。 RGSS-RTP 和加密档案中的文件会自动搜索。扩展名可以省略。
Bitmap.new(filename)
载入由 filename 参数所指定的图像,生成一个 Bitmap 对象。
RGSS-RTP 和加密档案中的文件会自动搜索。扩展名可以省略。
简单来说就是用 Bitmap.new(文件名字) 来执行位图载入。
系统会自动寻找RTP文件,而且会读取加密档案。如果找不到怎么办呢?当然是报错啦!找不到文件的错误没看过吗?
还有一种情况下会报错,就是内存不足。(错误讯息是位图创建失败)内存不足怎么办呢?
一就是电脑该换了,二就是你载入了太多图片,内存撑不住了。
比如如果我要载入RTP里史莱姆的战斗图,要怎么办呢?首先,游戏的图像素材是存在Graphics文件夹里的。这我们都知道。
图像文件夹里又区分很多个文件夹。战斗图是Battlers。史莱姆是Slime.png。文件格式不需要加,所以Slime就好了。
因此,要载入这个图片,我们要这么写:
@bitmap = Bitmap.new("Graphics/Battlers/Slime")
@bitmap = Bitmap.new("Graphics/Battlers/Slime")
如果游戏未脱离RTP的话,系统会自动读取RTP的文件,所以能正常运行。
位图既然是图片,那么当然有宽度和高度这两个属性。分别用width和height这两个方法来获取。
啥?你想要修改?不行。位图创建了之后,宽和高是不能再修改的。
@bitmap = Bitmap.new("Graphics/Battlers/Slime") p @bitmap.width #输出:136 p @bitmap.height #输出:47
@bitmap = Bitmap.new("Graphics/Battlers/Slime")
p @bitmap.width #输出:136
p @bitmap.height #输出:47
如果我不想要这个位图了,也没有重复使用的可能性,怎么办?放着让它被垃圾回收机制处理吗?
RGSS3的Bitmap,说白了就是一个包裹着一段载入内存的位图的对象。
垃圾回收机制(参考章节2.7)的确可以处理它,但是我们不知道这个机制什么时候才会工作。
如果放任不管的话,什么时候内存满出来,出什么问题也说不定。
因此,Bitmap类提供了一个方法:dispose(释放),来手动清除位图所占用的内存,并弃用这个对象。
在释放之后,我们可以用disposed?(是否已释放)方法来检查这个位图的状况。
@bitmap = Bitmap.new("Graphics/Battlers/Slime") p @bitmap.disposed? #输出: false @bitmap.dispose p @bitmap.disposed? #输出: true
@bitmap = Bitmap.new("Graphics/Battlers/Slime")
p @bitmap.disposed? #输出: false
@bitmap.dispose
p @bitmap.disposed? #输出: true
如果一个Bitmap对象已经被释放,那么再次呼叫dispose是没有效果的。
现在你可能在纳闷:图片是加载了啊,可是怎么在屏幕上显示呢?
这么形容吧。如果屏幕是个墙壁,位图是个相片,那么我们需要一个相框来把相片挂上去展示。
RGSS3自带的这个“相框”名叫Sprite。我个人将它译名为“图像精灵”。(Sprite在英文的意思是精灵)
维基百科对Sprite的解释是:包含于场景中的二维图像或动画。“包含于场景中”是个重点。
假设现在你有一个Bitmap,存着你要在屏幕上显示的图片。你总得告诉系统,你要把这个图片挂到屏幕上的哪个地方啊,对吧?
Sprite的用途就是给系统指定如何显示一个Bitmap,提供显示的坐标,比例,角度,色调等参数。
创建Sprite的方式也有两个,不过目前我们只介绍第一种,没有参数的创建方法:Sprite.new 。
在创建一个Sprite之后,我们要修改它的bitmap变量,给它指定一个图片(Bitmap对象)让它显示。
注意:在下面的大部分关于图像显示的范例里面,我们会调用RGSS3內建的rgss_stop函数来定住画面,以免受到默认游戏系统的影响。
F1帮助文档对rgss_stop的解释:
rgss_stop 停止脚本的执行,只保留画面的刷新。 等效于下面这一句: loop { Graphics.update }
rgss_stop
停止脚本的执行,只保留画面的刷新。
等效于下面这一句:
loop { Graphics.update }
让我们直接尝试吧!将史莱姆的战斗图显示到屏幕上!
@bitmap = Bitmap.new("Graphics/Battlers/Slime") #载入史莱姆的战斗图 @sprite = Sprite.new #创建新的Sprite对象 @sprite.bitmap = @bitmap #指定要显示的Bitmap rgss_stop #停止所有脚本的运行,画面定格
@bitmap = Bitmap.new("Graphics/Battlers/Slime") #载入史莱姆的战斗图
@sprite = Sprite.new #创建新的Sprite对象
@sprite.bitmap = @bitmap #指定要显示的Bitmap
rgss_stop #停止所有脚本的运行,画面定格
效果:
哇哦哦!显示出来了!不过,为啥史莱姆在左上角啊?这当然啊。又没指定坐标,默认的位置就是左上角。
RGSS3(和大部分2D游戏)所使用的坐标系统是从左上角开始的。啥,你不知道什么是坐标?问问百度吧。
画面的左上角是原点。在这个位置,X(横)轴和Y(直)轴的值都是0。嗯,得记住了!横的叫X!直的叫Y!
X值越大,图片就越靠右,反过来就是靠左。Y值越大,图片就越靠下,越小则靠上。
Sprite的显示坐标调整的方式是给x和y这两个变量赋值。
我们直接来看范例和其效果:
@bitmap = Bitmap.new("Graphics/Battlers/Slime") #载入史莱姆的战斗图 @sprite = Sprite.new #创建新的Sprite对象 @sprite.bitmap = @bitmap #指定要显示的Bitmap @sprite.x = 200 #设置X值 @sprite.y = 100 #设置Y值 rgss_stop #停止所有脚本的运行,画面定格
@bitmap = Bitmap.new("Graphics/Battlers/Slime") #载入史莱姆的战斗图
@sprite = Sprite.new #创建新的Sprite对象
@sprite.bitmap = @bitmap #指定要显示的Bitmap
@sprite.x = 200 #设置X值
@sprite.y = 100 #设置Y值
rgss_stop #停止所有脚本的运行,画面定格
效果:(附上说明)
X和Y都可以是负值,也可以超出屏幕的宽度和高度。想要知道效果的话,可以自己尝试调整。 |