Project1

标题: 【活动】【VA】RGSS 3 入门教程大家写(更新13/02/15) [打印本页]

作者: harinlen    时间: 2012-9-24 21:39
标题: 【活动】【VA】RGSS 3 入门教程大家写(更新13/02/15)
本帖最后由 taroxd 于 2014-6-24 20:02 编辑

说好的上大学回来常驻最后因为学校的事情结果没能实现。
在这几个月里硬生生从VB转向了C++,初步学习了一些面向对象的程序设计。顿时觉得原来很多东西的理解还是有问题的。请各位大触们把这个教程啥的重新整理下吧。

————————————————————————————————————————————————————————————————————————
Feb 15,2013更新 【VA】帮助文档(汉化版)& 公告  
Feb 13,2013更新
今天雪姐很意外的找到私了啊……(激动得已经不知道说什么了ZE☆)指出了私由于写其它语言造成的很多不严谨的地方而导致的一些错误,很感谢@忧雪の伤 SAMA(遂决定改口叫SAMA了DA☆ZE),也请列位神触多多指正~
雪SAMA补丁请戳此处

————————————————————————————————————————————————————————————————————————
HAR君辛苦了。
高三高考党要加油的说~

与此同时,洛子诚邀各位脚本党的朋友于本帖续写RGSS3的教程。

续写要求很简单):
1.内容表述清楚易懂,没有技术上的错误;
2.内容普遍性实用性最好高些,细处最好说得详细点;
3.续写内容不与前面的内容重复,引用搬运要注明原作者
4.排版参照之前的帖子,不要太奇葩就好!

续写福利很不错):
1.每更新一讲,洛子会给更新者发【好人卡】一张(优秀的追加100糖】);
2.对于本帖教程,洛子会在本年年底作整理汇编到正在建筑的【VA手册帖】和【VA向导帖】当中,
    参与更新的朋友会留名】其上。
3.若教程可以顺利完成,洛子会向上给大家申请徽章】VIP】

PS:如果有像  小镜子教新手改菜单脚本系列 类似的具体的实例教程。
      请到另开新帖,洛子也会塞糖发卡和进行整理的汇编的说~

     ※ 如果洛子没有及时发卡塞糖的话,请PM提醒洛子。(<--防止有时候@失效)



趁着连帖的间隙,先把正文补全吧。
于是经过艰难的决定私决定写个这个无聊的教程,很大程度上是……各种压力作祟嗯……
然后渣教程请勿转载,如果有什么问题的话,请回帖说明,然后6R的众神们要是有想写下去的请帮助私写一点吧,私会用节操来偿还的(←你是要成为第二个54麼= =)
排版日后跟上,私先发东西= =

严重感谢以下SAMA
@satgo1546
@铅笔描绘的思念

目录
写在前面
Hello World!
msgbox函数与字符串
变量和常量
运算
控制结构(铅笔描绘的思念)
数组
循环1(satgo1546)
循环2
函数(铅笔描绘的思念)
(铅笔描绘的思念)
塊 - Block(忧雪の伤)
变量和常量补充(忧雪の伤)

附录
一 调试
1、输出到命令行:让p重新出现!(satgo1546)
2、Class、Module、Object与Kernel(铅笔描绘的思念)
二 其它
注释(satgo1546)
作者: harinlen    时间: 2012-9-24 21:44
标题: 写在前面
本帖最后由 harinlen 于 2012-9-26 19:12 编辑

碎碎念


好了,恭喜,如果君能够成功的看到这里的话,说明君很想学习脚本嗯。
其实脚本很简单,说实话,有一点编程基础(尤其是Java这种Class观念很强的语言很吃香)的人在一天内转型是很容易的事情。如果学过RGSS 2的话,请君移步F1自行学习。(貌似F1的翻译还没有完?)
就算没有基础也没关系,经过慢慢的学习也会很快变成一个脚本大触的嗯。
其实私也是看着RGSS 2的教程自行瞎折腾的RGSS 3嗯,期间得到了很多大大们的帮助,论坛里有很多脚本触,例如启明君啊,多拉菌啊,雪姐啊(←可以算是Boss级的三个人了)之类的,有不懂的地方可以向他们请教嗯,人都很好的说。
各位大大们看到后勿喷额,私这个教程面向的对象是纯新人。私会用尽量日常甚至很直白的语言来描述一些很BT的东西。
最后,最严重的事情:此贴属有生之年向,私处于高三BT时期,如果没有时间的话,请大大们帮忙完善或者更正。

P.S.:致各位:私的渣教程定有失误,例如理解错误、错别字……请各位不吝赐教,私定当痛改前非,重新做……巫女……

什么是RGSS 3


说到脚本,就要说到这个脚本的语言,这个语言叫做RGSS 3,全名叫做Ruby Game Script System 3。中文叫做Ruby游戏脚本系统3。这里不得不提到Ruby这个东西了。Ruby是一种为简单快捷而设计的语言,非常直观,简单易学。
RGSS3,顾名思义,是RGSS系列的第三弹(←这啥?!)。和前面版本的区别……省略,也没必要知道,毕竟这是新手教程。(←根本就是你不知道吧?!)

返回目录
作者: harinlen    时间: 2012-9-24 21:46
标题: Hello World!
本帖最后由 harinlen 于 2013-5-3 16:56 编辑

有人可能会看不懂这是啥,嗯,不懂也没关系,接着看(坑)就是了。
既然RGSS3是个脚本,用来和计算机交流的东西,咱们先尝试着让计算机说出点什么东西吧。
学任何一门语言,第一个程序就是让电脑说出“Hello World!”
怎么实现呢?
下面,打开君的RMVA。新建一个工程,打开脚本编辑器。在左侧最底下找到这个东西:

把右边的神马东西全部删掉。然后输入这些:
  1. msgbox "Hello World!"
复制代码
输入时请注意:
1、        除了双引号内部的东西,严格区分大小写。
2、        双引号必须输入英文的双引号,中文、其它各国文字均不可以(什么埃塞俄比亚文之类的……)
应该是下面这个样子:

单击应用,确定之类的,然后保存运行。
应该是这个效果:

单击确定后就退出了。
怎么样,这第一个脚本是不是很简单呢?

返回目录
作者: Mic_洛洛    时间: 2012-9-24 21:55
harinlen乃效率不错嘛!
这么快就有两节了
加油!!
作者: Tink    时间: 2012-9-24 22:00
本帖最后由 Tink 于 2012-9-24 22:04 编辑

HAR触   你可不可以   少    多才多艺   一点啊             你   叫   吾等   想钻地洞了呢……
————————————————————————————————
话说解说很幽默啊~卖萌是可耻噶
————————————————————————————————
静待乃的+V奖励~
作者: harinlen    时间: 2012-9-24 22:02
Tink 发表于 2012-9-24 22:00
HAR触你可不可以少多才多艺一点啊 你叫吾等想钻地洞了呢……
————————————————————— ...

= =啥意思……私庶竭驽钝- -咋断句的啊= =
作者: Password    时间: 2012-9-24 22:04
嘛……没有VX版吗?不过先收藏了
作者: smile-zt    时间: 2012-9-24 22:08
Hello World!
RGSS居然也可以写hello world! (好吧,这也是程序语言,我废话了..)
msgbox "hello world!"

弱弱地问下,RGSS跟其他程序语言最大的区别不会就是... 关键字不同吧..
作者: harinlen    时间: 2012-9-24 22:11
smile-zt 发表于 2012-9-24 22:08
Hello World!
RGSS居然也可以写hello world! (好吧,这也是程序语言,我废话了..)

基本上是的,个人觉得是Java、VB的语言混合版本。
作者: 炎紅之閃光    时间: 2012-9-25 07:33
harinlen 发表于 2012-9-24 22:11
基本上是的,个人觉得是Java、VB的语言混合版本。

Java美觀版=3=
其實與Java真的沒太大分別...
作者: harinlen    时间: 2012-9-25 07:48
炎紅之閃光 发表于 2012-9-25 07:33
Java美觀版=3=
其實與Java真的沒太大分別...

赛高!

以上
作者: 草莓    时间: 2012-9-25 12:21
总算有RGSS3的详细教程了
以前我只会VX而且渣渣
har君各种卖萌

作者: harinlen    时间: 2012-9-25 12:35
标题: msgbox函数与字符串
本帖最后由 harinlen 于 2012-10-1 13:34 编辑

msgbox函数

  好了,下面让我们看看第一个脚本什么意思:
  1. msgbox "Hello World!"
复制代码
这句话由两个东西构成:一个是函数msgbox,这个东西可以这么理解:Message Box。消息窗口。它的作用就是告诉系统:私要显示点东西!而且要一个窗口!系统会反过来问msgbox:“你想显示点啥?”于是就涉及到了第二个东西。
  另一个就是后面的"Hello World!",这个用双引号引起来的东西叫做字符串,所谓字符串,就是把一些汉字、数字、字母、符号等等你能想到的和想不到的乱七八糟串在一起。形成的一个东西。这个东西可以被显示在屏幕上。

  那么,我要显示点别的怎么办?比如:“HAR君你又在卖萌啊!”
  按照刚才的理论,可以这么更改这句话:
  1. msgbox "HAR君你又在卖萌啊!"
复制代码
然后运行就会出现这样的效果。


字符串

  大家在Windows中应该经常见到一个对话框内显示很多行信息,那个又是怎么实现的呢?
  这个时候就要涉及到转义字符这个概念了。所谓转义字符,是指由符号\开头,后面紧跟一个字母或数字表达出来特殊的一种含义。例如用\n表示换行,用\0表示一个字符串的结尾。
  那么,怎么换行呢?比如要输出"54•最木有节操了!"然后换行输出"(君没有资格说别人啊!混蛋!)"。(中枪的孩子私的节操在此= =)
  1. msgbox "54•最木有节操了!\n(君没有资格说别人啊!混蛋!)"
复制代码
那么你会得到这个效果:

  下面是一些常见的转义字符:
  \0 —— 结束字符。字符串的最后一个字符。平时不用打。也就是说:字符串"ABCEFG"和字符串"ABCEFG\0"是等价的。不止如此,\0更多的是用来从中间“斩断”字符串。例如:msgbox "ABCDEFG\0HIGK"得到的结果是输出ABCDEFG。需要指出的是,这个字符不计入总长内,也就是说对"ABCDEFG\0"测量长度的话,长度是7。
  \b —— 退格字符。相当于按下了键盘上的Backspace键。例如:msgbox "ABCDEFG\b"的输出结果是ABCEF。
  \\ —— 输出一个\,要不然就没法输出\符号了。
  \t —— 输出一个制表符,相当于按下键盘上的Tab键的一个长度。
  \a —— 响铃。只是知道是这个意思但私至今未用过。
  \x?? ——输出1到2位十六进制所代表的任意字符。从00到FF。
  \r —— 回车符,这个在Windows中并不认真区分,而在Linux当中,换行(\n,或者叫LF)和回车(\r,或者叫做CR)是两个概念。

无视转移字符

  有的时候我们可能就是希望输出“你要给我输入\0才可以啊!”这样的东西(估计很少有人会= =),我们不需要转义字符的存在,怎么办?
  君可以尝试着把双引号改成单引号。节操补充完毕。
  
作者: 527391078    时间: 2012-9-25 17:21
不错,为啥不是XP的...
作者: 布里蓝    时间: 2012-9-25 18:41
论坛没有只看作者……LZ不更新在一楼里面吗?否则以后东西多了一楼一楼翻很累的
作者: harinlen    时间: 2012-9-25 18:43
布里蓝 发表于 2012-9-25 18:41
论坛没有只看作者……LZ不更新在一楼里面吗?否则以后东西多了一楼一楼翻很累的 ...


于是1L太痛苦了……东西很多字数限制也不晕的吧~
私在一楼不是弄个目录了麼?目前暂时也只能这样了= =

