赞 | 0 |
VIP | 0 |
好人卡 | 0 |
积分 | 1 |
经验 | 9145 |
最后登录 | 2019-8-6 |
在线时间 | 1 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 60
- 在线时间
- 1 小时
- 注册时间
- 2008-5-18
- 帖子
- 251
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
补充说明:
为了保证规范,一些重要的术语援引原文不翻译,请见谅!本人基础语法不过关,纯实干派,错误的地方请指出!
今天开始我来边翻译边讲述一些关于RGSS和Ruby的教学,
在翻译的基础上融合了大量自己的心得体会,希望能给大家带来一些收获。对于不知道什么是RGSS和Ruby的新人们,我的建议是先把事件弄懂了,然后再看这个教程.我们这个教学的目标是:能够写出属于自己的简单脚本!
教学大纲:
第一讲: Ruby 和RGSS的概况 推荐★
第二,三讲: 基本词汇和语法 推荐★☆
特别讲: Near Fantastica的RGSS语法列表 推荐★
特别将: RGSS 参考 推荐★★★★
第四,五讲: 变量和常量 推荐★★☆
第六,七,八讲: 条件语句 推荐★★☆
第九讲:Loop专题 推荐★★☆
第十讲:Inheritance专题 推荐★★☆
第十一-----十七讲(重点): Scene和Window 专题 推荐★★★★★
第十八-----二十讲(也是重点): Selectable/Command 窗口专题 推荐★★★★☆
第一讲 什么是Ruby?什么是RGSS?
首先请在工程中按下F1看基本知识
我不重复别人说的话了.Ruby它诞生于1993年2月24日,它是面向对象的解释性语言(即00),任何一种00语言都包含以下4个部分:
-Class 类
-Methods 方法
-Messages
-Arguments
-Variables/Constants 变量和常量
它们之间的关系:
一个对象的例子
假设class为一个汽车制造厂 ,那么目标就是汽车. 汽车制造厂包含所有来制造汽车的功能,每辆车都是一种同样东西的不同形式.这些不同的汽车形式也是不同的对象,也可以在不改变其他汽车对象的基础上在加以改造.当汽车公司需要另一辆汽车的时候, 他们只用简单地向汽车制造厂要求制造一辆新车,只要盖好了一个工厂(就是class-类)你就不需要每次都去重复地对汽车(object 对象)操作了.
一个处理对象的例子
在 RPG Maker XP里, 你的人物都有很多属性,如”名字””HP””等级”等等,这些在游戏里都能打开菜单看到.它们是靠后台执行你所发出的指令来完成显示的.
一种方法事实上定义了目标对象接收到什么信息,接受到会发生什么.所以说,每次消息传送或接收,对象都是和它的制造者(class-类)所关联,靠相关的方法来执行.
回到人物的例子,我们就知道了有一种类专门定义人物,这个类有种为你发给目标对象的信息而生成的方法.然后我们就找到一种叫”name”的方法
什么是RGSS?
“Ruby Game Scripting System”是RGSS的全称,它不是一种语言.鉴于大家都知道它是音乐测试左边那个按扭,其他不多说了.
下面看个例子,一行描绘图片的脚本:
image = Sprite.new
image.bitmap = RPG::Cache.picture(name of picture)
理论上,要在屏幕上显示出图片需要2行脚本,因为你要使用一个叫”Sprite”的类, "Sprite" 在RMXP中已事先编好(不在脚本编辑器中).也需要一个module模块 (也不在脚本编辑器中)
RGSS编辑器
脚本里的字体各有颜色,不同的颜色都有什么含义呢?
蓝色: 语法, 如 def, class, end, when, if, case…..
红色: 数字, 如 1, 2, 3, 4,………….
浅蓝色: 符号, 如+, * , = , || ,
绿色: 注释, 不被执行的内容
紫色: 显示的文章
常用快捷键
Control+F 本脚本页中寻找
Control+Shift+F 全局搜索
Control + H 替换
Control + G 转到第几行
第二讲 基本词汇和语法(上)
一些基本的废话将完了,我们直接进入正题^0^..接下来的请大家一起跟我实践~
先在RGSS编辑器中新建一个脚本,插入这些:
class Say_Something
def initialize
print “I am therefore I’m coded”
end
end
然后找个npc并在他事件页的脚本那里写入Say_Something.new
点他后我们看到什么了呢?冒出来一个写着” I am therefore I’m coded”的窗口.
这是为什么呢?让我们来一行一行地看:
class Say_Something 这里我们创建了一个叫Say_Something 的class (类)
def initialize 这里我们定义了一种新的方法叫Initialize (初始化)
print “I am therefore I’m coded” 我们增加了当”initialize”的方法被调用时执行的东西
两个end是语法
我们再进一步学习:
“initialize” 是一种默认的方法,当你在事件中调用脚本时候执行. 脚本语句”Say_Something.new” 你用”new”的信息命令 RMXP 来创建Say_Something的对象
关于end:
哪些词语需要用end来结束呢?看看这个.是不是清楚了点呢?:
好了,我们回头看看事件页写的那行” Say_Something.new” ,注意到了吗, 它前面没有写对象, 我们可以试着改为” my_object = Say_Something.new” , 效果是一样的,不过心里舒坦了点吧…….这是为什么呢???
这里我们创建了一个新的目标对象叫”my_object” ,它应该是在”Say_Something”这个class里的,但是我们开头那个”Say_Something “,除了一条信息外空空如也..所以我们没必要在事件那里多一个对象.
那么,我们来给这个空空如也的”Say_Something “类多点什么吧!
重新替换开头那行脚本为:
class Say_Something
attr_accessor :greeting
attr_accessor :name
def initialize(greeting, name)
@greeting=greeting
@name=name
end
def say
print @greeting + “ “ + @name
end
end
然后在那个npc事件脚本里重新写为:
message1=Say_Something.new(“Hello”, “Alex”)
message2=Say_Something.new(“Hello”, “Peter”)
print message1.name
print message2.name
message1.say
message2.say
执行看,是不是华丽多了?我们看到4个冒出来的窗口.分别显示”Alex”,”Peter”,”Hello Alex”和”Hello Peter”
这里我们创建了两个目标”message1”和”message2”他们都依靠”Say_Something”类,就像第一讲里那个汽车厂的例子一样,改变一个是不会影响另一个的.
那么他是如何运行的呢?请看第三讲.
第三讲 基本词汇和语法(下)
大家应该没忘记上回的内容吧^0^,好,不废话了,今天继续!
我们来看看他的脚本是怎么写的,因为说明较长,所以给脚本标上了行数:
1 class Say_Something
我们这里创建了一个新的对象叫"message1"它将做为Say_Something的一个instance来使用.也就是说我们对这个对象的任何操作都是在这个Say_Something类里来定义的".我们已经在这个类的initialize方法里添加了Argument 接收器(不明白的见第一讲的图示), 我们需要发送这些argument .那么怎么发送到这个类里呢?和我们处理它的方法一样,在这个类名里列出他们就行了
2 attr_accessor :greeting
我们在这里定义了一个ATTR 值,全称是 Attribute. 我们可以简单地用ATTR_ACCESSOR 来定义一个新的可读可写,适用于由Say_Something创建的任何对象的instance的功能.我们第一个ATTR 的名字叫greeting.
3 attr_accessor :name
定义另一个ATTR, 名字叫name
4 def initialize(greeting, name)
我们定义了一个新的方法initialize.看过前面教学,你大家应该明白这个initialize 的方法是在一个对象由class类创建时,第一个执行的方法.所以我们添加Argument 接受器,那么这个方法可以被接收到了. 在这个例子中, 这些"argument" (ATTR)是"greeting" 和 "name". 我们在冒号的两边放上这些argument接收器和方法的名字. 注意这些"Argument 接受器是 " "接收者"; 也就是说逗号两边的都是变量名,它们在后来还是有用途的.
5 @greeting=greeting
这里我们新定义了一个"Instance 变量" , 他们把"greeting"这个数据传送出去..一个 instance 变量都由 @ 开头,在同类的每个方法中都非常有用.它们都在方法中定义 通过这样我们就能命令RMXP接收"greeting" 并把它放在"@greeting" 里以便其他方法中调用
6 @name=name
同上,不过这回的attribute是”name”
7 end
结束方法initialize
8 def say
定义一个新的叫”say”的方法
9 print @greeting + " " + @name
我们这样编码,当”say”这个信息被对象接收了会怎么样.这里是显示"@greeting"的内容, 一个空号后加入"@name".的内容.
10 end
结束say的方法定义
11 end
结束 Say_Something 这个类
好了,脚本是看完了,再完整地看一遍:
class Say_Something
attr_accessor :greeting
attr_accessor :name
def initialize(greeting, name)
@greeting=greeting
@name=name
end
def say
print @greeting + “ “ + @name
end
end
是不是不那么扑朔迷离了??
那么接下来看事件页脚本,我们也一行一行地看^0^.
1 message1=Say_Something.new("Hello", "Alex")
我们创建了一个新的目标对象叫"message1" ,它是类"Say_Something"的一个instance (也就是说我们对这个对象的任何操作都是在这个Say_Something类里来定义的).我们在这个类的initialize 方法里已经添加了 "Argument 接受器" , 我们就要发送这些 argument.
2 message2=Say_Something.new("Hello", "Peter")
同1
3 print message1.name
我们用Ruby 的命令"print" 来显示对象"message1"中储存的name名字.大家可以看到, 只用这个类的ATTR中定义过的name 名字就能获得对象的attributes (内容)
4 print message2.name
同3
5 message1.say
我们现在发送了信息给对象"message1",这个信息就是"say". 然后,你告诉"message1" 执行"say”的功能; 再然后,"message1"在它的类"Say_Something"寻找定义过的命令.就这样,目标对象就返回到了class类中定义过的动作,也就是在屏幕中显示.
6 message2.say
同5
完整地看下事件页这几行脚本:
message1=Say_Something.new("Hello", "Alex")
message2=Say_Something.new("Hello", "Peter")
print message1.name
print message2.name
message1.say
message2.say
好了,今天的教学就到这了,好好回顾一下前三讲的东西,主要是理论部分较多,需要好好理解~接下来我们就主要学习如何编码了,基础要掌握好才能建好高楼哦~~
特别讲: Near Fantastica的RGSS语法列表
Near Fantastica.doc
第四讲: 变量和常量(上)
大家好,我们今天开始学习新的内容^0^
变量有很多种,我们一一看来:
1: Local变量.(局部变量)只能和它的方法存在.我们先看下面这个例子:
class Local_Variable
def method_1
local_variable=2
end
def method_2
local_variable=3
end
end
2: Instance 变量.以 @ 开头,必须在方法中被创建..这种变量能在任何同个类的方法中被调用.下面的例子中,方法1创建的Instance 变量和方法2的是一样的.在2中我们把它变为4. 一个Instance变量在一个类中是全局的.
class Instance_Variable
def method_1
@instance_variable=2
end
def method_2
@instance_variable=4
end
end
3: Class变量.以 @@ 开头,只要不在方法中,就必须在类中被创建.建议将它放在类名定义的下面. 一个Class 变量在同类中是通用的,所有此类中的方法都能使用它. 下面的例子中我们创建了一个记数的类.
class Class_Variable
@@class_variable=0
def initialize
@@class_variable+=1
end
end
4: Global变量(全局变量)在整个游戏中存在,一旦被创建,任何一个类中都能使用它.下面的例子中,我们在一个类中创建了一个全局变量,我们在另一个类中增加了1.
class Global_Variable_1
def initialize
$global_variable=0
end
end
class Global_Variable_2
def initialize
$global_variable+=1
end
end
第五讲: 变量和常量(下)
学习完变量了,现在来学习常量.
常量像一个容器,装载着某个值.它本来不能被改变,但是在Ruby中可以.. 但是只能在这个类中你可以改变它,它的值总是和你给它定义的时候保持一致.下面的例子中,我们可以看到三个类中常量的如何使用.
A_CONSTANT=100
class Constant_Test_1
ANOTHER_CONSTANT=50
def initialize
print ANOTHER_CONSTANT
print A_CONSTANT
end
end
class Constant_Test_2
def initialize
print Constant_Test_1::ANOTHER_CONSTANT
print A_CONSTANT
end
end
class Constant_Test_3
A_CONSTANT+=1
def initialize
print A_CONSTANT
end
end
首先,我们创建了一个全局变量A_CONSTANT,值为 100. 我们看到这个全局变量是在类之外创建的,它在游戏的每个类中都通用.第一个class类中,我们创建了常量,它是在类中使用的,但是在另一个类中使用正确的语法也能调用它. 第二个类中我们事实上获得了第一个类中定义的变量.它的句法是这样:
Class_Name::CONSTANT_NAME
使用这样的句法,我们就能在一个类中定义一个常量.也能让其他的类中能使用它.在第三个例子中,我们给全局变量"A_CONSTANT"增加了1, 显示出来就是101.
好了,让我们来测试几遍! 加入脚本后在事件页里写上:
Constant_Test_1.new
Constant_Test_2.new
Constant_Test_3.new
Constant_Test_1.new
这样的格式应该不陌生了吧^0^
我们会发现常量"A_CONSTANT" 在执行Constant_Test_3.new的时候会保持在101这.是因为它一直使用静止不变的"A_CONSTANT"的值也就是 100. 简单地说,常量就是常量,不会改变的量.一定要记住常量不能在方法中被创建或者修改哦~~~
第六讲: 条件语句(上)
今天我们来学习条件语句,即常说的”If语句”
首先看两句句子:
if my_variable=0
if my_variable==0
看出它们的区别了吗?
后者是正确的,前者是错误的,这是Ruby的基本语法哦~~
好了,说完无关紧要的,我们来测试一下几个例子:
例1:
class If_Statement_1
@@a_class_variable=10
def initialize
@@a_class_variable+=1
a_local_variable=13
if @@a_class_variable==a_local_variable
print "Yay, we are equal !"
else
print "Arg, it's not fair !"
end
end
end
脚本放入后事件中调用(应该很熟悉了吧~~):
If_Statement_1.new
If_Statement_1.new
If_Statement_1.new
If_Statement_1.new
出现什么情况?
第三个窗口会是"Yay, we are equal !",因为我们每次调用这个类时都给它的值增加了1, 刚好第三次的时候这个类的值等于了局部变量,也就是@@a_class_variable==a_local_variable RMXP是按以下的程序运行的:
第一次:
@@a_class_variable=10+1 --> 得11
a_local_variable=13
IF语句判断了两个大小,从而得出他们不相等,于是它执行了else的情况.
第二次:
@@a_class_variable=11+1 --> 得12
还是不相等,仍是else
第三次:
相等了,于是显示 "Yay, we are equal !"
第四次以及以后:
都不相等,同1,2.
例2:
class If_Statement_1
@@a_class_variable=10
def initialize
@@a_class_variable+=1
a_local_variable=13
if @@a_class_variable==a_local_variable then print "Yay" else print "Arg" end
end
end
看到那行特别长的了吗? 它是没有错误的,因为我们可以把If语句写在一行,当然了,不够美观不够方便.它用于一些小场合.以下是另外两个例子:
例3:
class If_Statement_1
@@a_class_variable=10
def initialize
@@a_class_variable+=1
a_local_variable=13
print @@a_class_variable
if @@a_class_variable==a_local_variable : print "Yay" end
end
end
比较下例2,我们发现我们可以用” : ”来替换原句中的”then”.继续往下看~
例4:
class If_Statement_1
@@a_class_variable=10
def initialize
@@a_class_variable+=1
a_local_variable=13
print @@a_class_variable
print "Yay" if @@a_class_variable==a_local_variable
end
end
这个例子里我们把”end”都省略掉了^0^.看起来更清爽了不? 因为我们重新改造了句子的结构,把结果print "Yay" 加了个”if”显示在” @@a_class_variable 等于 a_local_variable. “的条件前.所以,我们现在知道了If语句有多种表达方式.更高级的例子,留给明天讨论吧,今天学得不少了~~
第七讲: 条件语句(中)
紧接着昨天的if, 我们可以把elsif连在一起使用~先看例子:
class If_Statement_1
@@a_class_variable=10
def initialize
@@a_class_variable+=1
a_local_variable=13
if @@a_class_variable==a_local_variable
print "We Are Equal !"
elsif @@a_class_variable==12
print "I Equal 12 !"
elsif @@a_class_variable != a_local_variable
print "We aren't equal !"
end
end
end
看清楚哦,是elsif 不是 elseif ~~
使用elsif语句会时程序在if语句中选择,而且不会同时选择两个.否则,当@@a_class_variable 的值等于12,我们就会看到两条信息了就是"I Equal 12 !"和 "We Aren't Equals". 但是事实上条件句只显示第一条信息并跳过了其他的语句返回true值。想做成这样的话,只用简单的用新的elsif作为IF语句,程序就会检查所有语句,然后执行true值时候的情形:
class If_Statement_1
@@a_class_variable=10
def initialize
@@a_class_variable+=1
a_local_variable=13
if @@a_class_variable==a_local_variable
print "We Are Equal !"
end
if @@a_class_variable==12
print "I Equal 12 !"
end
if @@a_class_variable != a_local_variable
print "We aren't equal !"
end
end
end
运行看看,我们就能看到当@@a_class_variable的值等于12时能出现两条信息, "I Equal 12 !" 和 "We Aren't Equal". 不过是不是觉得很累赘呢? 因为大部分情况下, 用这么多个 else if , 还不如用下面的Case 语句.
Case 语句是用来检查给出的变量的内容,并列出一组满足每个给定的值时应执行的动作.在 Scene (场景)和Menus (菜单)中会大量出现.我们继续使用上面的例子class_variable:来说明.要记住的是,我们这回要改变事件页脚本那里的写法了^0^
将If_Statement_1.new 改为 Case_Statement_1.new
例1:
class Case_Statement_1
@@a_class_variable=0
def initialize
@@a_class_variable+=1
case @@a_class_variable
when 1
print "I am 1"
when 2
print "I am 2"
when 3
print "I am 3"
else
print "What Am I ?"
end
end
end
运行下看看, 是不是觉得比那么多个else if 要来得清楚明了呢? 这就是case 语句的优点,
当然了,我们照样可以用”:” 来代替”then”,所以我们可以把语句缩合成这样:
例2:
class Case_Statement_1
@@a_class_variable=0
def initialize
@@a_class_variable+=1
case @@a_class_variable
when 1: print "I am 1"
when 2: print "I am 2"
when 3: print "I am 3"
else print "What Am I ?"
end
end
end
好了, 大家试试看~今天就讲这么多~
第八讲: 条件语句(下)
我们今天来学习条件语句的最后一部分”Ranges”
Range (范围) 是由一个起始值和结束值来定义的, 它就是在两个值的中间点上几点. (我们会在今后进一步讲述.)先看下它的基本格式:
开始 .. 结束 -->包括结束的值(两个点)
开始 ... 结束 -->不包括结束的值(三个点)
它具体怎么用呢?让我们继续前几讲的例子:
例1:
class Case_Statement_1
@@a_class_variable=0
def initialize
@@a_class_variable+=1
print @@a_class_variable
case @@a_class_variable
when 1..3: print "I am between 1 and 3"
when 4..6: print "I am between 4 and 6"
when 7..9: print "I am between 7 and 9"
else print "What Am I ?"
end
end
end
测试的话我们需要在事件中调用更多的Case_Statement_1.new, 10个就能看完效果了
当然了,我们不一定非得用数字的, 我们可以使用字符, 看下面的例子:
例2:
class Case_Statement_1
@@a_class_variable="a"
def initialize
@@a_class_variable.next!
case @@a_class_variable
when "b": print "I am B"
when "c": print "I am C"
when "d": print "I am D"
else print "What Am I ?"
end
end
end
这个例子我们有一个.next! 的命令,它是干吗用的呢?它是用来增加一个字符到它下一个逻辑值,而逻辑值取决于它在字符最右边的字母.不是很明白吧, 我们再看下几个例子:
a_string="ab"
a_string.next!
--> a_string 的值等于 "ac"
another_string="name102"
another_string.next!
--> another_string的值等于 "name103"
好了^0^, 回到我们的Case 例子,我们看到它也是运用字符的,明白了.next! 的原理相信结合起来理解没有问题了吧~今天就到这, 下次我们又要学习新的内容啦~~
|
|