设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2722|回复: 6
打印 上一主题 下一主题

脚本教程(上)

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
60
在线时间
1 小时
注册时间
2008-5-18
帖子
251
跳转到指定楼层
1
发表于 2008-8-18 18:26:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

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! 的原理相信结合起来理解没有问题了吧~今天就到这, 下次我们又要学习新的内容啦~~
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2006-9-2
帖子
15
2
发表于 2008-8-18 18:38:09 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3299
在线时间
3619 小时
注册时间
2006-9-6
帖子
37400

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

3
发表于 2008-8-18 20:44:51 | 只看该作者
囧rz,
转载6R的到6R。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

B

梦石
0
星屑
50
在线时间
26 小时
注册时间
2007-8-26
帖子
3693
4
发表于 2008-8-19 21:03:56 | 只看该作者
以下引用朱陈未缔于2008-8-18 10:38:09的发言:

我有些不明白,你转载6R的东西到6R来有什么意义
http://rpg.blue/web/htm/dj79.htm


难怪,我以为在哪里见过
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-8-21
帖子
36
5
发表于 2008-8-23 09:14:21 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
65
在线时间
385 小时
注册时间
2007-7-27
帖子
4106

开拓者

6
发表于 2008-8-25 05:02:18 | 只看该作者
我不明白这个标签为啥还是原创发布= =
不过要感谢女F的教程……我脚本就是那里学的……
吸吸
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
150
在线时间
4 小时
注册时间
2008-7-29
帖子
3
7
发表于 2008-8-28 06:11:41 | 只看该作者
我觉得看到的教程都是知道的,不知道的总是没人写{/dk}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-16 12:26

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表