以上
作者: chxush    时间: 2012-9-26 18:24
马克一下啊!
作者: satgo1546    时间: 2012-9-26 18:56
于是
(↑这货不知道原来在VA新手宝典处说:“VA的脚本还没学过”

↑此地无白三百两
为什么不用rgss_stop开头呢……
VA的F1就是这样开头的——

好吧还是维持Hello~world吧


作者: 896409879    时间: 2012-9-27 08:26
炎紅之閃光 发表于 2012-9-24 17:33
Java美觀版=3=
其實與Java真的沒太大分別...

java还要费劲写“{}”这种括号,还要写分号,不用IDE简直就要累死了⋯⋯
作者: 荷包PIG蛋    时间: 2012-9-27 20:54
于是。。。终于等到VA的脚本教程了。。。这次一定要好好学呢~~
作者: 骗子    时间: 2012-9-28 10:22
催更~
作者: 黑面波波    时间: 2012-9-28 11:45
确实要好好学学脚本了
作者: 月华风    时间: 2012-9-28 17:51
不错 和我们学的linux c差不多~~
作者: harinlen    时间: 2012-9-28 20:12
标题: 常量和变量
本帖最后由 harinlen 于 2012-10-1 13:32 编辑

常量


  好了,有人会问:字符串能显示字符,那么字符串能不能算出1+1=2呢?很明显不能。
  虽然字符串也能运算,但是不是我们平时所想象的加减乘除,这个以后会讲到。那么,这个怎么让计算机告诉我们1+1等于几呢?
  首先我们要知道1是什么(私不是异形啊!)。1在计算机程序中叫做常量。常量是指计算机程序中不可变的量。例如:整数常量,如:1、54、10086、65535。浮点型常量(俗称小数),如:1.03、3.14。字符串常量,如:"54酱最没有节操了"、"H酱也最没有节操了"。符号常量等。
  常量无法改变,只能赋值给别人。所谓赋值,就是告诉别人:你就是我这个值。那么,赋值给谁呢?

变量


  对应的,常量只能赋值给变量,顾名思义,变量可以变,可以加减乘除,可以创建,可以扔掉,可以和节操一样吃掉的说(最后一句口胡)
  那么,什么样的变量是个能用的变量呢?
  下面的都是可用的变量:
  asdfghj(纯字母组合)
  window_bug(可以插入下划线)
  jiecao_54de(可以在字母中插入数字之类的)
  wocaishi54dejiecao2(数字放在最后也没有问题)
  _jiecao_54dedaze(以下划线开头也没有问题)
  _______chaojidabug(n多下划线也没有问题啊)
  总的来说,就是以下几点:
1. 第一个字符必须以小写英文字母或 _(下划线)开头。
2. 第二个字符开始可以使用英文字母、数字或 _(下划线)。

  (↑抄自紫SAMA的教程,看不懂的话参考上面的例子)
  但是,下面的这些均不能作为变量名称:
  54dejiecao(数字开头)
  do(系统中的语句)
  break(系统中的语句)
  wo le ge qu(使用了除数字、字母、下划线以外的字符)
  也就是说,系统的关键字、违反了上述规定的名称RGSS3均不认,下面是系统中的一部分保留字,不可以作为变量名:
     alias    def      false    nil      return   unless
     and      do       for      not      self     until
     begin    else     if       or       super    when
     break    elsif    in       redo     then     while
     case     end      module   rescue   true     yield
     class    ensure   next     retry    undef

  (↑抄自紫SAMA的教程,看不懂的话请再次参考上面的例子)
  需要说明的是,有@@@甚至$开头的变量,这个会在以后讲到,这些确实也是合法的变量
  每一个常量在RGSS3中无需声明,可以上来就用。例如在一个语句中出现一个jiecao,RGSS3会自动产生一个变量,这个无需担心。但是,每一个新的变量都是空的,而且刚才说过了,只有常量能够给这些新的变量以新的生命力。那么我们该怎么做?

让一个变量具有节操


  (↑额,永远的17岁不小心把节操和常量的境界消除了。)
  好吧,刚才有提到赋值这个概念,赋值的真正含义是:将一个新的值赋予在一个变量上。在RGSS3中我们怎么做到呢?
  在RGSS3中,赋值这个操作由等号来完成。等号的作用是将右侧的值给左边的变量。例如:
  1. a=1
复制代码
此时我们就让a具有了1这个数值,那么,我们怎么知道a是不是1呢?
  还记得Hello World!里面的msgbox么?它不仅能显示字符串,还能显示所有的变量。于是我们在代码里这么写:
  1. a=1
  2. msgbox a
复制代码
应该能得到这个效果:

  那么,现在我们知道了变量和常量,那么如何进行运算呢?这个就涉及到了变量的运算了。这个下一节会讲到。

变量和字符串的混合输出


  这个其实非常常见,例如:我们弄了个计数器,走过一步记录一次,要显示走过了几次的话,你会怎么做?
  2B青年:当你走一步,输出“你走了1步”,当你走两步,输出“你走了2步”,当你走了3步,输出“你走了3步”……当你走了INFINITY步,输……
  文艺青年:询问:君走了几步了撒?答曰:我还是自己数数看吧。
  普通青年
  作为大多数普通青年,我们不可能那么2X也不可能那么天真,不过通过2X青年的回答,我们可以想到,把步数换成一个变量就可以了,可是一个字符串是固定的,怎么嵌入变量?于是乎,我们可以这么做:
  1. a=4 #记录器
  2. msgbox "你走了#{a}步"
复制代码
运行,这个时候会发现,你可以任意改变a的值,然后显示的值会跟着改变。在字符串中所用到的#{}就是嵌入标志,它告诉RGSS:大括号内的东西是个变量,按照变量输出。这个就是变量和字符串的混合输出
作者: harinlen    时间: 2012-9-28 20:37
那个,这个可能是最近最后一更了,私的学业受到了严重的威胁……(期中考+月考+3次统练,学校是要干甚= =)求续写DA☆ZE~~
作者: fxwd    时间: 2012-9-28 23:20
说实话这玩意真是多余了,脚本都是通用的除了改变了输出文字的字符串,VX已经有了两个教程了。。而且基本和LZ的一样
作者: Mic_洛洛    时间: 2012-9-28 23:23
harinlen 发表于 2012-9-28 20:37
那个,这个可能是最近最后一更了,私的学业受到了严重的威胁……(期中考+月考+3次统练,学校是要干甚= =) ...

如果影响到LZ的学业,洛洛会十分愧疚的说!
希望你可以协调好两者,不要顾此失彼!
总之,感谢HAR的大力支持的说!
望君莫因此而废学!好好加油吧!(等有空时再更新未迟!)

当然,在此洛洛也希望懂RGSS3的脚本党能站出来续写教程的说!
若经审核通过,你们的教程将会被【VA新手向导】收录。
届时洛洛将发放教程编写费和好人卡以资鼓励的说!


作者: 光的圆周率    时间: 2012-9-29 17:00
球加萌...
作者: 铅笔描绘的思念    时间: 2012-9-30 21:43
需要人手帮忙么。。。
作者: lioasdfghjkl    时间: 2012-9-30 21:45
千呼万唤始出来
作者: harinlen    时间: 2012-10-1 13:22
标题: 运算
本帖最后由 harinlen 于 2012-10-14 13:09 编辑

那么,接下来就是,节操的加减了。(变量好吧!)上次说到了将a和b赋值为1,那么如何计算两个数字之和?
求和的运算是个54都知道,就是用符号+,例如我们让变量c是a和b的和这句话就可以写成:
  1. c=a+b
复制代码
这句话的意思是:将a和b的和赋值给c。这时我们输出c就可以得到2了。
上述的运算就是求和运算,同理,我们还存在着下面这些运算:
四则运算
加 c=a+b
减 c=a-b
乘 c=a*b
除 c=a/b

需要说明的是,对于除法,如果执行5/2的话,计算出来的结果会是2。RGSS3会自动省略后面的小数。那么,当我们需要小数的时候怎么写呢?这时候只要随便写一个小数即可。例如:
  1. c=5/2 #计算结果是2
  2. c=5.0/2 #计算结果是2.5
  3. c=5/2.0 #计算结果是2.5
  4. c=1/8 #计算结果是0
  5. c=1.0/8 #计算结果是0.125
  6. c=1/8.00 #计算结果是0.125
复制代码
自运算(就是将等号后面的数直接作用在变量上)

以自加为例,下面这段代码:
  1. b=2
  2. c=1
  3. c+=b
  4. msgbox c
复制代码
执行结果是3。将b的数值与c的数值求和再赋值给c。
自加 c+=a
自减 c-=a
自乘 c*=a
自除 c/=a

求余数

求余数的话,一般人想到的方法应该是求出整数然后再去减,RGSS3内就有了直接的求余数运算符%:
求余数 c=a%b
自求余 c%=a

乘方
乘方这个东西在RGSS3里可不是用什么上标下标表示的,而是用**这个符号,例如:
  1. c=3**2
  2. msgbox c
复制代码
答案将输出9。(⑨?!)

字符串的运算

请移步这里
作者: satgo1546    时间: 2012-10-1 14:06
harinlen 发表于 2012-10-1 13:22
那么,接下来就是,节操的加减了。(变量好吧!)上次说到了将a和b赋值为1,那么如何计算两个数字之和?
求 ...
补充
例如2[sup]3[/sup]
  1. msgbox 2 ** 3
复制代码
2的0.5次方。
  1. msgbox 4 ** 0.5      # 这是什么东西?
复制代码
0.5次方就是平方根!
那么……
  1. msgbox 27 ** (1.0 / 3.0)      # 这又是什么东西?
复制代码
3次方根。但是好像结果会不准确——
  1. irb(main):001:0> 27 ** (1.0 / 3.0)
  2. => 3.0
复制代码
好吧这是准确的……
下面这个例子继续准确着——
  1. irb(main):002:0> 88 ** (1.0 / 3.0)
  2. => 4.44796018113863
  3. irb(main):003:0> a = 4.44796018113863
  4. => 4.44796018113863
  5. irb(main):004:0> a ** 3
  6. => 87.9999999999999
复制代码

作者: satgo1546    时间: 2012-10-1 14:23
本帖最后由 satgo1546 于 2012-10-4 14:03 编辑

接下来应该讲注释了吧,我顺便讲掉吧(?

注释
注释就是防止自己写的脚本时间长了忘记脚本这一段是什么原理/方便给别人看用的。
在RGSS3中,注释的开始符号是“#”。即输入“#”之后这一行“#”后面的内容都是注释,前半部分依然是ruby代码。
【例子】
  1. msgbox "Hello,world!" # 输出"Hello,world!"这个字符串
复制代码
注释中的内容不会被显示出来或者被作为ruby代码执行。
如果某语句需要临时停止使用也可使用注释。
【例子】
  1. a = 1
  2. #a += 1
  3. msgbox "a的值是#{a}"
复制代码
其中“#a += 1”这行因为最开始有一个“#”注释符,所以这整行都不会执行。
因此会输出“a的值是1”而不是“a的值是2”。

不过这里的注释语句不需要亲自动手,VA已经帮你调好——
【例子】

↑从一开始到按下Ctrl+Q之后
VA的脚本编辑器有这个好玩的功能——简单地用特殊的一句“#~ ”注释掉语句。
这个功能叫做批量注释
既然叫批量注释,那么就可以批量地操作。
【例子】
  1. a = 1
  2. a /= 17.5
  3. a = (a * 100).floor
  4. msgbox a
复制代码
Ctrl+A全选,然后Ctrl+Q注释之后:
  1. #~ a = 1
  2. #~ a /= 17.5
  3. #~ a = (a * 100).floor
  4. #~ msgbox a
复制代码
这就是一个VA提供给我们的非常方便的功能。(我在说什么?
内嵌文档 [2012.10.04更新内容]
=begin=end包含的内容,RGSS3解释器会把它作为内嵌文档处理,即和普通注释一样忽略。
【例子】

  1. =begin
  2. 这里的代码不会被执行。
  3. 内嵌文档可以是多行内容。
  4. =end
复制代码
可以看到,内嵌文档时可以多行的。
一般我们使用内嵌文档做脚本的使用说明之类的会很方便。


这节到此结束。

作者: satgo1546    时间: 2012-10-2 17:09
继续凑热闹= =

奇妙的字符串运算
相信大家已经非常期待奇妙的字符串了吧~
我们在讲【msgbox函数与字符串】的时候,已经讲到了字符串这个概念了。
现在就是讲字符串的运算的时间了~变量不只是能代入数值,像字符串这些乱七八糟的东西都能代入的。
【例子】
  1. a = "Hello,world!" # 将“Hello,world!”这个字符串代入a变量中
  2. b = "a\nb\nc\nd"   # 将“a
  3.                    #     b
  4.                    #     c
  5.                    #     d”这个多行字符串代入b变量中
  6. c = "\x41\x42\x43" # 将“ABC”这个字符串代入c变量中
  7.                    # 提示:字符串中\x??这个转义字符是指:
  8.                    #       把??作为16进制数字,转换为ASCII码=??的字符
  9. d = '\n\n\n'       # 将“\n\n\n”这个字符串代入d变量中
复制代码
msgbox之后的字符串都可以作为值进入变量中。
字符串的加法
接下来就是奇妙的运算——a+b!
  1. a = "AB"
  2. b = "CD"
  3. c = a + b # 加号出现了!
  4. msgbox c
复制代码
就在第三行,c=a+b这里:a+b!
a+b就是"AB"+"CD",相当于把AB这个字符串和CD这个字符串合并成一个ABCD这个字符串,所以VA会显示:

字符串的乘法
有了加法自然有乘法,在数学里a*7=a+a+a+a+a+a+a,那么RGSS3中也是这样——
【例子】
  1. a = "Test"
  2. b = a * 7 # 乘号出现了!
  3. msgbox b
复制代码
我们可以看到RGSS3把a * 7解释成了a + a + a + a + a + a + a,就是——

字符串嵌入
这个在【变量和常量】中的最后介绍过,我就不啰嗦了。
结束语:字符串就是这么奇妙。(这叫结束语么?

本节到此结束。
作者: lcj123    时间: 2012-10-2 17:13
多谢楼主,受教了
作者: 铅笔描绘的思念    时间: 2012-10-5 22:23
标题: 控制结构
本帖最后由 铅笔描绘的思念 于 2012-10-7 11:51 编辑

咱也来凑个热闹把。。。。。话说把简单的东西都瓜分完了么。。。。。还有控制结构留下。。。

   一、比较语句      
比较语句就是大于 小于 大于等于 小于等于 等于之类的啦。。。记得还有不等于6 个运算符就是长这样的了:
==相等于
!=不相等于
<小于
>大于
<=小于等于
>=大于等于
这里一定要注意,判断相等的不是 = 而是 ==。在变量和常量这一节中H酱说过。。。。
在RGSS3中,赋值这个操作由等号来完成。等号的作用是将右侧的值给左边的变量。

所以等号(=)是赋值的语句啦。。。。一定要记住两个的差别。。。。
实例:
RUBY 代码复制
  1. x=10
  2. y=20
  3.  
  4. msgbox x>y #false
  5. msgbox x<y #true
  6. msgbox x==y #false
  7. msgbox x<=y #true
  8. msgbox x>=y #false
  9. msgbox x<=>y #-1   这里这种运算符是RGSS里没有提到的。。但RGSS3的ruby版本支持  这条实例的意思是如果x>y,return 1 ,x==y,return 0 , x<y return -1   不过这种没节操的运算符一般不会被用到。。。
  10. msgbox x!=y #true
我们看到。。除了那个没有节操的东西以外其他的p出的都是真假值。。这说明比较运算符主要用来判断,返回的是真假值。。。

  二、逻辑运算符   
逻辑运算符。。就是。。。eh。。eh。。。
在形式逻辑中,逻辑运算符或逻辑联结词把语句连接成更复杂的复杂语句。例如,假设有两个逻辑命题,分别是“正在下雨”和“我在屋里”,我们可以将它们组成复杂命题“正在下雨,并且我在屋里”或“没有正在下雨”或“如果正在下雨,那么我在屋里”。一个将两个语句组成的新的语句或命题叫做复合语句或复合命题。

看不懂没有什么大碍。。。。咱也看不懂。。。wiki上复制的。。。
rgss3上的逻辑运算符有一下6个。。。其实算是3个。。。英文运算符和符号运算符。。无论用哪个都是一样的。。但是英文运算符的优先级高于符号运算符(貌似?)
and
&&
「~,与,~」的意思
or
||
「~,或,~」的意思
not
!
「非~」的意思
VX帮助上的实例:
RUBY 代码复制
  1. p (100 > 77 and 1 + 1 == 2)         # => true
  2. p (100 > 77 && 1 + 1 == 2)          # => true
请无视p。。。。我们看到第一行和第二行表示的都是一个内容:100 大于 77 同时 1 + 1 等于 2  
而使用的方法却不一样  第一句使用的是英文运算符 第二句就是符号运算符。。这两个差别不大。。。
逻辑运算符的部分较简单就这样吧

三、条件控制语句
   条件控制就是事件中条件的条件分支。。。分为下面几个语句
   if  unless  case         if :如果    实例一只

  
RUBY 代码复制
  1. if age >= 12 then
  2. msgbox "adult fee\n"
  3. else
  4. msgbox "child fee\n"
  5. end
条件分支语法是这样的。。。
  if 表达式 [then]
    表达式 ...]
  elsif 表达式 [then]  
   表达式 ... ]...
  [else  
   表达式... ]
  end

若if的条件表达式为true时 执行then以下的表达式。。。若if的条件表达式为false时,将计算elsif的条件部分。。。elsif部分可以同时存在多个。。如果if部分所有的elsif部分都是false时  如果有else部分,则执行它的表达式题外:Ruby中只有false和nil代表伪值,其他都代表真。。0也是。。甚至空字符也是。。。

if 修饰句
例:msgbox "debug\n" if $DEBUG  
语法:表达式 if 表达式
当右边的条件表达式成立时,计算左边的表达式,并返回其结果。若条件不成立则返回nil。

话说好多。。。。。控制结构果然是最麻烦的了呢。。。。。。。好吧。。。未完待续。。。。@harinlen@satgo1546帮忙写完吧。。。@光的圆周率其实可以一起来哦。。。




作者: harinlen    时间: 2012-10-5 22:35
本帖最后由 harinlen 于 2012-10-6 22:01 编辑

逻辑混合运算

于是乎@铅笔描绘的思念SAMA已经讲过了逻辑判断符,那么,这些运算符的结果和具体的运算方式如何呢?
每一个真或假之间的运算都必须用和、或来连接,非的话放在句首,且只对一个值进行操作。例如:
  1. msgbox !true && true #结果:false
复制代码
运算过程:!true的结果是false,false&&true的结果是false。
具体运算过程我们可以这么考虑:和(&&、and)运算是个超级严格的老师,要求所有参与运算的东西必须是真,才能通过它的魔爪。即结果是真。
或(||、or)运算就是个⑨了,只要有一个参与运算的东西是真,那么,它算出的结果就是真。
非(!、not)运算就是个无赖,本来是真的能直接变成假的,本来是假的能直接变成真的。(紫妈?!)
于是就有了如下的运算:
  1. msgbox (true && true) || false #结果:true。真
  2. msgbox (true || true) && false #结果:false。假
复制代码
if语句的其他形式

有时候除了这种常见的if,我们还会遇到这种样式的写法:
  1. a=3 if jiecao == true
复制代码
这句话的意思是:如果变量节操是真的的话,那么就把3赋值给a。
而且,在if语句中,“==true”是可以省略的,也就是说,上面这句话可以写成:
  1. a=3 if jiecao
复制代码
这样就能解释非存在的意义了:如果我们想当一个值为负的时候,执行某一句话,相比于:
  1. a=3 if meiyoujiecao == false
复制代码
来说,我们可以更加简单的写成
  1. a=3 if !meiyoujiecao
复制代码
这个是很类似的C、C++式写法(因为是?嘛。。私激动了,没有看明白括号里的?嘛。。那就算了。。)。更加简单明了。
作者: satgo1546    时间: 2012-10-6 19:43
这次有抄袭部分……

unless ~ end
前面的都是用if来做条件分歧的。当要做如下判断时,用unless判断更方便。
【例子】
  1. if !tiaojian
  2.   do_something
  3. end
复制代码
如果用unless这个语句来做的话,就是:
  1. unless tiaojian
  2.   do_something
  3. end
复制代码
简单地说,if就是“在...条件下执行...语句”,这也是为什么无需在if中的条件==true的原因。
而unless就是“当...条件不成立时执行...语句”。这里条件中==false必须不写,要不然就会反掉,变成if了。
要注意的是,unless中不可以有else!例如下面这个例子是会出错的:
  1. tiaojian = true
  2. unless tiaojian
  3.   msgbox "false"
  4. else # 不允许这样做
  5.   msgbox "true"
  6. end
复制代码
unless 修饰子
话说unless也可以像if一样作为修饰子使用的,比如:
  1. msgbox "修饰子测试" unless tiaojian
复制代码
这就不多说了,和这是一样的:
  1. msgbox "修饰子测试" if !tiaojian
复制代码

本节到此结束。
新的一节开始了!
话说现在才发现没有抄袭= =
作者: satgo1546    时间: 2012-10-6 20:06
本帖最后由 satgo1546 于 2012-10-7 12:39 编辑

话说这次标题好长……

三联条件运算符
if的又一种变体(分身?),不过这次执行内容不是语句而是数字……
  1. a = (tiaojian ? 1 : 2)
复制代码
解释一下。
a =平常的赋值运算。
(左括号。
tiaojian这是条件。
?条件运算符,必须与“:”一起。
1真时值。
:条件运算符,必须与“?”一起。
2假时值。
)右括号。
这里的三联条件运算符就是a ? b : c中的?:
(a ? b : c)中,这个运算符是这样解释的:
当a是真时,返回b,否则返回c。

这样应该明白了吧。
[2012.10.07更新内容] 补充一点:a ? b : c中,?和:的两边必须有空格。
  1. a ? b : c # 三联条件运算符
  2. a?b:c # NoMethodError!
复制代码
截图如下:


运算符的优先级
运算符的优先级如下表(从高到低)*
[]、[]=数组下标、数组元素赋值
**次方运算
!、~、+、-取反、位取反、正、负
*、/、%乘、除、取余数
+、-加、减
>>、<<右移、左移
&位与
^、|位异或、位或
<=、<、>、>=小于等于、小于、大于、大于等于
<=>、==、===、
=~、!=、!~
无节操运算、相等、case语句中的判断、
正则表达式匹配、不等于、
&&逻辑与
||逻辑或
..、...Range对象(区间)表示用
a ? b : c三联条件运算符
=、%=、~=、/=、
*=、-=、+=、|=、
&=、>>=、<<=、
&&=、||=、**=
赋值、求余自运算、位取反自运算、加减乘除自运算、
位或自运算、位与自运算、左移右移自运算、
逻辑与自运算、逻辑或自运算、次方自运算
defined?是否定义
not取反
or、and逻辑或、逻辑与
if、unless、while、until如果真、如果假、当循环、直到循环修饰子
begin、endBlock表达式
——以上抄自《Ruby完全自学手册》

* 如果看不懂也没关系,其中的运算符要么就是以后会讲,要么……我也不懂
作者: smile-zt    时间: 2012-10-6 21:47
本帖最后由 smile-zt 于 2012-10-6 22:34 编辑

终于更了!(好吧..我许久没来了...PIA~)
运算符貌似比之前学到的多了好多!还是之前没好好听课啊我!@Mic_洛洛 觉得呢!至少那些"~","&","..","|","=~"什么的..没看懂怎么用..
下面会讲到的吧!
另外,辛苦HAR君,satgo君和铅笔啦~人民感谢你们!
---------------------------------------------------------------
稍微补充一下疑惑...
@铅笔描绘的思念
你那么多个"]"是怎么回事!!
但还是想问下,那个[then]是一定要加的么!还是说可加可不加,还是说单个执行语句的情况下可以不加,多语句就要加?
多语句的情况下,不知道是怎么进行划分的..总觉得很容易混乱...
作者: satgo1546    时间: 2012-10-7 12:42
本节懂得RGSS1/RGSS2的可以看,如果只是接触了RGSS3可略过

让p重新出现!
相信很多人都想让p重现吧……
事实上p还待在那里——不过要设置一下才行,而且只有按F12能显示,运行Game.exe不可使用p。
调试菜单中,选择显示主控台,前面打“√”即可。

接着就可以用p和print了。
  1. p 1 + 1
  2. p 3 ** 3
  3. p "ABC"
  4. print "ABC"
复制代码

不过p是p到那个黑乎乎的dos窗口里了:




作者: 铅笔描绘的思念    时间: 2012-10-13 19:23
本帖最后由 铅笔描绘的思念 于 2012-10-13 19:25 编辑

循环不怎么会。。。特别是迭代啊。。。。。。

由于ls说了把P弄回来的方法。。但是在控制台中。。。所以我提到可以推到Kernel来做到变成VX那样的。。。而这个Kernel是什么呢。。。我们看到在脚本里我们可以直接用msgbox来弹出提示。。。那我们的这个msgbox是什么呢。。。其实也是一种方法。。是是在系统预定义的一个类Kernel中定义的。。。所以我们这节来讲讲Kernel和Class, Module, Object之类的关系。。。
一、Kernel和Class, Module, Object的关系
关于这几个东西的关系我们来看几段代码。。。
RUBY 代码复制
  1. p Class.ancestors#Class, Module, Object, Kernel
  2. p Module.ancestors#Module, Object, Kernel
  3. p Object.ancestors#Object, Kernel
  4. p Kernel.ancestors#Kernel

RUBY 代码复制
  1. p Class.class#Class
  2. p Module.class#Class
  3. p Object.class#Class
  4. p Kernel.class#Module[/p]
由于懒我就使用p来代替msgbox了。。。。大家只需要像LS一样设置一样就好了。。。上面的代码。。英语好的不难理解ancestors和class的意思。。。我们知道Module是Class的父类.。。通过上面的代码可以看出Class, Module, Object 都是class,而Kernel是Module

因为Ruby里一切都是对象所以Object是RGSS中所有类的父类,Object混入了Kernel这个模块,所以Kernel中内建的核心函数就可以被RGSS中所有的类和对象访问。。。
2. Kernel
我们可以把Kernel理解为系统预定义的一些方法,我们可以在所有的对象上使用,使用时不需要使用类型作为前缀。。当然我们也可以加上Kernel。 比如
RUBY 代码复制
  1. Kernel.msgbox("Hello World!")
是一样的。。。。


各种球搞定循环什么的。。。。


作者: harinlen    时间: 2012-10-13 23:15
标题: 数组
本帖最后由 harinlen 于 2012-10-13 23:16 编辑

建立数组


  于是,继续主题。
  这次将介绍种新的……数据结构?嘛,这个不能叫做数据结构,最多也就称作一个集合吧。这个东西叫做数组。顾名思义,所谓数组,就是把一堆数绑在一组,起一个名字。于是就叫数组了。
  那么,怎么建立一个数组呢?能不能和一般的变量一样直接用呢?
  额……收敛点吧,变量让你随便用了,数组还是需要声明一下的。告诉RGSS3这货是个数组而不是变量。声明方法也不难,例如声明一个数组,内容为:54,6,9,10。(54酱、阿空、笨蛋、露米娅趟枪=3=)
变量叫做jiecao(节操?!),语句如下:
  1. jiecao = [54,6,9,10]
复制代码
嗯,就是这么简单。不过,话说要是当初没有想好放什么的话,可以建一个空数组,这么写:
  1. jiecao = []
复制代码
此时生成的jiecao数组就是空的,也就是……没有节操?
  要是我们想要初始的时候放很多个相同的数,比如:在节操数组中放上100个54。可以这么写:
  1. jiecao = Array.new(100,54)
复制代码
这个时候,我们就像jiecao数组中放了100个54。

读取数组


  那么,我们好不容易建立一个100个54的jiecao数组,怎么才能读取其中的一个呢?数组的读取其实很简单。比如调用第一个变量:
  1. jiecao = Array.new(100,54)
  2. msgbox jiecao[0]
复制代码
为什么这里写的是0而不是1呢?因为RGSS3中的数组,是从0开始的算的,也就是说,读取数组中的第k个数,需要调用数组中第k-1个变量。第1个变量在数组中的“编号”为0,自然是0了。
  可以看到,数组名+中括号+编号即可调用数组中任意一个变量了。
  那么,编号能不能是负的呢?(节操为负?!)
  可以,例如:
  1. jiecao = [54,6,9,10]
  2. msgbox jiecao[-1]
复制代码
输出结果应该是10。也就是说,负数是从后向前数的。而且最后一个数是-1。(因为第一个数是0,自然“前面的一个”就表示为-1,当然是最后一个了啊!)

更改数组中的数


  当然,如果要就是一个表放在那里的话,完全没必要弄个数组。正是因为我们可以对数组进行修改,数组才有存在的意义,不然这种东西丢掉就好……(←又是节操么= =)
  数组的修改也很简单,比如,我们要让jiecao[1]改成66,那么:
  1. jiecao = [54,6,9,10]
  2. jiecao[1] = 66
  3. msgbox jiecao[1]
复制代码
输出结果就是66了。这里再次运用了赋值符号“=”。

数组的整体输出


  记得以前用Basic写代码的时候,输出数组总是一件很烦人的事情。动不动就是从第一个一直写到最后一个,一个长长的输出语句,要不然就要写一个循环之类的东西。就没有简单的点办法么?
  RGSS3有一个超级bug的表示方法:
  还是jiecao数组,我们想一次性输出所有的数值,那么,可以这么干:
  1. jiecao = [54,6,9,10]
  2. msgbox jiecao
复制代码
运行后会发现,对话框里赫然写着:
[54, 6, 9, 10]

  怎么样,是不是很有意思?(殊不知多少程序员怒视这RGSS3啊……至少我是= =)
作者: harinlen    时间: 2012-10-13 23:22
↑ 高考前的最后之作
作者: fxwd    时间: 2012-10-14 16:38
每次我参加的活动都没勋章。。。好不容易看到一个却过期了。。。
作者: feizhaodan    时间: 2012-10-14 16:47
  1. module Kernel
  2.   alias last_p p
  3.   alias last_print print
  4.   alias last_msgbox msgbox
  5.   alias last_msgbox_p msgbox_p
  6.   def p(*args)
  7.     last_msgbox_p(args)
  8.   end
  9.   def print(*args)
  10.     last_msgbox(args)
  11.   end
  12.   def msgbox(*args)
  13.     last_print(args)
  14.   end
  15.   def msgbox_p(*args)
  16.     last_p(args)
  17.   end
  18. end
复制代码
一个非常213的脚本把p和print改成VX形式的。
解说:用alias来将原本的Kernel内的p、print、msgbox、msgbox_p函数改名,然后分别重新定义为p->呼出改名后的msgbox_p函数 print->呼出改名后的msgbox函数 msgbox->呼出改名后的print函数 msgbox_p->呼出改名后的p函数。


求其他人来解说吧对自己绝望了_(:3」∠)_
作者: satgo1546    时间: 2012-10-14 18:52
目录修过了吗……纳尼?这帖子变活动帖了!42L说[不会循环]我就写循环吧

循环
for ~ end
话说水区有人参加NOIP呢……啊跑题了……
for ~ end这个结构是计数循环的程序结构。就是比如从1数到100就可以用这个。
【例子】
  1. for i in 1..5 # 注意!是两个点不是三个点
  2.   msgbox i
  3. end
复制代码

结果是……
咚! 咚! 咚! 咚! 咚!
额好吧……我只是要说明弹出来5个框分别是1、2、3、4、5。
所以嘛,for就是根据后面的1..5,让i从1到5循环了5次。
i=1时,执行msgbox i;
i=2时,执行msgbox i;
i=3时,执行msgbox i;
i=4时,执行msgbox i;
i=5时,执行msgbox i。

for就是这么执行的。
如果是for i in 2..6呢?
弹出来的是2、3、4、5、6。
要注意的是,不可以用类似for i in 0.5..1.5这种的,因为可不是0.5、0.6、0.7、0.8、0.9、1.0、1.1、1.2、1.3、1.4、1.5这么简单,0.5和0.6之间还有0.51、0.52……0.51和0.52之间还有0.511、0.512……所以不可用小数。
另外,1..5中的1和5也可用变量,比如x..y。
最终の注意:
  1. for jiecao in 1..5
  2.   jiecao += 1 # 对jiecao变量的循环体内不可以对jiecao进行操作
  3.   # 就是说不能对循环节操……不不不,我是说对循环变量操作
  4. end
复制代码
貌似我也开始用节操变量了囧……
事实上【数组】一节中已经讲了如何输出数组……msgbox [54,6,9,10]即可。但是,如果不想用这样的方法输出呢?
  1. a = [54,6,9,10]
  2. s = ""
  3. for i in 0...a.size # 这里必须是三个点
  4.   s = s + a[i].to_s + "\n" # i.to_s 指的是把 i 转换成字符串
  5. end
  6. msgbox s
复制代码
前面一直强调要两个点,这里必须用3个点。
原因:数组下标是从0开始到数组的元素个数-1。而a.size是数组元素个数,这里3个点“...”在x...y中表示“从x开始到y-1结束”。
while ~ end
while ~ end结构是当型循环的程序结构。就是“当XXX条件下重复执行XXX,直到条件不满足为止”的循环结构,故名当型循环。
【例子】(抄自VA帮助)
  1. a = 0               # 変数 a に 0 を代入する。
  2. i = 1               # 変数 i に 1 を代入する。

  3. while i <= 5        # 変数 i が 5 以下の間ループさせ、
  4.   a += i            #   変数 a にそれぞれの i の値を加算する。
  5.   i += 1            #   変数 i の値を 1 増やす。
  6. end                 # ループ終了。

  7. p a                 # 計算結果を表示する。
复制代码
相信不难看懂~(众:其实是你不想翻译吧?)(我的确没学过日语= =)
于是提供谷歌翻译结果(原来谷歌翻得比我还离谱)

好了不扯了……
【例子】(这才是真正的例子,还是抄自VA帮助= =)
  1. a = 0               # 把 0 代入变量 a
  2. i = 1               # 把 1 代入变量 i

  3. while i <= 5        # 当 i ≤ 5 时重复执行
  4.   a += i            #   变量 a 加上 i
  5.   i += 1            #   变量 i 加上 1
  6. end                 # 结束循环

  7. p a                 # 显示计算结果
复制代码
会显示15。
为什么呢……?因为——
循环a的值i的值
初始01
1次后12
2次后33
3次后64
4次后105
5次后156
这段程序其实就是算1+2+3+4+5。
有了for的基础应该while很简单吧?(PIA

今天没什么时间了各位补完吧……
最后的召唤术MP-5@harinlen@feizhaodan@铅笔描绘的思念

作者: 铅笔描绘的思念    时间: 2012-10-15 21:26
标题: RE: 【活动】【VA】RGSS 3 入门教程大家写(更新12/10/14)
本帖最后由 铅笔描绘的思念 于 2012-10-15 21:29 编辑

吾辈最近无聊至极。。。。有机会碰电脑就来写教程好了。。。预定一下类和模块的教程。。。


函数  这里说的函数不是我们初二学的数学函数f(x)之类的东西。。。那货是数学定义。。咱这是计算机语言的。。数字的计算和字符串的显示等等。。。能够进行某种处理的被命名的功能称为函数。。。我们在RM里也可以称之为方法。。。

函数的使用  我们一直在使用的 msgbox 还有msgbox_p之类的。。。其实也是函数的一种。。。而我们也知道该怎么来使用它。。比如

msgbox “Hello world!”

之类的。。。当然也可以msgbox(“。。。。。”)之类的。。。效果一样。。处理msgbox以外还有许多VA已定义的方法(函数:以下就称方法好了。。。习惯了。。。 )比如rand它是生成随机数的一个方法。。
msgbox rand(100)

这个实例是显示出(0~99)中的任意一个随机数字的程序。。rand方法是从 0 到指定整数这个范围中随机选取一个数字并返回这个数的方法。。。。。这个指定整数也称之为参数。。。参数通常在方法名称后面的括号 () 内指定。。。
像msgbox和rand那样的方法已被系统预定义,所以称为系统函数(固有名词什么的。。。系统方法其实也可以。。)。

函数的定义函数的定义是从 def 开始到 end 结束。。。。具体的语法如下所示。。。。
def 函数的名称  
   函数的内容
end

函数名称的命名方法,基本上和变量有相同的限制。也能在开头使用大写字母。。但不推荐。。
比如下面的一个方法
def dice   
   return rand(6) + 1
end
msgbox dice              # 等同于 msgbox rand(6) + 1

这样一个方法是在一个新脚本中定义的。。所以不是一个类方法(关于类的教程下节。。。)

参数
  含有参数的方法,如下面示例那样定义。
RUBY 代码复制
  1. def abs(x)
  2. if x < 0          # 如果 x 小于 0 的话,
  3.      return -x       #   结束函数,返回值 -x。
  4. else              # 除此之外,
  5.     return x        #   结束函数,返回值 x。
  6.   end               # 分歧结束。
  7. end
  8. msgbox abs(-3)           # => 3

这个是返回指定参数数值绝对值的函数。这里指定的数值暂时定义为 x。这个 x 称为临时参数。。。也称形式参数简称形参。。又称虚拟变量。。就是不占用空间的(泥垢。。)。。  在函数内部使用有条件分歧,x 小于 0 时(为负数)返回值 -x,除此之外(为 0 以上的整数)返回值 x。最后一行是指定参数为 -3 的实际情况下使用函数,其结果用 msgbox 函数输出。与 x 为临时参数相比,这儿的 -3 称为实参数也称实际参数简称实参。。。。其实就是变量一只。。。

  含有多个参数的函数也能定义。。。多个参数要用逗号分开来指定。。。
默认参数

定义方法时就已指定且使用时可以省略的参数称为默认参数。默认参数是在临时参数后面加上符号 = 来指定的


比如上面的rand(6)+1的方法
def dice(n=6)
   return rand(n) + 1
end
msgbox dice              # 等同于 msgbox rand(6) + 1

上述示例中未指定参数,使用方法时会返回一个 1~6 的随机数字,然而指定参数的话,就能更改随机数字的最大值。比如,使用 dice(8) 就会返回一个 1~8 的随机数字。
函数的重定义下面的示例中,hello 名称的函数被重复定义了 2 回。
RUBY 代码复制
  1. def hello
  2. return "您好"
  3. end
  4. def hello
  5. return "晚安"
  6. end
  7. msgbox hello         # => "晚安"

在 Ruby 中,函数名称重复的话不会出现错误。这种情况下系统会认定后面定义的函数有效,而先前的定义就无效了。
纯引自重额。。。其实改了一点。。。来源VX  F1


其实还有过程式方法   对象方法之类的。。。= = ||  果然方法什么的不是想萝莉(洛洛?)那样身轻体弱易推倒的。。。。。。不过剩下的都不是重点了。。。我|(·_·) |·_·) |_·) |·) | )闪先。。。


