Project1

标题: 脚本基础问题 求各位前辈指点QAQ! [打印本页]

作者: kuangding66    时间: 2013-8-16 17:09
标题: 脚本基础问题 求各位前辈指点QAQ!
本帖最后由 kuangding66 于 2013-8-18 19:05 编辑

本人是纯新手..{:2_264:}正在发奋自学脚本中,如果问得很弱智还请海涵。
问题很多很多,都是一步步阅读RMXP自带脚本时出现的问题...我一条一条整理好:

这部分问题源自XP自带脚本中的class Game_Temp

1.
关于attr_accessor : 这个代码的意思是不是 冒号右边写了什么就是实例化一个局部变量?
比如attr_accessor : a就是实例化了一个局部变量a?
然后从此之后只要出现 ABC.a就是获得a的值?
ABC.a = 15 就是说给a赋值为15?
如果可以的话,能不能介绍一下attr_accessor :使用的意义呢?

2.在class Game_Temp类中,出现了
  attr_accessor :shop_goods               # 商店 商品列表            
随后初始化对象
def initialize
在这里面却出现了一个
@shop_id = 0

这里就不清楚了,之前定义实例变量,所有变量都在初始化对象中一一对应,为什么shop_goods  和shop_id 不对应呢?

3.
依然是初始化对象中的
@map_bgm = nil   

我的理解是:
scene-map中的 调用战斗 部分,代码如下
记忆地图 BGM 、停止 BGM
$game_temp.map_bgm = $game_system.playing_bgm
$game_system.bgm_stop

全局变量使用map-bgm的方法,其值使之相等于全局变量playing-bgm的方法的值
这段代码是否意味着,记住正在播放的bgm,以便于以后使用,然后停止播放bgm
(即切换场景),可是,需要解决的是,这里面两个全局变量的方法相等?可以吗?

Scene-battle1中的 胜负判定 部分,代码如下
还原为战斗开始前的 BGM
$game_system.bgm_play($game_temp.map_bgm)
这段代码可以看出,全局变量使用bgm-play的方法,参数为$game_temp.map_bgm
的值。既然解释是还原战斗前bgm,那么猜测如下
bgm-play方法就是播放bgm,其参数就是某某音频对象
map-bgm方法就指自身(是否,各种bgm变化都带入这个对象中,以后就在调用呢?)

4.
@message_proc = nil              # 信息 返回调用 (Proc)

这个...鄙人完全不明白什么叫 返回调用...完全不懂,恳求指点

5.
@choice_start = 99               # 选择项 开始行
为什么是99呢?
还有,这个实例变量是不是控制选项最开始的位置呢?
紧接下来
@choice_max = 0      
这个就变成0了
所以不明觉厉...

6.
关于各种“标志”
比如
@gameover = false                # 游戏结束标志
@save_calling = false            # 存档 调用标志  

这些都只是一个是或否的判断,我可不可以理解为这个实例变量就是一个开关,以后检测如果true将会如何如何如果false将会如何如何?


{:2_264:} 感谢!先问这么多吧!我想先把原始的脚本啃下来。














作者: end55rpg    时间: 2013-8-16 17:16
一提10问LZ死定啦!
作者: clear仔    时间: 2013-8-16 19:25
本帖最后由 clear仔 于 2013-8-16 19:33 编辑

1.其实这是两个方法,并不是将某个变量怎么样,只是方法最后返回的是与方法名相同变量名的实变量。还有,这应该叫XX实例的XX变量,因为每一个实例都可以有同名却不同值的实变量。
2.应该是你没找到。或者说@shop_goods初始化时只需要赋为nil,这个时候可以不写,【不过不大可能,因为默认脚本里都写了】并且@shop_id并不需要每个实例都有的实例变量而是实变量。
3.没看懂你问的是什么意思。这里$game_temp.map_bgm不就是之前保存的Audio吗。
4.请给出脚本,据我所知仅仅给一个实变量赋值是不会调用任何方法的(如果给了脚本,那么抱歉,手机看不到额……)
5.一样,给出脚本
6.是的。理由与4一样
作者: kuangding66    时间: 2013-8-16 19:35
end55rpg 发表于 2013-8-16 17:16
一提10问LZ死定啦!

{:2_264:}刚看到版规,我错了下回会注意的
作者: kuangding66    时间: 2013-8-16 20:05
clear仔 发表于 2013-8-16 19:25
1.其实这是两个方法,并不是将某个变量怎么样,只是方法最后返回的是与方法名相同变量名的实变量。还有,这 ...

感谢{:2_264:}
但是,还是不太明白
1.
“每一个实例都可以有同名却不同值的实变量”
为什么每一个实例可以有同名却不同值的实变量呢?

2.
“@shop_id并不需要每个实例都有的实例变量而是实变量。”
这个我还不太懂...
不需要每个实例都有实例变量而是实变量?实例变量和实变量{:2_258:} 有点糊涂了

3.
我问的太乱了,我再想想。

4.
这个问题我其实想问的是:返回调用 这四个字是什么意思?
那段代码后面自带解释就是这四个字。

