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

Project1

 找回密码
 注册会员
搜索
楼主: RyanBern
打印 上一主题 下一主题

[原创发布] 【14.7.5第二版更新】RGSS1脚本入门参考

[复制链接]

Lv1.梦旅人

梦石
0
星屑
1240
在线时间
18 小时
注册时间
2013-11-5
帖子
2
31
发表于 2014-6-27 18:27:35 | 只看该作者
kuerlulu 发表于 2013-10-13 12:57
好顶赞!本来我也想写的 看lz发了我就来看看
赋值符号=是让左右相同,不一定是右边给左边,只要其中一个 ...

中文变量……没试过
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
19 小时
注册时间
2014-6-14
帖子
29
32
发表于 2014-6-30 02:11:57 | 只看该作者
楼主辛苦了
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2153
在线时间
1366 小时
注册时间
2011-2-10
帖子
602

开拓者

33
发表于 2014-7-2 01:36:46 | 只看该作者
都是经验之谈,最近努力尝试中
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2207
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

34
发表于 2014-7-2 15:26:17 | 只看该作者
本帖最后由 taroxd 于 2014-7-2 17:19 编辑

感谢更新哦~  关于这个教程有很多问题。列在下方,希望可以尽快改正。


赋值运算符的优先级是最低的一个

你让下面这些东西怎么活:
defined?
not
or, and
modifier-if, modifier-unless, modifier-while, modifier-until
{ } blocks


当然,常量也有作用的范围,不过我们使用常量时,把它定义在最外面的层次上就好了,不必深入到类当中。

相反,放在自己的命名空间(namespace,一般为模块)中才是一个好习惯。


一般出现的错误,要么是syntax error,要么就是No method error。前面是指你的语法有问题,可能的情况就是少了end(后面要讲),或者是你凭空造了没有的语法;后面指的是你进行的运算和对象不符合,即该类对象没有定义这个运算,通常是没有初始化或者概念模糊造成的,以后我们都要说到。

NoMethodError出现,通常是因为对nil调用了一些方法。其原因,一是没有初始化,二是数组越界。数组越界的一个常见原因是你取出了一个空数组的第一个元素,然后想要对它做事情。当然,方法名拼写错误也是有可能的

  1. class A
  2.   attr_accessor :x
  3.   attr_accessor :y
  4.   attr_accessor :z
  5.   def initialize(x,y,z)
  6. @x = x
  7. @y = y
  8. @z = z
  9.   end
  10. end
复制代码
你的缩进跪了


注意到变量x和y的地址不同

变量x和y的地址相同,因为1是立即值,所有的1全部指向同一个对象。因此,我建议拿三个内容相同的字符串做演示。


  1. class Person #定义一个叫Person的类
  2.   def initialize
  3.     @name = “Ryan”
  4.     [url=home.php?mod=space&uid=6132]@age[/url] = 0
  5.     [url=home.php?mod=space&uid=103045]@SEX[/url] = 0
  6.   end
  7.   def hello
  8.     print “I am ” + @name + “!”
  9.   end
  10. end
复制代码
url 暂且不论,字符串什么时候可以用中文双引号了?页面搜索“,你会发现很多这样的中文引号。


  1. attr_accessor:name
  2. attr_reader:name
  3. attr_writer:name
复制代码
这三个语句都是方法,因此参数(:name)必须打上括号或者空一格


别小看这个东西,很多时候因为少了这句话,会引发NoMethodError for class Nil

1. 如果是局部变量,报错信息为 undefined local variable or method `a' for xxx
2. 如果是实例变量或全局变量,报错信息为 undefined method `[]=' for nil:NilClass
再怎么说Nil也不是个class啊


遍历整个数组
本来是用each方法,但是这里我们一般这样写(array是一个数组):
for i in array

Ruby和RGSS3中,each的写法更为推荐


由于主键之间无法排序,所以Hash表也是没有顺序的。