作者: t8235184    时间: 2012-10-16 10:53
感觉要学的太多了。
作者: fxwd    时间: 2012-10-16 20:00
satgo1546 发表于 2012-10-14 18:52
目录修过了吗……纳尼?这帖子变活动帖了!42L说[不会循环]我就写循环吧

循环
for ~ end

这个貌似技术区有了。。。
作者: fxwd    时间: 2012-10-16 20:02
铅笔描绘的思念 发表于 2012-10-15 21:26
吾辈最近无聊至极。。。。有机会碰电脑就来写教程好了。。。预定一下类和模块的教程。。。


函数  这里 ...

脚本渣表示虚拟变量也是占空间的。。。
作者: 铅笔描绘的思念    时间: 2012-10-16 21:59
标题:
说好的上的话就更。。。。话说洛洛的经验-1真的难以吐槽。。。。喵的。。。咱以后得想H酱扯到54一样扯到你么。。。。



  PS:话说一个字的标题就是看着不爽啊。。。。
  一、类的定义、类的实例方法
  1. class Person
  2.   def say
  3.     msgbox “Hello!”
  4.   end
  5. end
  6. luoluo = Person.new
  7. luoluo.say
复制代码

我们看到va默认脚本中(除了Vocab之类的)都有class XXXX之类的。。。而这个class就是声明类的关键字def就是创建了一个方法。。。下面的
  1. luoluo = Person.new