代码:
正如第18行和第67行,我想问一下它是做什么用的

RUBY 代码复制
  1. #==============================================================================
  2. # ■ Game_Temp
  3. #------------------------------------------------------------------------------
  4. #  在没有存档的情况下,处理临时数据的类。这个类的实例请参考
  5. # $game_temp 。
  6. #==============================================================================
  7.  
  8. class Game_Temp
  9.   #--------------------------------------------------------------------------
  10.   # ● 定义实例变量
  11.   #--------------------------------------------------------------------------
  12.   attr_accessor :map_bgm                  # 地图画面 BGM (战斗时记忆用)
  13.   attr_accessor :message_text             # 信息文章
  14.   attr_accessor :message_proc             # 信息 返回调用 (Proc)
  15.   attr_accessor :choice_start             # 选择项 开始行
  16.   attr_accessor :choice_max               # 选择项 项目数
  17.   attr_accessor :choice_cancel_type       # 选择项 取消的情况
  18.   attr_accessor :choice_proc              # 选择项 返回调用 (Proc)
  19.   attr_accessor :num_input_start          # 输入数值 开始行
  20.   attr_accessor :num_input_variable_id    # 输入数值 变量 ID
  21.   attr_accessor :num_input_digits_max     # 输入数值 位数
  22.   attr_accessor :message_window_showing   # 显示信息窗口
  23.   attr_accessor :common_event_id          # 公共事件 ID
  24.   attr_accessor :in_battle                # 战斗中的标志
  25.   attr_accessor :battle_calling           # 调用战斗的标志
  26.   attr_accessor :battle_troop_id          # 战斗 队伍 ID
  27.   attr_accessor :battle_can_escape        # 战斗中 允许逃跑 ID
  28.   attr_accessor :battle_can_lose          # 战斗中 允许失败 ID
  29.   attr_accessor :battle_proc              # 战斗 返回调用 (Proc)
  30.   attr_accessor :battle_turn              # 战斗 回合数
  31.   attr_accessor :battle_event_flags       # 战斗 事件执行执行完毕的标志
  32.   attr_accessor :battle_abort             # 战斗 中断标志
  33.   attr_accessor :battle_main_phase        # 战斗 状态标志
  34.   attr_accessor :battleback_name          # 战斗背景 文件名
  35.   attr_accessor :forcing_battler          # 强制行动的战斗者
  36.   attr_accessor :shop_calling             # 调用商店的标志
  37.   attr_accessor :shop_goods               # 商店 商品列表
  38.   attr_accessor :name_calling             # 输入名称 调用标志
  39.   attr_accessor :name_actor_id            # 输入名称 角色 ID
  40.   attr_accessor :name_max_char            # 输入名称 最大字数
  41.   attr_accessor :menu_calling             # 菜单 调用标志
  42.   attr_accessor :menu_beep                # 菜单 SE 演奏标志
  43.   attr_accessor :save_calling             # 存档 调用标志
  44.   attr_accessor :debug_calling            # 调试 调用标志
  45.   attr_accessor :player_transferring      # 主角 场所移动标志
  46.   attr_accessor :player_new_map_id        # 主角 移动目标地图 ID
  47.   attr_accessor :player_new_x             # 主角 移动目标 X 坐标
  48.   attr_accessor :player_new_y             # 主角 移动目标 Y 坐标
  49.   attr_accessor :player_new_direction     # 主角 移动目标 朝向
  50.   attr_accessor :transition_processing    # 过渡处理中标志
  51.   attr_accessor :transition_name          # 过渡 文件名
  52.   attr_accessor :gameover                 # 游戏结束标志
  53.   attr_accessor :to_title                 # 返回标题画面标志
  54.   attr_accessor :last_file_index          # 最后存档的文件编号
  55.   attr_accessor :debug_top_row            # 调试画面 保存状态用
  56.   attr_accessor :debug_index              # 调试画面 保存状态用
  57.   #--------------------------------------------------------------------------
  58.   # ● 初始化对像
  59.   #--------------------------------------------------------------------------
  60.   def initialize
  61.     @map_bgm = nil
  62.     @message_text = nil
  63.     @message_proc = nil
  64.     @choice_start = 99
  65.     @choice_max = 0
  66.     @choice_cancel_type = 0
  67.     @choice_proc = nil
  68.     @num_input_start = 99
  69.     @num_input_variable_id = 0
  70.     @num_input_digits_max = 0
  71.     @message_window_showing = false
  72.     @common_event_id = 0
  73.     @in_battle = false
  74.     @battle_calling = false
  75.     @battle_troop_id = 0
  76.     @battle_can_escape = false
  77.     @battle_can_lose = false
  78.     @battle_proc = nil
  79.     @battle_turn = 0
  80.     @battle_event_flags = {}
  81.     @battle_abort = false
  82.     @battle_main_phase = false
  83.     @battleback_name = ''
  84.     @forcing_battler = nil
  85.     @shop_calling = false
  86.     @shop_id = 0
  87.     @name_calling = false
  88.     @name_actor_id = 0
  89.     @name_max_char = 0
  90.     @menu_calling = false
  91.     @menu_beep = false
  92.     @save_calling = false
  93.     @debug_calling = false
  94.     @player_transferring = false
  95.     @player_new_map_id = 0
  96.     @player_new_x = 0
  97.     @player_new_y = 0
  98.     @player_new_direction = 0
  99.     @transition_processing = false
  100.     @transition_name = ""
  101.     @gameover = false
  102.     @to_title = false
  103.     @last_file_index = 0
  104.     @debug_top_row = 0
  105.     @debug_index = 0
  106.   end
  107. end