Ruby1.9(VA)之后,Hash表是有顺序的。也就是插入的顺序。


但是如果在这个类之外写print @name,那么你一定看到的是活生生的nil,因为这个区域内,计算机不认识@name这个变量,按照Ruby规定,未初始化的实变量都是nil。

实例变量访问的对象只看当前self的值。因此类也可以有实例变量,顶层的空间也可以有实例变量。
不信?你在顶层试试:
@name = "main"
p @name


在读取数据完毕之后,我们加入这个p函数来显示这两个对象的地址。注:所有对象都有to_s方法,如果不加重设的话,返回的是引用的地址。

p 输出的是 inspect 的结果,而 print 和 puts 才是输出 to_s 的结果


Ruby中也不谈类型这一说

Ruby谈类型,而且是强类型。但Ruby中的类型不是由class,而是由一个对象可以实现什么方法来决定的。
Ruby的Duck Typing是一个非常好的实践。


细心的朋友会发现,在(1)中a和b两个变量是互相独立的,对a进行的操作对b没有丝毫的影响

a和b是数字的时候,也指向同一数据,而不是相同数据的拷贝
a和b本来指向相同的对象,只是你后来又对b赋了一次值,使变量b指向了另一个对象而已。况且,你可以轻易改变一个数组的内容,一般却没人想去改变1,2这种数字的内容吧?
a = [2]
b = a
a = [4]
你看,b不还是[2]吗?


后面的RGSS部分,我没见过XP脚本,所以不做评论。
我觉得我和楼主的想法许多都是一致的呢。我办活动的目的,和楼主写教程的目的大致相同。我也只是个业余脚本党。
所以,如果你愿意继续来VA区帮忙写一些东西的话,我会很感谢你的哦~ 毕竟我那边偏向Ruby,即使没用过VA应该也可以写的。

点评

这么有耐心好可怕= =  发表于 2014-7-3 00:18

评分

参与人数 2星屑 +200 收起 理由
VIPArcher + 100 这么有耐心好可怕= =
RyanBern + 100 辛苦~

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2207
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

35
发表于 2014-7-5 15:45:26 | 只看该作者
本帖最后由 taroxd 于 2014-7-5 16:06 编辑
在Ruby中,实变量以@开头,通常表示一个类的实例或者是作用在一个类中的“小型全局变量”。实变量的作用范围是整个类,也就是说,在某个类别外使用定义在它上的实变量是无效的。例如:


实例变量没有作用域的问题,永远是根据self来访问的。
RUBY 代码复制
  1. class T
  2.   @var = 0
  3.   singleton_class.send :attr_writer, :var
  4.   attr_writer :var
  5.   def initialize
  6.     @var = 1
  7.   end
  8.   p @var # => 0
  9. end
  10.  
  11. t = T.new
  12. p T.instance_variable_get(:@var) # => 0
  13. T.instance_eval { p @var }       # => 0
  14. p t.instance_variable_get(:@var) # => 1
  15. t.instance_eval { p @var }       # => 1
  16.  
  17. T.var = 2
  18. t.var = 3
  19. T.instance_eval { p @var }       # => 2
  20. t.instance_eval { p @var }       # => 3


这和类的作用域完全没有关系

但你何曾看过Object.new这样创建Object对象的语句了?


怎么没有?余烬之中不就这么干的……

想要引用模块内部的常量,要用到'::'运算符。


可以include。混入(Mix-In)时也会混入常量

====================补充==================

RUBY 代码复制
  1. class Person
  2.   @name = "XX"
  3.   def pr_name
  4.     print @name
  5.   end
  6. end
  7. print @name


我觉得你这个例子就是在满满地误导啊……
三个@name没有两个是同一个东西的……

一个是类Person的实例变量
一个是类Person的实例的实例变量
一个是类Object的实例main的实例变量

点评