复制代码
就是把Person类给实例化了。。则luoluo(洛洛)就是实例化的对象了。。。。 = = ||(为了1经验还是要报仇的。。)然后是
  1. luoluo.say
复制代码

就是调用了luoluo这个实例对象的实例方法。。。(话说这段真的是有多讨打啊。。。)
定义一个类的语法
class ClassName
  def method_name(variables)
    #some code
  end
  end

二、特定对象的方法
VA里,我们可以为一个对象单独定义方法。。。比如
  1. class Person
  2.   def say
  3.     msgbox “Hello!”
  4.   end
  5. end
  6. luoluo = Person.new
  7. def luoluo.bye
  8. msgbox "bye"
  9. end
  10. luoluo.say #Hello!
  11. luoluo.bye #bye
复制代码
三、重定义方法    方法的重定义一模一样。。后面的定义会覆盖前面的定义。。不讲了。。。
   众:你太懒了!!
四、重新打开类
  Ruby里我们可以再打开一个类,向这类添加方法。。。我们一般不要拆开类的定义,因为那样不好理解,拆开类的一个原因是将它们分散到多个文件里。。
比如
  1. class Person
  2.   def say
  3.     msgbox “Hello!”
  4.   end
  5. end
  6. class Person
  7.   def bye
  8.     msgbox “bye”
  9.   end
  10. end
  11. luoluo = Person.new
  12. luoluo.say #Hello!
  13. luoluo.bye #bye
