晴兰的反向Ruby教程-2 RMVA小程序

2012 年 11 月 22 日

上一节我们学习了Ruby的消息,如何定义消息(方法,我们在这里不需要区分消息与方法,可以认为是一样的),现在当你去看F1手册时,看到的都是模块、类和方法名。下面试试来做更多的事情。
RMVA的手册在写本文时大约没有完整的中文版,但就像XP、VX、VA各版本的手册的”RGSS参考>标准库>预置函数”一节开宗明义都会说到的,像system这种函数,事实上是Kernel模块的一个方法,以消息编程来看,不指定对象,我们发消息的对象是Kernel。也可以指定对象,用”对象.方法”来调用。因此事实上是这个样子的:

下面来看看更多的例子

 

手册的”RGSS参考>游戏库>Audio” “RGSS リファレンス>ゲームライブラリ>Audio”

这个页面,可以看到一堆模块方法。

例如bgm_play: Audio.bgm_play(filename[, volume[, pitch[, pos]]])

要注意的是,Audio就是要发消息的对象,消息名是bgm_play,后面的消息参数分别是文件名、音量、音调、位置。加了方括号的表示可以省略。例如:

但这样,会播放了不到1秒就游戏结束了,因为没有让他停留在那里播放,我只是对音频模块说,播放这个BGM,然后游戏的主要脚本也就结束了。为了让他停在那里播放,可以用rgss_stop:

现在为止我们只能手动点击关闭按钮关掉。

当然也可以像上一节一样弄的好看点

说是半残播放器,是因为只能播放一首曲子,不过更改下面的设置可以播放其他的曲子。从网络上取得的脚本,通常也会有些设置。

几乎所有的图形游戏里面都会有一个刷新画面的循环,这里是最简单的一种。 当然文字版的猜数字可能是不需要的。

一个游戏至少要和用户有所交互,就说刚才简单的播放BGM,可以说是音乐欣赏,但是我为了控制它的播放情况,可以读取用户的按键:

  • 上键: 增大音量
  • 下键: 减小音量
  • 右键: 提高音调
  • 左键: 降低音调
  • 回车, C: 暂停、恢复暂停
  • ESC, X: 退出游戏

下面的代码里面的@, 可以这么看,表示’我的’一个变量,也就是正在写代码的这个对象的一个变量。Ruby里面的变量有@,@@,$开头的几种,分别是对象的变量,类的变量,全局变量。还有什么开头都不写的,但不写的一般而言,大写字母开头的并不是变量而是常量
下面是两种写法,判断按键的过程既可以是程序逻辑,也可以是数据,抽象的方式不一样而已。数据的话,相当于设置按键。

对比一下下面的数据设置,不过下面这种用法不需要太追究:

 

注意,这里”@壁纸.图片=”, 事实上是给@壁纸这个对象,发送了”图片=”这个消息,消息名是”图片=”,而!并!不!是!在”@壁纸”这个对象的范围里面做了: @壁纸.instance_eval do @图片 = … end 以后会提到这个instance_eval 事实上我们之前所做的一切事情都相当于 self.instance_eval do 平面 = Plane … end 而self是当前对象

这也是为什么上面取了两次别名,事实上是两个不同的方法(消息)

 

 

这里进一步地,对图像进行操作,可以改改程序看结果

试试对图片进行其他的操作
alias不是消息/方法,对应的方法是alias_method
{}.each{|a,b|}的话,在后面的括号里面,a就会取配对的第一个,b取第二个,例如最后一组 英文名=”font=”, 中文名=”字体=”,这个{}是个哈希/字典/配对/映射,Ruby中的类型是Hash。
each的作用是对那一堆配对的每一个,都做后面大括号的事情
从这个来看Ruby的代码也可以写成好理解的形式。不要试图手动生成上面那张表,有更好的办法以后会提到。

也可以使用系统API,就像其他程序那样:

Win32API.new的参数: DLL名, 函数名, 参数类型表, 返回值类型

但是通常情况下,类型可以自动推断出来,返回值也可以忽略,或者通常是整数兼容的类型。

这里用method_missing来匹配MessageBox这个不存在的方法,并生成”ippi”这样的参数表:

 

#Ruby教程

发表评论

电子邮件地址不会被公开。 必填项已用*标注


*