例子有问题,容我更改一下。  发表于 2014-7-5 16:06
你还是别使用类的实例变量了吧,容易误导  发表于 2014-7-5 15:59
Object.new 不会有任何问题啊。不过余烬之中是在一个object里面定义了一堆单例方法  发表于 2014-7-5 15:57
这样会不会出什么问题?  发表于 2014-7-5 15:56
已更正。  发表于 2014-7-5 15:51
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
231 小时
注册时间
2007-12-17
帖子
541
36
发表于 2014-9-19 10:54:24 | 只看该作者
要是能把那么多东西综合成一个游戏范例的制作就更形象了。毕竟对于脚本盲来说,带着一点自由度地跟着完成一件作品比光看着学效率要高不少

点评

最近在考虑做一些实用性比较强的教程,有可能会借助视频。(显然工作量巨大,而且已经有很好的视频在6R上了)  发表于 2014-9-19 13:43
学习脚本的过程和制作游戏的过程几乎是分离的,所以你还是别想那么多了  发表于 2014-9-19 12:47
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
23 小时
注册时间
2014-9-26
帖子
24
37
发表于 2014-10-2 01:13:11 | 只看该作者
谢谢楼主……
最近才开始接触RMXP和脚本,因为之前有过一些很基础的编程基础,所以对编程的运算顺序和局部和全局变量理解得差不多,偏生之前用的语言并没有怎么用到库这个内容,然后看教程都是,前面跳得很快,一到库就停了下来,看得不明不白,直到看到楼主的教程终于理解了库是什么。
觉得这个教程很有用,只是有的地方说的不太够细致(大概也有我理解力不够的问题?)
以及有的地方突然多了一些之前没提到的东西(如预备知识里面的重要补充attr_accessor……我看到第一章类的时候才看到说明,尽管当时看这说明还是看不懂,后来看了第一次作业答案以及与自己写的作业对比后才明白是,让在库外面创造这个库的实例时能够改变这个数?那么我的理解就是,这个数是实例的属性,用了attr_accessor后属性才能够改变这样……如果理解还是有错希望能指出,谢谢),导致作为新人的我看得不明不白,这大概是因为是补充而不是同时写的原因吧。
感觉作业太难以及要求有点模糊。
第一个作业水瓶,写了之后完全不对路,最后参考了楼主帮我写的随时显示图像那个脚本,以及答案,改完之后拿给朋友看,朋友说应该没错。但还是不敢发这里来,毕竟上次有人说了我暂时还没有资格做这个作业,有未学走先学跑的嫌疑。

以上都是废话。
主要是……第二个作业完全不懂。
题目是做一个小游戏,从地图一点走去另外一点,将指定的方格全部走一次而且不重复。要求只能用独立开关的脚本。
看到题目的瞬间想起的是年代记幽灵船的小游戏
那么思路是,
移动到除了出口和入口以外的格子时判断当前位置的$game_self_switches[[?,?,’A’]] == false?
是 set为true
否 直接退出游戏
在出口时用循环判断之前的所有$game_self_switches[[?,?,’A’]] == true?
是 离开房间
然后就想起,我要如何用脚本判断我走到的格子是哪一格,以及,只能用独立开关的脚本意思是,在事件编辑器里面编辑还是只能用脚本编辑器?

最后,如果言语或者语气之间有什么不敬的地方请原谅我。已经好多人说我一个劲说高冷的话但也不见做出什么实际的事了。
但也不知道怎么改。如果真的让楼主大大有这种感受的话,真的抱歉。不是故意的。谢谢楼主为我们带来这个教程。
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9497
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

38
 楼主| 发表于 2014-10-2 10:03:31 | 只看该作者
繁星千羽 发表于 2014-10-2 01:13
谢谢楼主……
最近才开始接触RMXP和脚本,因为之前有过一些很基础的编程基础,所以对编程的运算顺序和局部 ...