复制代码
。。稍微有点多。。。。。五、实例变量
好了。。下面都是是重点了。。。。。
实例变量主要是用来记录单个对象的状态。RM实例变量有以下特点   
  1. class Person
  2. def name
  3.   @name = “54酱”
  4. end
  5. def say
  6.   msgbox “#{@name}无节操”
  7. end
  8. end
  9. person = Person.new
  10. person.name
  11. person.say#54酱无节操
复制代码


六、初始化对象状态
每当实例化一个新对象是,就会寻找initialize方法,然后执行该方法。。。。我们可以用initialize方法将预设值加入所有实例变数。。就不需要在其他地方定义再使用了。。
  1. class Person
  2.   def initialize(name, age)
  3.     @name = name
  4.     @age = age
  5.   end
  6.   def age
  7.    @age
  8.   end
  9.   def name
  10.     @name
  11. end
  12. end
  13. luoluo = Person.new("洛洛", 20)
  14. msgbox luoluo.age #20
  15. msgbox luoluo.name #洛洛
复制代码

当然我们可以不需要给initialize方法参数直接执行一些语句也是可以的。。。
。。。喵的。。。给跪了。。。好多啊。。。。3000+了。。。。。读写属性之类的好多啊还有。。。。。。。。。。。。。明天补完好了。。。趴了。。
作者: candy2266    时间: 2012-10-18 12:19
本帖最后由 candy2266 于 2012-10-18 12:21 编辑

实例变量


引用楼上的话:
好了。。下面都是是重点了。。。。。
实例变量主要是用来记录单个对象的状态。
RM实例变量有以下特点:
•以@开头
•只对单个对象可见
•不管在类的任何地方定义,在别的地方使用都是同一个


注意第2条,第2条的意思可以引申为,在别的对象外,若要访问实例变量的话,必需要通过方法访问。

RUBY 代码复制
  1. class Person
  2.     @name="xx君"
  3. end


如果只是在上例子的对象里“参考”@name,这样定义就可以了。
但是如果想从对象外访问它的话,那么就不可以了。
在类下直接定义一个@的实例变量,个人感觉类似于JAVA中的private修饰符,必需用方法访问。

所以若要在外部访问到@name,代码应如下
RUBY 代码复制
  1. class Preson
  2. #下面是从实例中取得@name值的方法
  3.   def name
  4.     @name
  5.   end
  6.  
  7. #下面是给name赋值的方法
  8.   def name=(value)
  9.      @name=value
  10.   end


当然真的直接写在类里变量,我们用的是类变量,这样就可以在外部直接访问到它的值了。
RUBY 代码复制
  1. class Person
  2.     @@name="xx君"  #类变量首字母以@@开头
  3. end






作者: satgo1546    时间: 2012-10-18 13:02
循环】之类的东西还是只能我来补完么……
循环[续]
上次讲到while循环,那么现在继续……
loop do ~ end
RGSS3中loop do ~ end结构是死循环结构。(说得真直接= =)【例子】
  1. loop do
  2.   msgbox "循环"
  3. end
复制代码
上面的程序会没完没了地弹出“循环”两字。
如果你输入了这个代码并且运行了……那么解决方法是按住F12再点右上角的叉叉!
这类目前没用的东西就不多讲了,讲了也是摧残电脑。
循环中的break
为什么刚才要说目前没用呢——学完了break程序结构之后那个死循环就有用啦~
break这个程序结构只能在循环中使用(可以在for、while、loop do等任何循环结构中使用),用途是中断循环
这样loop do就可以显出它的用途了。
【例子】
  1. i = 0 # 伪·循环变量的初值
  2. loop do
  3.   i += 1
  4.   msgbox i
  5.   break if i >= 10 # if语句的修饰子应用,不知道的请看【控制结构】一节
复制代码
上面这个例子输出结果是1、2、3、4、5、6、7、8、9、10。
跳过本次循环(进入下一次循环)
这里用到了next程序结构,意思是跳过本次循环,进入下一次循环
【例子】
  1. for i in 1..5
  2.   next if i == 3 # 当i=3的时候跳过这次循环
  3.   msgbox i
  4. end
复制代码
这个程序结构在实际编写中用得不多。

循环什么的到此结束了,如果脑子里一片浆糊请点评= =

作者: 独孤酱油    时间: 2012-10-24 12:12
先顶再看
作者: hcm    时间: 2012-10-25 13:40
本帖最后由 hcm 于 2012-10-25 13:47 编辑

【新手菜单】第五章 给半身像和一些信息加框分类排版
【新手菜单】美化第4章是到这个程度:

所有人都在同一个框中的,现在准备向下图的效果再靠拢一些:

首先,找到Window_Base●的
  1.   #--------------------------------------------------------------------------
  2.   # ● 绘制角色半身肖像图
  3.   #     enabled : 有效的标志。false 的时候使用半透明效果绘制
  4.   #--------------------------------------------------------------------------
复制代码
的部分,修改为【这样半身像的规格就变成了(4 * 152)*(2 * 285),此规格为640*480的分辨率4人战斗队伍定,分辨率作战人数不同可按比例缩放素材】
  1.   def draw_HalfBody(face_name, face_index, x, y, enabled = true)
  2.     bitmap = Cache.HalfBody(face_name)
  3.     rect = Rect.new(face_index % 4 * 152, face_index / 4 * 285, 152, 285)#此处285为半身像高,152为宽,想加还可以加长
  4.     contents.blt(x, y, bitmap, rect, enabled ? 255 : translucent_alpha)
  5.     bitmap.dispose
  6.   end
复制代码
为了方便加框,接下来脚本就不要动了,
然后用PS把半身像素材也做成(4 * 152)*(2 * 285)的,自己找一些满意的边框素材直接给图片放上,
然后找到Window_MenuStatus●的
  1.   #--------------------------------------------------------------------------
  2.   # ● 绘制项目
  3.   #--------------------------------------------------------------------------
  4.   def draw_item(index)
  5.     actor = $game_party.members[index]
  6.     enabled = $game_party.battle_members.include?(actor)
  7.     rect = item_rect(index)
  8.     draw_item_background(index)
  9.     draw_actor_HalfBody(actor, rect.x, rect.y, enabled)
  10.     draw_actor_name(actor,rect.x, rect.y+196)
  11.     draw_actor_class(actor,rect.x, rect.y+196+line_height*1)#rect.y-206-line_height*1,)
  12.     draw_actor_icons(actor,rect.x,rect.y+196+line_height*2)
  13.     draw_actor_level(actor,rect.x, rect.y+196+line_height*2)
  14.     draw_actor_hp(actor,rect.x, rect.y+196+line_height*3)
  15.     #draw_actor_mp(actor,rect.x,rect.y+196+line_height*5)
  16.     #draw_actor_tp(actor,rect.x,rect.y+196+line_height*6)
  17.   end
复制代码
按自制图片外框的规格把各信息的坐标调好即可,
虽然像第四讲的直接用菜单背景图片也可以,但那样即使只有一个角色也会显示全部分隔框,不想显示多余的可以参考这方法。

现在的效果.jpg (130.39 KB, 下载次数: 31)

比原来好多了吧

比原来好多了吧

作者: satgo1546    时间: 2012-10-25 18:26
突然……突然发现我们其实在汉化F1……
作者: hcm    时间: 2012-10-26 12:48
本帖最后由 hcm 于 2012-10-26 12:55 编辑

对角色的【状态】说明的美化:
【新手菜单】美化第四章中,讲过半身像如何放到菜单人物状态那里,
这次在此脚本基础上讲一下如何美化每个角色单独的状态说明,像这样有个人物全身特写的


但是这样我就不建议在菜单中使用半身像了,使用修改到如下程度菜单作为基础修改(只是因为《萝莉的远征》在菜单中使用的是头像),


但是,脚本不能少,我指的是要把半身像菜单还原回头像菜单,因为之后修改角色独立的状态栏肯定要用到。
修改回的话就把
  1.   #--------------------------------------------------------------------------
  2.   # ● 绘制项目
  3.   #--------------------------------------------------------------------------
  4.   def draw_item(index)
  5.     actor = $game_party.members[index]
  6.     enabled = $game_party.battle_members.include?(actor)
  7.     rect = item_rect(index)
  8.     draw_item_background(index)
  9.     draw_actor_HalfBody(actor, rect.x+1, rect.y, enabled)
复制代码
中的HalfBody改回face即可。(其实这步不做也行,但【状态】比Exc菜单的人物形象大会好看一些吧)

相应的,找到Window_Status中的
  1.   #--------------------------------------------------------------------------
  2.   # ● 绘制区域 2
  3.   #--------------------------------------------------------------------------
  4.   def draw_block2(y)
  5.     draw_actor_face
复制代码
把face改为HalfBody,
然后在每个draw_XXXXX后面的括号内把不同信息的坐标调整好即可。
作者: Mr丶木头    时间: 2012-10-26 15:25
稀饭大婶们教脚本,这次好好学RGSS3,接触了5年RM都没有认真研究过脚本……{:2_271:}
作者: satgo1546    时间: 2012-10-26 19:27
嗯……函数表示被某铅笔吃了。。对象貌似也被吃了。。数组吃了,哈希表——{:2_270:}找到一个很好的东西可以讲……
表示上面用兔子是特例,我一般还是用猫的

哈希表
「对数组的扩充」
其实哈希表本来就是变异的数组(当然不涉及DNA之类的)……
之前说过,数组的调用方式是a[x],其中a是数组名,x是下标(0~数组元素个数-1)。而哈希表的调用方式就是hash[key],其中hash相当于刚才的a,key——在数组里面是数字,而在哈希表中可以是任何东西——前提是你先添加一个元素,下标是这个东西。
【例子】
  1. a = [66,77,88] # 论坛三宠物……好吧我多余了
  2. b = {"六六" => 66,"七七" => 77,"八八" => 88} # 论坛宠物的哈希表
  3. # 注意哈希表是大括号声明的
  4. msgbox a[0],a[1],a[2]
  5. msgbox b["六六"],b["七七"],b["八八"]
  6. # 调用时都用中括号
复制代码
两次弹出的内容是一样的。
由此可见,当需要使数组元素的“名字”更为直观的时候,可以使用哈希表,除此之外哈希表与数组没有任何区别!
哈希表常用方法(确认方法已经被吃了)
在哈希表中可以用一些方法来判断某元素是否存在于哈希表中。
【例子】
  1. hash = {"one" => "!","two" => "@","three" => "#"}
  2. msgbox hash.include?("one") # => true
  3. msgbox hash.include?("four") # => false
