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

Project1

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

[已经解决] 新手在脚本入门里遇到的问题。。。

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
9 小时
注册时间
2010-6-17
帖子
29
跳转到指定楼层
1
发表于 2010-7-1 10:29:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
终于决定学学脚本了…… - -!
不过其中遇到了一些问题,希望各位帮忙解答一下。
1、定义父类的问题
  1. class Person < Monkey
  2. end
复制代码
这样定义了父类之后,如果在class Person < Monkey这一句下面定义一个方法的话,那么这个方法是属于Person类还是属于Monke类呢?(这个问题貌似在下面方法的重载里面可以看出来,不过还是不放心来问问)

2、关于return的问题
这里的 return 就是结束函数处理的命令。函数可以考虑为 RPGXP 的公共事件,而 return 就是相当于「中断事件处理」的意思。

以上是RMXP脚本教程的原文,可是“中断事件处理”有啥用啊?(饿,事件也没学好。。。)事件写完不就自动中断了?难道还要每次写完事件都要加上这个“中断事件处理”命令吗?

3、关于实变量
  1. class Person
  2.   def name
  3.     return @name
  4.   end
  5.   def name=(name)
  6.     @name = name
  7.   end
  8.   def hello
  9.     print "我是" + @name + ""
  10.   end
  11. end

  12. alex = Person.new
  13. alex.name = "艾力克斯"
  14. alex.hello                  # => 我是艾力克斯
复制代码

这个也是RMXP脚本教程中的一段脚本,可是……看不明白这几句:
  1. def name
  2.    return @name
  3. end
复制代码

有啥用,如果没有这几句这个脚本也能正常运行啊~为什么要多出这么几句呢?
另外,不太明白实变量是干嘛用的,各位解答一下~

4、对象初始化
  1. class Person
  2.   def initialize
  3.     @name = "无名先生"
  4.   end
  5.   def hello
  6.     print "我是" + @name + ""
  7.   end
  8. end

  9. aaa=Person.new
  10. aaa.hello
复制代码

这个脚本定义了一个名为initialize的方法,有定义了一个hello的方法,然后以aaa作为Person的实例调用hello这个方法,可是如果将initialize这个方法名称改动,脚本就会出错,这个词(initialize)是系统默认的保留字吗?为什么一改就会出错呢?

5、数据库的使用
  1. p $data_actors[1].name
复制代码

这样的脚本,为什么在事件的“脚本”选项中写入,就不会出错,在脚本编辑器中直接写入就会出错呢?如图:



好了,问完了,问题貌似比较多啊,谢谢各位了先~

Lv3.寻梦者

小柯的徒弟

梦石
0
星屑
1435
在线时间
1157 小时
注册时间
2008-5-24
帖子
3085

贵宾

2
发表于 2010-7-1 10:49:56 | 只看该作者
本帖最后由 「旅」 于 2010-7-1 10:51 编辑

1.属于Person

2.这里的中断是指不执行后面的内容,直接结束。例如:
  1. loop do
  2. p 1
  3. return
  4. p 2
  5. end
复制代码
这个只会显示1,而且不会循环。

3.实变量是一种在类或模块内部使用的变量,@xxx的格式,但它只有在内部才可以写入或读取。例如
  1. class A
  2. def initialize
  3. @b = true
  4. end
  5. end
  6. @b = false
  7. p @b
复制代码
这里p出来@b的值为false。也就说明必须到内部才可读取。而你的那句(↓)就是用来读取的~
  1. def name
  2.    return @name
  3. end
复制代码
  1. class A
  2. def initialize
  3. @b = true
  4. end
  5. def b
  6. return @b
  7. end
  8. end
  9. a = A.new
  10. p a.b
复制代码
这里的return @b不单会中断事件,还会返回后面放的参数@b。所以用这个就可以读取到@b了~
至于为什么要特意去设@b呢?这是因为结构,还有保存时整个类的实变量都可以存入。另外不能认为一切变量都可以设为全局变量,那样的话,直到关闭游戏,那些全局变量都会爆满你的内存,导致卡机……

4.initialize就是 生成类a.new时 运行的。没有执行initialize的话,@name的值为nil,所以用+时会出现错误。

5.因为必须等到它生成才可以用,而他的生成在Scene_Title里面~可以复制出来,放在前面即可~
回复 支持 反对

使用道具 举报

Lv3.寻梦者

孤独守望

梦石
0
星屑
3121
在线时间
1534 小时
注册时间
2006-10-16
帖子
4321

开拓者贵宾

3
发表于 2010-7-1 11:01:01 | 只看该作者
本帖最后由 IamI 于 2010-7-1 11:04 编辑

补充下……initialize是Class类定义的回调方法。
在每次执行Class类定义的new方法时会调用定义的initialize方法。
可以不定义initialize方法,获得的对象是全空的,没有任何实变量。
$data_属于RGSS不属于Ruby,必须在游戏应用中使用。

评分

参与人数 1星屑 +300 收起 理由
「旅」 + 300 正确解答~

查看全部评分

菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
270 小时
注册时间
2010-2-4
帖子
1305
4
发表于 2010-7-1 11:02:25 | 只看该作者
1.属于Person类的。
2.return的意思就是,在方法执行到return的时候就直接跳出方法,返回return后面的对象,后面没有字就返回nil,(当然不写返回也是可以的,他会一直执行到end的地方然后自动返回end前最后一个语句)
3.实变量就是只在一个类中通用的变量,相当于这个类的属性,要在其他类中调用这个类的实变量就必须定义这个方法,name=(name)则是赋值。
4.这个在f1中有写,initialize是对象的私有方法,在Class生成对象的时候自动将参数传递给initialize,并调用initialize
5.脚本从上至下执行,第一行的时候还没有定义$data_actors,自然为nil,这一段是在Scene_Title时定义的,所以必须在$data_actors定义完毕之后使用。
好歹当年也当过大魔王过,orz
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
9 小时
注册时间
2010-6-17
帖子
29
5
 楼主| 发表于 2010-7-1 11:43:25 | 只看该作者
恩 大概懂了,谢谢三位。
不过……
如果像这样的话,为什么还是错误呢?


另外,「旅」 ,你的第一个脚本出现了ERROR,意思是不是这个loop do语句因为有了return的存在而只能循环到print 1,再向下循环就会出现错误呢?

呃,关于中断事件处理还是有些问题,「旅」说“这里的中断是指不执行后面的内容,直接结束”,但是既然知道不执行后面的内容了,为什么还要编写后面的内容呢?

还有,谢谢IamI最后一句话,一下就明白了  - -!

嗯……再问一个关于实变量的问题,zhangbanxian说实变量相当于这个类的属性,那么在前面学到的显示图片里面的x、y、ox、oy还有bitmap是不是也算是Sprite类的属性呢?也就是说x、y、ox、oy、bitmap相当于Sprite类的实变量?
回复 支持 反对

使用道具 举报

Lv3.寻梦者

小柯的徒弟

梦石
0
星屑
1435
在线时间
1157 小时
注册时间
2008-5-24
帖子
3085

贵宾

6
发表于 2010-7-1 12:10:40 | 只看该作者
因为Scene_Title的内容只是定义,必须放到它的调用后面。所以放在Scene_Title的30行后面。

另外我刚才试了下,似乎只有def~end才可以用return。其他的用break。(失误0.0
  1. def a
  2. loop do
  3. break
  4. p 1
  5. end
  6. return
  7. p 1
  8. end
复制代码
为什么还要编写后面的内容?——一般都是放在判断里面,判断如果不需要后面的内容,就直接结束。

x、y、ox、oy、bitmap相当于Sprite类的实变量?——正确说是@x、@y、@ox,他们是Sprite的实变量~
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
270 小时
注册时间
2010-2-4
帖子
1305
7
发表于 2010-7-1 12:16:05 | 只看该作者
恩 大概懂了,谢谢三位。
不过……
如果像这样的话,为什么还是错误呢?


另外,「旅」 ,你的第一个脚本 ...
FeebleGoblin 发表于 2010-7-1 11:43

return只能用于方法,否则找不到返回点。
确切的说实变量是这个类具有的特点,而值是这个类的对象的属性。

评分

参与人数 1星屑 +300 收起 理由
「旅」 + 300 正确解答~

查看全部评分

回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
2 小时
注册时间
2010-6-30
帖子
99
8
发表于 2010-7-1 15:26:31 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6545
在线时间
1666 小时
注册时间
2008-10-29
帖子
6710

贵宾

9
发表于 2010-7-1 18:20:25 | 只看该作者
$data_actors = load_data("Data/Actors.rxdata")
上面这行就是 $data_actors 的初始化

每个方法都会有一个返回值
return 是中断其所在方法的运行.并返回 return 右边的表达式结果.
作为该方法的返回值
如果return 右边没有东西就会返回 nil
不过这个 return 返回值是有特殊情况的.
如果其所在方法.在定义方法名的时候用了 = 号.
那么这个方法的返回值就是传递给这个方法的参数的值而不是return右边的结果

运行下面这段会显示 1 而不显示return右边的2

  1. class Abc
  2.   def name
  3.     return @name
  4.   end
  5.   def name=(name)
  6.     @name = name
  7.     return 2
  8.   end
  9. end
  10. a = Abc.new
  11. p a.name = 1
  12. exit
复制代码
而下面这个就会显示return右边的 2

  1. class Abc
  2.   def name
  3.     @name
  4.   end
  5.   def name(name)
  6.     @name = name
  7.     return 2
  8.   end
  9. end
  10. a = Abc.new
  11. p a.name 1
  12. exit
复制代码
当某个方法里没有return或者运行的时候并没有运行return的情况
这个方法的返回值 楼上某位说过了.

评分

参与人数 1星屑 +300 收起 理由
「旅」 + 300 正确解答~

查看全部评分












你知道得太多了

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
9 小时
注册时间
2010-6-17
帖子
29
10
 楼主| 发表于 2010-7-1 19:44:36 | 只看该作者
本帖最后由 FeebleGoblin 于 2010-7-1 19:46 编辑

恩 完全懂了,谢谢大家哈!
话说……怎么结帖啊 - -!

点评

PM斑竹例如我,我可以帮你结账。这次就直接结了~  发表于 2010-7-1 19:54
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-28 01:14

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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