显示图片

在学习完对像后让我们稍稍轻松一下,来使用 RGSS 的游戏程序显示图片吧。

Graphics 模块

在 RGSS 游戏库中最重要的应当是 Graphics 模块。 它是用来处理游戏中所有图片的方法集合,在游戏的画面中显示图片, 就要使用到该模块的功能。

所谓模块,可以考虑成收集了相同范围方法的如容器那样的东西,和类有相似之处。然而模块却不能生成实例,也没有那个必要。

那么首先,请按下面那样输入。

loop do
  Graphics.update
end

这个是用 loop do ~ end 作成的无限循环。 这个处理是无限反复运行 Graphics.update 这一行的意思。中间的那行, 是调用 Graphics 模块的 update 方法。因为这个和调用对象的方法形式相同, 所以还是比较容易理解的吧。

Graphics.update 完成的是更新游戏画面,然后前进 1 帧的任务。 这个时候,会向同时刷新画面上的图像。这个形式是 RGSS 游戏运行的基础。运行 RPG 大规模游戏的复杂的脚本,也不过是在这个基本形式上添加各种各样的处理而已。

还有,运行上面的示例后什么也没有显示。这只是个反复显示乌黑画面的处理而已。 下面我们就来学习实际显示图片的方法吧。

精灵和位图

向刚才的脚本中加入 2 行,如下所示。如果画面左上角显示出骷髅兵的图片就表示成功了。

skeleton = Sprite.new
skeleton.bitmap = Bitmap.new("Graphics/Battlers/Skeleton")
skeleton.x = 272
skeleton.y = 208
loop do
  Graphics.update
end

这里出现了 SpriteBitmap 两个新类。Sprite 是在 游戏画面上显示某些图片的基本概念即精灵的类,Bitmap 是 精灵传输元位图本身内容的类。

第一行,是新生成一个 Sprite 类的实例,并把那个实例代入变量 skeleton。Sprite.new 是上一章学习过的,生成实例的第二种方法。

第二行,是读取 RGSS-RTP 中所含的图片文件("Skeleton")并 生成 Bitmap 类的一个新实例。而且,对 skeleton 对象的 bitmap 属性(后述)进行设置。 也就是设置这个位图为精灵传输元的意思。

指定 Bitmap.new 参数的路径名,分隔符是使用 / 而不是 \ 这点要特别注意。 我们在字符串「转义符」中学习了 \ 在字符串中具有特殊的意义, 而在这里使用 / 就避免了这种可能的错误。

属性

Sprite 类中像 bitmap 那样的特性称为属性。 实际上这并不是 Ruby 语言的概念,而是 RGSS 的独特用语。 在游戏程序中使用赋值运算符在多个方面对其内容特性进行设置, 这些就称为属性。例如,更改表示精灵坐标的 x、y 属性数值就是这样。

Skeleton = Sprite.new
Skeleton.bitmap = Bitmap.new("Graphics/Battlers/Skeleton")
Skeleton.x = 272
Skeleton.y = 208
loop do
  Graphics.update
end

上面第三行,是把指定精灵 X 坐标的属性 x 设置为值 272。 同样的第四行,是把指定精灵 Y 坐标的属性 y 设置为值 208。 这样运行的话,精灵就会显示在画面中央位置附近。

让我们进一步加工一下。

skeleton = Sprite.new
skeleton.bitmap = Bitmap.new("Graphics/Battlers/Skeleton")
skeleton.ox = skeleton.bitmap.width / 2
skeleton.oy = skeleton.bitmap.height / 2
skeleton.x = 272
skeleton.y = 208
loop do
  Graphics.update
end

这样就变成完全显示在画面正中央了。这个 ox、oy 属性的设置, 更改了精灵的原点。这和 VA 的事件指 令[显示图片]中选择[左上]、[中心]为原点是一样的概念。 默认状态下,原点在图片的左上。赋值运算符的右侧调用的 width、height 是 Bitmap 类的方法,作用分别是取得图片的宽和高。 这里使用了其值的 1/2,也就是把图片的中心点设置为原点。

Input 模块

简单地说一说输入的事情吧。RGSS 中为了获得玩家输入按键的信息,准备了 Input 模块。

将 loop do ... end 改成下面这样。

loop do
  Graphics.update
  Input.update
  if Input.press?(:RIGHT)
    skeleton.x += 1
  end
  if Input.press?(:LEFT)
    skeleton.x -= 1
  end
end

这是根据左右方向键的输入移动精灵的脚本。运行一下试试看吧。

Input.update 是更新输入信息的方法。调用方法的那一刻会判定 RGSS 管理的所有按键是否被按下,并更新模块内部的信息。

Input.press? 方法在参数对应的按键被按下时返回 true、没有被按下时返回 false 。指定按钮名称使用符号。请记住,这里用冒号 (":") 后跟着按钮名称表示符号。右方向键可以用 :RIGHT 指定。其他的按钮名请参考 Input 模块。

如果学有余力,你可以做各种各样的尝试,比如使用这里没有解说的方法和属性,接受上下键的输入等等。自主思考,亲身实践,这是学会 RGSS 的捷径。