复制代码
include?传递的参数是下标。不用解释了吧。一些注意点
哈希表是没有顺序的。

本节到此结束。(好短大概是因为数组讲过了

作者: jacksiang    时间: 2012-10-27 17:35
harinlen 发表于 2012-9-24 21:46
有人可能会看不懂这是啥,嗯,不懂也没关系,接着看(坑)就是了。
既然RGSS3是个脚本,用来和计算机交流的 ...






作者: harinlen    时间: 2012-10-27 22:06
jacksiang 发表于 2012-10-27 17:35

额,君的脚本里面是怎么写的啊?
作者: jacksiang    时间: 2012-10-27 22:17
harinlen 发表于 2012-10-27 22:06
额,君的脚本里面是怎么写的啊?

把你给的脚本放在main的右侧空白处(原本的文割除了),一测试游戏就这样
或者是main下面擦人一个新脚本,右侧放大大的脚本,还是这样啊
作者: harinlen    时间: 2012-10-27 22:34
jacksiang 发表于 2012-10-27 22:17
把你给的脚本放在main的右侧空白处(原本的文割除了),一测试游戏就这样
或者是main下面擦人一个新脚本 ...

额,不应该啊?喵……弄张截图撒?
作者: 小枫修    时间: 2012-10-28 05:32
harinlen 发表于 2012-10-27 22:34
额,不应该啊?喵……弄张截图撒?



main的下一个空白条也试了,『人口』也试了
作者: harinlen    时间: 2012-10-28 13:38
就是啊,额,话说前面插件脚本的0是什么= =把那个删掉看下= =
作者: 小枫修    时间: 2012-10-28 15:37
harinlen 发表于 2012-10-28 13:38
就是啊,额,话说前面插件脚本的0是什么= =把那个删掉看下= =







目前只有3个我添加或修改。。。。
一个是物品提示脚本,我不会使用所以就随便放在那里了
作者: 小枫修    时间: 2012-10-28 22:08
我再试试吧,~
成功了叫你

作者: 千城落水千城梦    时间: 2012-11-2 22:30
方便了大家,只不过本人不打算学习RGSS3脚本。如果它能和易语言一样简单的话倒是可以考虑。

作者: satgo1546    时间: 2012-11-8 18:54
6R终于在{:2_272:}一番之后恢复了……于是乎教程时间到~

场景类
这一节之前的声明在学习这一节之前,请先做下面两条动作中的一条:

原因很简单,我们以后的例子不再弹窗,也不再寄居在Main里面啦!
场景是什么
我们先来看几张图片吧。(不要吐槽游戏之类的……我只是想说明这是场景)PS:由于论坛时不时抽,图看不到请刷新

↑菜单界面

↑物品界面

↑存档界面
各种界面(或者说,场景)组成了一个游戏,包括物品、技能、存档、菜单、地图、结束、标题、装备、状态……
而这就是今天要讲的:如何创建一个场景!
选择场景的理由
还记得那个HelloWorld吗?
不过你有没有注意到,在一个正经的游戏里面没有一个弹出窗口?
不使用弹窗的原因有很多:

这就是为什么要用到场景了。
建立自己的场景(1)
前面说过这个概念了。其实在RGSS3中,每个场景都是一个类。
不过这个类里的刷新画面之类的基础代码不需要你自己来写,RGSS3已经提供了最最基础的场景类代码,就藏在那呢——


场景的箭头下方,一大堆Scene开头的类就藏在那里呢。
不过我们这节课的目标不是修改而是自己建立一个新的场景!
那么,建立在哪里呢?
建立自己的场景(2)
那么我们的场景建立在……插件脚本上!

PS:只是推荐建立在这里,不过要用Scene的话必须建立在Scene_Base脚本的下面。无特殊喜好的话推荐在插件脚本处。
然后给脚本页写一个名字,名字随便(只要能表达脚本页的主要内容即可),不推荐留空
接着就在右边写脚本了~
下面说明一下一般写(场景类)脚本的步骤:
于是我们的脚本页就变这个样子了~
PS:某个特别好玩(方便快捷!强烈推荐使用)的快捷键叫F6……光标定位在第二行“场景名字”这里,F6一下……结果自己知道!
建立自己的场景(3)
这一次以一个简单的空白场景为例,演示如何建立场景。
步骤列表:
首先搭建场景框架。
  1. #==============================================================================
  2. # ■ 空白场景
  3. #------------------------------------------------------------------------------
  4. #  一个完全空白的场景。
  5. #==============================================================================

  6. class Scene_Blank < Scene_Base
  7. end
复制代码
由于这是空白场景,因此对这个Scene_Blank类什么也不用做,放在那里即可。
接下来是很重要的一步:将这个场景和其他场景连起来!
由于这个空白场景与什么场景都没有连接,因此我们需要将其与其他的场景连起来。这里以作为初始场景为例。
初始的一个场景不再像RGSS2一样需要有各种数据处理,我们只需……
  1. module SceneManager
  2.   #--------------------------------------------------------------------------
  3.   # ● 获取最初场景的所属类
  4.   #--------------------------------------------------------------------------
  5.   def self.first_scene_class
  6.     $BTEST ? Scene_Battle : Scene_Blank # 在此处修改
  7.   end
  8. end
复制代码
就行了!真的,就是如此简单!
于是我们的脚本页,应该是这样的:

好了,保存,执行。
怎么什么也没有?

对,就是什么都没有。我们并没有对Scene_Blank做任何改进,因此就是一抹黑。

这就是一堆代码导致的结果

下一节:为场景添色彩,敬请期待……

作者: harinlen    时间: 2012-11-9 17:17
satgo1546 发表于 2012-11-8 18:54
6R终于在一番之后恢复了……于是乎教程时间到~

场景类
这一节之前的声明在学习这一节之前,请 ...

这……怎么上来就是场景了啊……模块什么的都还没说DA☆ZE?
要不先把module和基本画法普及了再说?实在不行先把API的调用普及了吧……
作者: satgo1546    时间: 2012-11-11 17:10
模块 # 72#,2336
PS:两个字的标题看着就爽
谜之“类”
我们在类 (#52)处说过:
我们看到va默认脚本中(除了Vocab之类的)都有class XXXX之类的。。。
于是Vocab之类的就是今天的重点啦><
现在我们把module什么的也当做一个特殊的“类”来处理,看看下面的例子吧。
【例子】 # 话说好久没用这个颜色了呐~
  1. module Sky
  2.   @clouds_size = 0
  3.   def self.add_one_cloud
  4.     @clouds_size += 1
  5.   end
  6.   def self.get_clouds_size
  7.     return @clouds_size
  8.   end
  9. end
  10. Sky.add_one_cloud
  11. msgbox Sky.get_clouds_size # => 1
复制代码
我们看到输出了1
类 (#52)的代码中有这么一句:
  1. luoluo = Person.new
复制代码
这里Person.new让Person这个类实例化了。
而此处的代码中的这一句:
  1. Sky.add_one_cloud
复制代码
却是直接调用Sky这个“类”。那是因为……
  1. module Sky
复制代码
看到了吗?这里是module而非class!于是就直接用Sky而不是Sky.new将Sky“类”实例化了。
module,就是今天要讲的模块
模块与类的异同 # 貌似我一点也没写过“同”……
某个题外话
其实最上面的例子的意思是……

由于各种原因发现居然没有讲模块……于是补完
作者: DeathKing    时间: 2012-11-16 09:12
  看到这个帖子,我们欣慰,似乎是大家又兴致勃勃的开始写“RGSS3”教程了。然而,我却又感到困惑:对于RGSS、RGSS2的教程,先贤(或者说先贤们)早有尝试,而鲜获成功,为何?@IamI君的一席话倒是道出了真相:
写 RGSS 教程的实则实在讲 Ruby ,讲 Ruby 的却又大多照搬F1。

  没有看清这个事实的人,也变就一遍一遍的重复先贤们干过的事。事倍功半。对于这个问题,我思考了很久,想到了下诸几个事:

  当然,想要编写脚本,你就需要对 Ruby 至少有 90% 的了解,也就是说,对 Ruby 的用法、概念(尤其是 OO )要有相当的熟练度。然而,就算你对 Ruby 达到了 100% 的熟练,也未必能够写出脚本,因为你缺乏对 RGSS 系统的理解。举个例子,请看这段代码:

RUBY 代码复制
  1. $scene = Scene_Map.new


  若是有一点 Ruby 知识的人,就会很容易明白这句话的意思:无非是实例化一个 Scene_Map 对象,并用 $scene 来接收而已。对,的确是这样,然而,这样做又有何意义呢?如果你不从 RGSS 的角度去分析,他就始终是个简单的实例化、赋值。任何一个有RGSS、RGSS2脚本编写经历的人都会知道,这个是将场景转换到地图界面的语句。

  然而对于第三个问题,我则不置褒贬。RGSS 系统现在有三个版本,很多人尝试着让脚本在三个系统间兼容,以及与其他作者编写的脚本兼容,这些都是工程上的问题。我们确实需要引入一些方法来解决这些问题。然而,如果我们在这方面过于苛求,则会让软件开发原则中哪些繁文缛节把问题更加复杂化。因此,我们为 RGSS 教程中应该合理的、适度的介绍在编写脚本的时候在工程方面应该注意的问题。这个也是先贤们没有做到的。

  说了这么多,实际上是为了引出我现在做的工作,12年(也就是今年)的早些时候,我发表了 RGSS3 小探系列报告(真正意义上的发表只有一篇),通过报告,我发现 RGSS3 与 RGSS2 以及 RGSS1 有着很大程度上的不同,给新手造成的疑惑也更多。因此,本着“授人以鱼不如授人以渔”的精神,我以报告为基础,着手撰写了《深入理解RGSS——RGSS3导引》。

  


  这个文集,从三个方面入手:剖析、实战、工程。先从分析 RGSS3 的结构,从原理层面上去阐述 RGSS3 的工作原理(例如,对话框是如何实现的,这对自己编写脚本很有意义),来使读者了解到怎么使用 RGSS3 。实战部分则关注如何去编写脚本,从实际出发,去考虑问题。最后工程方面则是介绍兼容、移植等内容。

  这个文集由于我个人的原因现在处于坑化状态中,我也不太确定最后是否能够填上。然而,我希望我写这个文集的思路能给诸位启发,合理的、高效的组织好教程,为社区干点真正的、有意义的事。

  而不是像拓路的先贤那样——永动无功。

作者: harinlen    时间: 2012-11-18 12:04
DeathKing 发表于 2012-11-16 09:12
  看到这个帖子,我们欣慰,似乎是大家又兴致勃勃的开始写“RGSS3”教程了。然而,我却又感到困惑:对于R ...

严重同意DK神触观点……
本来当初写这个教程是打算用通俗易懂甚至吐槽一样的语言把RGSS3的教程写完……但是,准备面临FIRST IMPACT(EVA语,指High考= =)的私心有余而力不足啊……确实不想翻炒F1,但是……唉……

私想说的话……也就是DK触最后红字的部分了……私回来后会效犬喵之劳DA☆ZE~!

------某偷偷起来改改墓志铭的H酱
作者: 司马睿风    时间: 2013-1-18 00:33
常量和变量2

    吐槽:很久没回来,都出了RPG VX A了。虽然我电脑上的ruby已经更新到1.9.2了,花了一两分钟看了下教程,发现变量解释还有不足,我给补充上。
RUBY 代码复制
  1. crr =[1,a,s_13,%$#,54687]
  2. p crr.2


    看看以上的代码,定义一个数组 crr 并且我向其中存入数组数据。这个地方有点涉及到定义的类型,我这里存入了数字,英文,字符串等类型(当然,ruby中是不需要定义数据类型的,随意存储)。
    crr 是我定义的一个变量,在ruby中变量可以存储不同类型的数据,所以在RGSS中与一般编程语言不同的是,变量可以任意更换各种数据类型而不需要重新来个 integer
    又比如

RUBY 代码复制
  1. if (/^HTTP\//i =~ d) != nil  
  2.       $statu = d.split(" ")[1]   
  3.       if not /^(200)$/ =~ $statu  
  4.         puts "download file Err, statu #{$statu}"  
  5.         downing.kill   
  6.         exit   
  7.       end

    这是我书写的一个ruby下载MP3小程序里的一行代码。这里变量$statu被我引入了一个返回值,注意$statu = d.split(" ")[1] 这里 "="号后面的返回结果是一个数值,不是某个函数方法。在ruby中变量后面跟到某个函数过程,这个变量必定是被赋值一个返回结果,即使这个结果是个nil(为空)


    这里再补充一点小东西吧~在ruby中,print “” 和print ‘’是有区别的,MSGBOX之类的大致上也类似。
RUBY 代码复制
  1. @a1 = "abc"
  2.  
  3. p "ABC@a1"# => "ABCabc"
  4. p 'ABC@a1' #=>"ABC@a1"


如果在你P的内容中包含一个变量,那么在" "号中,P的结果会返回你的变量的数值,而' '号则返回p的具体的字符内容。
作者: mengjing    时间: 2013-1-18 17:48
先来观察一下..
不过主要都是不懂脚本的问题
作者: 神秘来客3    时间: 2013-2-13 16:06
请楼主不要介么无聊了……
作者: zhangchi5    时间: 2013-2-13 18:08
candy2266 发表于 2012-10-18 12:19
实例变量

class Tests
  @@a=0
  def initialize
    @@a=@@a+1
  end
  
  def geta
    @@a
  end
  
end

pa = Tests.new
msgbox pa.geta

pb = Tests.new
msgbox pa.geta
msgbox pb.geta


结果: 1 2 2
作者: zhangchi5    时间: 2013-2-13 18:39
本帖最后由 zhangchi5 于 2013-2-13 18:40 编辑

RGSS3: class Window

RGSS中有一个叫Window的类,主要用于创建窗口。
这一节我们将分别讨论各种窗口
Window: The Simple Window
基本的窗口就是一个没有任何东西的窗口。建议不要使用RGSS内置类Window,而用Window_Base
【创建方法】
Variable = Window_Base. new (x, y, w, h)
你将可以在x,y位置创建一个长宽为w,h的窗口
Sample

RUBY 代码复制
  1. class Scene_Test < Scene_Base
  2.   def post_start
  3.     super
  4.     @newwindow = Window_Base.new(0,0,Graphics.width,Graphics.height)
  5.   end
  6.   def update
  7.     super
  8.     @newwindow.update #可以用update_all_window替换
  9.   end
  10.   def pre_terminate
  11.     super
  12.     @newwindow.dispose
  13.   end  
  14. end


Picture:







作者: zhangchi5    时间: 2013-2-13 20:03
Window: The Simple Window with Animation(带动画的窗口)
窗口是可以有动画的。不过在这之前还要介绍一下Window_Base类以及Window类的一些方法与属性
【方法】
dispose     释放
open       打开动画
close       关闭动画
show       显示窗口
hide        隐藏窗口
activate       启用窗口
deactivate     冻结窗口
【属性】
openness     开启度
opacity        透明度
x, y, width,height     在此不解释了
z                  窗口深度。Z大则窗口在上面
【提示】部分Window类里的属性并没有给出我认为那是不重要的详细可以参阅RMVX/ACE帮助文档
【动画效果】
窗口打开(window.open)与关闭(window.close) 【之前预处理window.openness=0
窗口淡入(window.opacity= window.opacity+16)淡出(window.opacity= window.opacity-16)【之前预处理window.opacity=0
窗口色调改变:全黑到亮(window.tone=Tone.new(0,0,0,window.tone.gray+16))全亮到黑(window.tone=Tone.new(0,0,0,window.tone.gray-16))【之前预处理window.tone=Tone.new】【使用这个是要先执行update函数的super
窗口飞进来【window.x=window.x+1】【预处理window.x=-window.width

Sample
这里注意一点,我在上一个帖子里没有注意的问题:
任何元件的创建都在start函数里,释放都在terminate函数里。

RUBY 代码复制
  1. class Scene_Test < Scene_Base
  2.   def start
  3.     super
  4.     @newwindow = Window_Base.new(0,0,Graphics.width,Graphics.height)
  5.     @newwindow.openness=0
  6.   end
  7.   def post_start
  8.     super
  9.     @newwindow.open
  10.   end
  11.   def update
  12.     super
  13.     @newwindow.update #可以用update_all_window替换
  14.   end
  15.   def per_terminate
  16.     @newwindow.close
  17.     super
  18.   end
  19.  
  20.   def terminate
  21.     @newwindow.dispose
  22.     super
  23.   end  
  24. end




Picture:






作者: 忧雪の伤    时间: 2013-2-13 20:35
本帖最后由 忧雪の伤 于 2013-2-13 20:53 编辑

UI> 我沒時間全部看完所以隨便指出一點應該是錯誤的地方。
Ruby 的常量指的是以大寫字母開始的標識符。而不是整數之流。
常量是可以賦值的。例如 Foo = 0 。
Fixnum、Symbol 和 nil/true/false 的名稱是「立即值」。
而且,在if语句中,“==true”是可以省略的

這顯然是錯的。if 只不過是右邊不為 nil/false 。
用一個例子來說明就是。
  1. foo = 0
  2. msgbox true if foo == true
复制代码
大括号内的东西是个变量,按照变量输出。

這顯然是錯的。大括號不過是把其中的值 to_s 。這不一定是變量。
Foo = 0
msgbox "#{Foo}"
msgbox "#{0}"
告诉RGSS3这货是个数组而不是变量

數組和變量完全沒有直接關係。數組是對象。變量是標識符。
这里用了def self.add_one_cloud来定义方法——self.是必须的,否则会导致各种奇怪的事情发生= =

實例方法和特殊方法的差別……可以參考這個帖子上文中函數的部份。
作者: harinlen    时间: 2013-2-13 22:50
嘛……出来改改墓志铭什么的。
作者: 忧雪の伤    时间: 2013-2-14 11:18
本帖最后由 忧雪の伤 于 2013-2-17 12:23 编辑

塊 - Block

前言
Ruby 中被 { } 括起來的就是塊 —— 這當然不包括 Hash
也許你會感到陌生,但實際上塊廣泛出現在你的視野,以一種隱性的形式。
這指的是 for .. in
實際上這個控制結構就是調用了 each 方法。
用一個例子來說明就是。
  1. for i in Object.new
  2. end
复制代码
會報 NoMethodError
那麼什麽是 each 方法呢。它涉及到 Ruby 中迭代的觀念。實際上迭代就是調用帶塊的方法。
那麼什麽是塊呢。它是一個代碼段。注意它並不會直接處理。而是要你提醒程序去處理塊。
上文的 for .. in,對於一個數組來說,實際上可以看做 [].each {|i| }
處理時會用這個數組的每一個元素傳遞到 i 中,並且處理所帶塊中的代碼段。
例如。
  1. [0, 1, 2].each {|i| msgbox i }
复制代码
在一般情況下,這可以和 for .. in 互換,雖然它們是有差別的,但我不會在這裡提到。
那麼我們將如何使用塊呢?
過程對象 - Proc
我們並不能直接獲取到 Block 。這裡介紹把 Block 對象化的 Proc 。這就可以直接獲取到一個 Block 了。
生成一個 Proc 有兩種方法。
一個是內部函數 proc 。用法就是。
  1. block = proc { msgbox "hi~" }
复制代码
這個方法會把所帶塊對象化并返回對應的對象。
一個是 Proc.new 。依然是 block = Proc.new {},不談。
那麼如何處理這個 Block 呢?Proc 也給出了兩種方法。
一個是 Proc#call(arg1, arg2, ...) (# 表示一個類的實例方法)
一個是 Proc#[arg1, arg2, ...] ,這個是爲了保持和方法的某種形式上的一致,不談。
於是有一個問題。爲什麽會有 arg,也就是參數呢。
實際上塊是可以帶參數的,這在 each 里就能看出來。它是用「||」包含。沒有數量上的限制。
怎麼用?例如。
  1. block = proc {|a, b, c| msgbox a + b + c }
  2. block.call 1, 2, 3
复制代码
似乎和方法有異曲同工之妙~它們的區別在於方法有被調對象而塊沒有,你可以當做無名函數使用。
那麼如何在方法中調用塊?也就是迭代?
調用塊的方法 - 迭代
這裡將會介紹 yield、以及直接用參數表示。
首先需要說明的是,直接讓一個方法帶塊並不會出現異常。
例如。
  1. def foo
  2. end
  3. foo {}
复制代码
那麼我們要如何調用呢。
  1. def foo &block
  2.   block.call
  3. end
  4. foo { p "w" }
复制代码
& 作為前綴的參數會接受方法所帶的塊的對象化對象也就是 Proc
此外也可以。
  1. def foo
  2.   yield 0, 1
  3. end
  4. foo {|a, b| p a, b }
复制代码
這裡也直接把如何用 yield 時也用塊的參數說明了。
結言
Block 用於打家劫舍。這是一個老梗。說明 Block 是多麼有趣。實際使用還得你自己來發掘。(我在另外一文中提到了可以用於傳遞事件變量。)那麼就沒了哦。也許你可能會看的一頭霧水。但這也很正常。這完全是脫離了 RGSS 的講學。這實際上並不怎麼符合學習者的需求。所以如果看的不大明白的話可以等以後再來看的。
(說來其實 do ... end 也行嘛。我就在這裡不提了。)

作者: Mic_洛洛    时间: 2013-2-14 23:55
本帖最后由 Mic_洛洛 于 2013-2-15 11:39 编辑

首先,洛子要跟大家说声十分抱歉
由于洛子平日很忙,所以这个之前说好的汇编整理成规范教材的事未能兑现。
刚刚重看了一遍,发现教程比较乱,各部分都有,中间还夹杂着提问或灌水的回复
虽然HAR君有做楼层链接,但有必要再整理。

当然,这个洛子会找时间去实现。而这次回复最重要的是告诉大家:
此贴没坑!!!

然后,带给大家——
前天在某人签名档链接出挖出的这个东西:
【VA】F1帮助文档(汉化版)
相信这对于想学习脚本的童鞋应该会有所帮助的说!

于是乎,洛子果断放出来了!
最后,还请脚本党的各位在本帖多多更新啦!(洛子还是会给更新的朋友发卡塞糖的说^^

PS:同时,洛子希望大家不要在本帖回复非脚本教程的内容,
如有问题可以自行【发消息】给相应教程的作者或在本区发提问帖。
如有吐槽可以使用【点评】功能,谢谢合作。
此帮助文档汉化者可以PM洛子受赏,如有修正更新版本,还请务必通知洛子的说。
作者: 忧雪の伤    时间: 2013-2-15 11:40
本帖最后由 忧雪の伤 于 2013-2-15 11:50 编辑

@司马睿风
如果在你P的内容中包含一个变量,那么在" "号中,P的结果会返回你的变量的数值,而' '号则返回p的具体的字符内容。

UI> Ruby 1.9.3 實測結果無效。不知道是不是版本問題。(實際上你這種說法我聞所未聞。
p crr.2

UI> 請問 .2 什麽高級語法?
不需要重新来个 integer。

UI> 為啥是 integer ……
我这里存入了数字,英文,字符串等类型(当然,ruby中是不需要定义数据类型的,随意存储)。

UI> 英文也是數據類型!(233)還有您的數組的字符串都沒加引號哦。
@satgo1546
UI> 關於模塊那裡的,自己看代碼。
  1. class Foo
  2.   def self.foo
  3.   end
  4. end
  5. Foo.foo
复制代码

作者: 神秘来客3    时间: 2013-2-15 17:22
本帖最后由 神秘来客3 于 2013-3-8 21:15 编辑

事件中的呼出脚本
一定见过在事件中呼出的脚本吧,如何弄出事件呼出脚本呢?
这么写:
  1. def xx  #这里命名这个事件呼出脚本。xx=任意(没错,汉字也行)
  2. 内容 #这里写内容
  3. end
复制代码
然后再事件中写“脚本:xx”→xx就是你刚刚的命名
另外这个脚本有错误不会立刻报错,呼出的时候发现错误才会报错(- -多么麻烦)
作者: 945127391    时间: 2013-2-15 23:37
本帖最后由 945127391 于 2013-2-18 12:45 编辑

呐,我们都知道VA的事件变量已经是很强大的了(其实最强大的是有一个“脚本”= =)
比如说,事件变量能够代入角色或队员的各种数值。
但是这个用脚本要怎么表示呢?
现在我就来简要地说一说:
首先,下文中的actor,可以有两种情况:
  1. $game_actors[n]
复制代码
  1. $game_party.members[n]
复制代码
前面一种是用来表示n号角色的,后面一种是用来表示队伍中第n位队员的;
当然,只有这些还不够,请看下面:
名字
对应的变量
等级
actor.level
经验值
actor.exp
HP(体力值)
actor.hp
MP(魔力值)
actor.mp
体力值上限
actor.mhp
魔力值上限
actor.mmp
物理攻击力
actor.atk
物理防御力
actor.def
魔法攻击力
actor.mat
魔法防御力
actor.mdf
敏捷值
actor.agi
幸运值
actor.luk

举例
  1. $game_actors[0].mhp # 一号角色的最大HP
  2. $game_party.members[0].level # 队伍中第一个角色(领队)的等级
复制代码
补充
关于敌人(不能获得LV):
队伍中的敌人(战斗事件专用):把actor替换成:
  1. $game_troop.members[位置]
复制代码
数据库中的敌人(不可以获得HP和MP):把actor替换成:
  1. $data_enemies[敌人ID]
复制代码
以上未经测试。
作者: 神秘来客3    时间: 2013-2-16 16:26
= =
突然发现一个重大的问题:
你们在那讲了那么多却忽视了最简单的问题:
货币怎么转换成脚本????还有步数啥的!!!!
作者: 945127391    时间: 2013-2-16 17:28
本帖最后由 945127391 于 2013-2-16 20:56 编辑
神秘来客3 发表于 2013-2-16 16:26
= =
突然发现一个重大的问题:
你们在那讲了那么多却忽视了最简单的问题:

很简单不是么……
名字
对应的变量
变量
$game_variables[变量ID]
随机数
rand(n)
这个有点复杂,详细请看F1
物品持有数
$game_party.item_number($data_items[物品ID])
武器持有数
$game_party.item_number($data_weapons[武器ID])
防具持有数
$game_party.item_number($data_armors[防具ID])
金钱
$game_party.gold
步数
$game_party.steps
玩家X坐标
$game_player.x
玩家Y坐标
$game_player.y
玩家朝向
$game_player.direction
玩家屏幕X坐标
$game_player.screen_x
玩家屏幕Y坐标
$game_player.screen_y
地图ID
$game_map.map_id
队伍人数
$game_party.members.size
游戏时间
Graphics.frame_count / Graphics.frame_rate
计时器
$game_timer.sec
(其实我也不知道这是啥)
战斗次数
$game_system.battle_count
存档次数
$game_system.save_count
队员ID
$game_party.members[队员位置].id
这一些前面就不需要加些什么了,直接用就得了。
作者: 忧雪の伤    时间: 2013-2-17 15:57
本帖最后由 忧雪の伤 于 2013-2-17 16:02 编辑


常量、變量補充

- 常量部份 -

常量不能在方法中定義。但實際上在前者以外的情況可以再賦值,如果使用 irb 的話你會看到 warning
常量也有自己的作用域。這和全局變量不同。
例如。
  1. Foo = Class.new
  2. msgbox Foo
  3. class Foo
  4.   Bar = 0
  5. end
  6. p Bar # => NameError
复制代码
常量的作用域是以當前作用域作為起始,一直適用所有往下的作用域。
若想在外部访问类或模块中的常数时,要使用「::」操作符。
例如。
  1. class Foo
  2.   Bar = 0
  3. end
  4. msgbox Foo::Bar
复制代码
實際上這也可以直接賦值一個類裏的常量。
  1. Foo = Class.new
  2. Foo::Bar = 0
  3. msgbox Foo::Bar
复制代码

- 變量部份 -

實例方法中定義的實例變量只在那個類的實例適用。而且每個實例的實例變量不會互相影響。不要天真的以為它們是共享的。
  1. class Foo
  2.   def foo
  3.     @foo = 0
  4.   end
  5. end
  6. Foo.new.foo
  7. msgbox Foo.instance_variable_get :@foo # => nil
复制代码
從另外一個角度來看就是。
  1. class Foo
  2.   @foo = 0
  3.   def foo
  4.     msgbox @foo
  5.   end
  6. end
  7. Foo.new.foo # => nil
复制代码
在這裡順便介紹兩個在外部操作對象的實例變量的方法。
- Object#instance_variable_get(name)  
引用實例變量。
name 就是實例變量的名字,可以為 Symbol 或者 String,例如 :@foo 。(注意別忘記 @
- Object#set_instance_variable(name, value)  
定義實例變量。
name 同上。value 就是值。
Ruby 方便我們讀寫實例中的實例變量,為我們提供了 attr 系列方法。這在 F1 中有提到,所以就不列出來了。
實際上我們可以用上面給出的兩種方法試著復原同樣的效果。自己去試試吧~
作者: 神秘来客3    时间: 2013-3-8 21:13
最近怎么没人发教程了我去
作者: darndada    时间: 2013-3-15 19:12
harinlen 发表于 2012-9-24 21:46
有人可能会看不懂这是啥,嗯,不懂也没关系,接着看(坑)就是了。
既然RGSS3是个脚本,用来和计算机交流的 ...

直接复制代码引号不对而已....
作者: zyf32123    时间: 2013-3-15 21:18
harinlen 发表于 2012-9-24 21:46
有人可能会看不懂这是啥,嗯,不懂也没关系,接着看(坑)就是了。
既然RGSS3是个脚本,用来和计算机交流的 ...

和Visual Basic好像...
作者: darndada    时间: 2013-3-16 10:44
{:2_271:}越往后看越晕
作者: garidan    时间: 2013-3-29 13:00
貌似第一个脚本就很难啊,同样的输入 为啥我的就是脚本"main"的1行发生了NoMethodError.undefined method 'msgobs' for nil:Nilclass
作者: ZumiKua    时间: 2013-4-1 02:22
本帖最后由 ZumiKua 于 2013-4-1 02:31 编辑

这教程真坑,尤其是类与方法方面……我就捡重要的讲一下吧
类和函数具体还请参考之前的RGSS2和RGSS1教程
【一些声明】
严格来说,Ruby中没有函数,在Ruby中对所谓函数的叫法是方法(method),这一点可以从一些Module类中的方法名称中得到验证(例如:methods),所以这里我也采用了Ruby的命名习惯。(方法和函数还是有所区别,函数一般无所属类)
【前言】
众所周知的是,啊,可能对这个网站的受众来说也不一定是众所周知,Ruby是一个高度抽象化的语言,她有着可以和Smalltalk相媲美的OOP特性。以上,只是我个人的浮夸而已。所以,类——OOP的核心价值所在,在学习Ruby的道路中是一个重中之重。
【什么是类】
类,表示对现实生活中一类具有共同特征的事物的抽象。比如猫,作为一种生物的统称它代表着一类生物,所以我们可以把它看做一个类,它可以形容所有的猫的通性,比如四个爪子,爱抓毛线球,玩耗子,没事卖卖萌。但是,现在我们并没有真正的猫,还只是个对猫的叙述而已。现在,我自己养了一只猫并给她起名叫喵子,那么,她就是猫的一个实例,根据类对猫这一物种的描述所创造出来的一只活生生的猫,你看得见摸得着,如果在程序中形容的话,它就是是可操作的,它确实在内存中开辟了属于自己的空间,等待着我们对他进行料理处理。
【Ruby中的类】
在Ruby中,类变得更加抽象。现在想象一下,我们要对类这个物体本身也下个定义,类到底是干什么的呢?类就是一个形容别的物体通性的概念,它有着……之类的方法,它可以干……之类的事情,那么,我们现在是不是得到了“类”这个物体的通性?那么,我们可以把“类”也做为一个类看待,前面形容猫的类就是“类”的类的一个实例,它是“类”的特指。举个简单的例子,机床可以制造汽车,那么怎么制造机床呢?制造一个制造机床的机床就行了。
【类的具体实现】
RUBY 代码复制
  1. class Cat
  2. end
  3. nyu = Cat.new

以上,即为一个类的生产过程,第一行和第二行定义了一个类,定义一个类的标准语法为:
RUBY 代码复制
  1. class 类名
  2. end

注意,你所给出的类名会被定义为一个全局常量,而常量通常都是以大写字母开头,在定义类时请万分注意。
第三行,通过点语法调用了  Class类的实例——Cat类(*这里的实例是相对于Class类而言,Cat类被当做实例)  的new实例方法(由实例调用的方法,这里是指类似nyu.miao中的miao方法,其由nyu调用,nyu是Cat类的实例,所以miao是实例方法,Cat类是Class类的实例,所以Cat.new的new是实例方法),建立了一个Cat的实例,nyu,这里,nyu就是我们看得见摸得着的猫,而Cat,就是那个猫的统称。

-Tips
注意,Class类同样还有个类方法new(由类调用,与实例方法相反,如Cat.miao中的miao由类Cat方法调用,所以miao为类方法,类方法和实例方法的定义方式不同),和实例方法new完全不同,请勿混淆。
具体的区分方式为:Class.new调用的为类方法,其他的new均为实例方法。具体原因请结合“类”的类和其实例的关系自行考虑。

觉得自己脑髓不够了么?没关系,还有下一班脑髓地狱列车等着你

【方法与类】

-指摘
在本帖中出现过这样一句话“这样一个方法是在一个新脚本中定义的。。所以不是一个类方法”,首先类方法是指Class Method,可以不经实例化直接调用的方法,定义方式为def self.xxx,而非不“在一个新脚本中定义”即可成为所谓的类方法。一个方法是必须属于一个类的,即使一个方法不属于任何一个类/模块的定义范围,它也会属于Object的一个实例(main),这就跟Ruby的top level environment有关了。

方法是用来描述具体行为的一种抽象方式,比如猫会抓老鼠,那么我们可以给猫类定义一个叫做抓老鼠的方法,这样当我们用猫类来建立实例后就给实例赋予了抓老鼠这一技能。
类似
RUBY 代码复制
  1. class Cat
  2.   def catch_the_rat
  3.   end
  4. end
  5. nyu = Cat.new
  6. nyu.catch_the_rat

其他关于方法的用法请参考本帖教程(所谓形参部分还请选择性无视)。在用法方面本帖的实用性堪比嗡嗡祖拉(真抱歉用这么冷僻的梗)

【类与类/模块】

类与类最基本的关系是继承。
在类这一抽象层中, 并不是所有的概念都是并列的,比如,生物分为五个界,然后下面又分界门纲目科属种,这些概念层层递进,同时其共性也在渐渐增多,而这一现象在类中的体现就是——继承。
继承可以让子类继承父类的方法,实例变量等。
继承最大的好处就是可以将父类的共性重用。一个父类不一定只有一个子类,多个子类公用一个父类可以有效降低代码的重复率,更有利于贯彻DRY(do not repeat yourself)精神,有助于降低代码的耦合性,提高代码的可重用性。
范例代码:
RUBY 代码复制
  1. class Animal
  2.   #private
  3.   def eat
  4.     puts "eating"
  5.   end
  6. end
  7. class Cat < Animal
  8.   def catch_the_rat
  9.     eat
  10.   end
  11. end
  12. Cat.new.catch_the_rat => eating

子类Cat可以完全重用父类的eat方法而不需要自己定义,降低了代码的重复率。

-Tips
private方法不可以被子类调用,如范例代码中将第二行的井号删除,就会报NoMethodError

与C++不同的是,在Ruby中类的继承只能是单继承,摒弃了多继承带来的种种恶果,同时引入了module和mixin(混成)机制,也带来了不输多继承的便利。
关于mixin的语法问题非常简单:
RUBY 代码复制
  1. module Tools
  2. end
  3. class ToolBox
  4.   include Tools
  5. end

即可。这里,我们需要说一下Mixin的实现机制。
实际上,Ruby的Mixin即是用一个匿名类来包装include的module,将其插入到当前类的继承链当中,而且越靠后include的module,距离当前的class就越近,例如:
A是B的子类,A中先后引用了C和D两个模块,那么,实际上A的继承链是这样的:A<D<C<B(先include C,A<C<B,再include D,A<D<C<B)
所以,在进行多模块混成的时候,请合理运用super()(执行父类中同名的方法)

啊,好累,剩下的就看心情补上了……
代码复制
  1. TODO:
  2. 反射
  3. 元编程
  4. 单体类


因本人技术水平有限,所述内容难免有错误疏漏之处,恳请各位读者批评指点,以上,另祝各位能够日益精进。

还有,这就是个马甲而已

参考资料:http://www.ruby-doc.org/core-1.9.3/
作者: asd1321259972    时间: 2013-4-3 21:58
哇塞      给力啊          望后续还有。。。。。。。。。。。。
作者: 蓝焰。    时间: 2013-4-6 14:20
satgo1546 发表于 2012-10-26 19:27
嗯……函数表示被某铅笔吃了。。对象貌似也被吃了。。数组吃了,哈希表——找到一个很好的东西可 ...


咕~~(╯﹏╰)b   看不懂了  QQ 971210502  还是希望有时间能给我解释下

作者: 蓝焰。    时间: 2013-4-6 15:02
本帖最后由 蓝焰。 于 2013-4-15 16:37 编辑
铅笔描绘的思念 发表于 2012-10-16 21:59
说好的上的话就更。。。。话说洛洛的经验-1真的难以吐槽。。。。喵的。。。咱以后得想H酱扯到54一样扯到你 ...


该作者的问题早已解决,话说删掉这楼吧
作者: garidan    时间: 2013-4-7 11:05
garidan 发表于 2013-3-29 13:00
貌似第一个脚本就很难啊,同样的输入 为啥我的就是脚本"main"的1行发生了NoMethodError.undefined method ' ...

我输入的脚本是  msgbox "Hello World!"  (这排英文我应该没打错吧,还是我有哪里忽略了?)

弹出的对话框是 “NoMethodError.undefined method 'msgbox' for nil:Nilclass"





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1