首先感谢你的回复呢。那我们就一条一条来说了。
首先第一点,这个教程帖我个人也是非常不满意。有些地方没有说清楚,对有一定经验的人来说太简单,对于新人来说太难。其实这是我一年前写这个东西的时候,面向的读者就不是一点基础都没有的新人。所以可能会吓跑一堆新手吧。对于attr_accessor :的理解,初学Ruby(RGSS1)的话这样理解完全可以。实际上就是可以在对象外面访问(写入和读取)对象本身的数据(成员变量)。还有要说明的是你要理解Taroxd大大的“挫折式言语”,正是因为不断受挫才会不断成长,我也是这么熬过来的。
第二点,第二个作业的要求只是提示你用脚本来完成独立开关的控制,核心就是“在一个事件中也可以控制另一个事件的独立开关”,仅此而已,没有必要把它想象得太复杂。完成这个任务是需要事件,事件脚本,地图结合起来的。并不是限制你做游戏的方式和方法,只是给了你一个提示。
说到这里,本人在XP提问区办的考场第二轮也即将开始,里面就有这个题目。如果你有兴趣可以拿去做做,其实这确实是一个很经典的题目了。
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2207
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

39
发表于 2014-10-2 10:53:09 | 只看该作者
本帖最后由 taroxd 于 2014-10-2 11:18 编辑
繁星千羽 发表于 2014-10-2 01:13
谢谢楼主……
最近才开始接触RMXP和脚本,因为之前有过一些很基础的编程基础,所以对编程的运算顺序和局部 ...


我当时这么说的原因就是你对类的理解还不够。一个是 attr_accessor 这类的东西。另外类里面的逻辑,方法的参数也十分混乱。

这是你上次给出的代码:


你的水瓶到底有没有 name 呢?或者说,name 是一个字符串还是一个水瓶?
并且,Ruby 有关键字 self,因此不需要像 python 那样传入一个 self 作为参数。

从整段代码都可以看出来,你还远远没有适应“面向对象”的编程。而 Ruby 恰恰就是一个完全面向对象的语言,举个例子,对一个整数取绝对值,在其他语言中大部分都是 abs(n),而 Ruby 中是 n.abs。这个东西还需要你去适应。适应完之后,可以说之后的学习基本上都是一帆风顺的。

你自己也说过:
但是脚本的学习不就是应该从模仿,找错,吸取经验,改进,继续模仿这样的进程来走的吗……


所以,先模仿一下吧。这个帖子里并没有许多例子给你模仿;F1 也没有,6R的大部分教程都没有,而预置脚本的难度则偏高了。所以,我推荐找一本好一点的 Ruby 教程吧。Ruby 要入门还是很容易的。

下面的给你参考一下(第 6 行可以无视):
RUBY 代码复制
  1. class Bottle
  2.  
  3.   attr_reader :capicity
  4.  
  5.   attr_accessor :volume
  6.   protected :volume=
  7.  
  8.   def initialize(capicity, volume = 0)
  9.     @capicity = capicity
  10.     @volume = volume
  11.   end
  12.  
  13.   def clear
  14.     @volume = 0
  15.   end
  16.  
  17.   def full
  18.     @volume = capicity
  19.   end
  20.  
  21.   def >>(other)
  22.     diff = [@volume, other.capicity - other.volume].min
  23.     other.volume += diff
  24.     @volume -= diff
  25.   end
  26.  
  27. end
  28.  
  29. bottle10 = Bottle.new(10)
  30. bottle20 = Bottle.new(20)
  31.  
  32. bottle20.full
  33. p bottle20.volume # 20
  34.  
  35. bottle20 >> bottle10
  36. p bottle10.volume # 10
  37. p bottle20.volume # 10
  38.  
  39. bottle20.clear
  40. p bottle20.volume # 0
  41.  
  42. bottle10 >> bottle20
  43. p bottle10.volume # 0
  44. p bottle20.volume # 10
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
23 小时
注册时间
2014-9-26
帖子
24
40
发表于 2014-10-2 19:45:31 | 只看该作者
感谢taroxd大大和楼主大大的建议,我会努力的
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-20 22:35

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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