5.
我再多多思考一下

6.
这个明白了!



{:2_264:} 十分感谢您!我回去继续再看一遍教程
作者: yagami    时间: 2013-8-16 21:05
你先搞清楚神马是类 神马是对象 面向对象的意思
作者: clear仔    时间: 2013-8-17 09:37
本帖最后由 clear仔 于 2013-8-17 09:54 编辑

不好意思,多点了一下还没来得及取消,就占了一楼……
作者: clear仔    时间: 2013-8-17 09:49
本帖最后由 clear仔 于 2013-8-17 09:50 编辑

给个例子:
class A
attr_accessor:b#定义实例变量
def initialize#初始化
@a=1
@b=0
end
def add(@a,@b)
@b-=@a
end
end
c=A.new
d=A.new
d.b=5
这样c就是A的实例,则c就有变量b却没有a(或者说c的b就是初始化的0,c的a是nil,因为没有定义),且d也是A的实例,但是这时候c的b(0)却不等于d的b(5),它们就是实例变量,所以就同名却不同值,但它们都没有a(nil),所以不用类方法定义a,@a仅仅只是实变量,和全局变量差不多的性质:它是在这个类中都可以用的变量。
至于返回调用,参考4的原因,应该就是判定然后调用某个方法。(我也是头一回听返回调用)
5那个你仅仅只给变量,连什么类都不说的话,真没办法……
作者: kuangding66    时间: 2013-8-18 19:04
clear仔 发表于 2013-8-17 09:49
给个例子:
class A
attr_accessor:b#定义实例变量

实在是太感谢了!!!!{:2_264:}
感谢这么耐心的讲解!!!非常受用!!
作者: kuangding66    时间: 2013-8-18 19:04
yagami 发表于 2013-8-16 21:05
你先搞清楚神马是类 神马是对象 面向对象的意思

{:2_264:}好的多谢建议
作者: kuangding66    时间: 2013-8-18 19:38
clear仔 发表于 2013-8-17 09:49
给个例子:
class A
attr_accessor:b#定义实例变量

所以说,变量c和d中@a之所以为nil是因为定义实例变量的时候只写了attr_accessor:b而没有attr_accessor:a吗?
虽然初始化中给@a的值为1,但是因为之前没有attr_accessor:a所以之后生成新实例的时候就没有@a的事了?
作者: yagami    时间: 2013-8-18 20:10
给你写了很通俗的一个例子

  1. class A
  2. attr_reader :aa
  3. attr_accessor :bb   
  4. def initialize
  5.    @aa="aa"
  6.    @bb="bb"
  7.    @cc=1
  8. end

  9. def getcc
  10.    return @cc
  11. end

  12. def setcc(x)
  13.   @cc=x
  14. end

  15. def setaa(x)
  16.   @aa=x
  17. end
  18. end


  19. a=A.new
  20. p a.aa ###attr_accessor可以直接访问
  21. p a.bb###attr_reader 可以直接访问
  22. p a.getcc##没标识attr_ 所以不能直接访问 通过成员函数访问
  23. a.bb="bbb"###attr_accessor所以可以直接赋值
  24. a.setaa("aaa")###attr_reader 只能访问不能更改 所以通过成员函数修改
  25. a.setcc(10)###没标识attr_ 所以不能直接修改 通过成员函数修改
  26. p a.aa
  27. p a.bb
  28. p a.getcc

  29. #######以下都不合法
  30. a.aa="aaa"
  31. p a.cc
  32. a.cc=10

复制代码

作者: kuangding66    时间: 2013-8-18 21:59
yagami 发表于 2013-8-18 20:10
给你写了很通俗的一个例子

{:2_264:}太感谢啦!!!
这个例子太棒啦非常感谢!!!
作者: Algalon    时间: 2013-8-19 06:14
要搞清楚accessor, reader 和writer的区别。accessor同时拥有reader和writer两个的功能。即方法化实例变量,同时允许对该变量的获取和修改。
另外为何要方法化? 很简单。在本类的实例方法中你可以直接调用和修改实例变量,但是在本类外(其他类)调用某一类的实例的时候只能使用方法来调用。如果你直接在类A中修改类B中的实例变量@b = 5, 系统提示该变量不存在。因此你要在A中调用B类的对象并修改其实例时只能先用accessor/reader/writer方法化然后再用类方法调用:B.b = 5




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