Project1

标题: 两个很晦涩的疑点,程序闹情绪了吗? [打印本页]

作者: kvkv97    时间: 2014-11-14 11:15
标题: 两个很晦涩的疑点,程序闹情绪了吗?
本帖最后由 kvkv97 于 2014-11-14 11:17 编辑

问题1:
  1. 为什么我在main前面插入
  2. p $game_actors = Game_Actors.new
  3. p $game_actors[1]
  4. Game_Actors类的23行会出现错误
  5. def [](actor_id)
  6.   if actor_id > 999 or $data_actors[actor_id] == nil
  7.      return nil
  8.   end
  9.   if @data[actor_id] == nil
  10.      @data[actor_id] = Game_Actor.new(actor_id)
  11.   end
  12.   return @data[actor_id]##@data[actor_id]
  13. end
  14. 说nil:NilClass找不到方法[]
复制代码
问题2:

  1. Game_Party类中
  2. for i in $data_system.party_members
  3.    @actors.push($game_actors[i])
  4. end
  5. 我在Game_Actors类加入了模块attr_reader :data
  6. 问题是:
  7. $game_actors[i]和$game_actors.data[i]相同吗?
  8. 如果相同,为什么Game_Actor类的character_name就召唤不了?
复制代码

作者: 国产吃货    时间: 2014-11-14 18:07
本帖最后由 国产吃货 于 2014-11-14 18:14 编辑

1-

错误的: 调用 $game_actors 变量,这个时候还没有被创建。
  ↓
main 运行
   ↓
场景管理器 初始化
  ↓
数据管理器初始化 →  Game_Actors 的实例创建保存在 →$game_actors 变量内。
  ↓
正确的:应该在实例创建之后再调用 $game_actors

------------------------------------------------
2-

想要知道是否一样,分别P他们,得到内存地址进行比对。
作者: 恐惧剑刃    时间: 2014-11-14 19:43
本帖最后由 恐惧剑刃 于 2014-11-14 19:48 编辑

第一个问题,“全局变量”没有被定义其值为nil,所以

if actor_id > 999 or $data_actors[actor_id] == nil 必然报错!
Game_Actor,setup 中 actor = $data_actors[actor_id]必然报错!
类似的下方 for j in $data_classes[@class_id].learnings   , update_auto_state(nil, $data_armors[@armor1_id]) 都会报错!
解决方法
  1. $data_actors        = load_data("Data/Actors.rxdata")
  2. $data_classes       = load_data("Data/Classes.rxdata")
  3. $data_armors        = load_data("Data/Armors.rxdata")
  4. p $game_actors = Game_Actors.new
  5. p $game_actors[1]
复制代码
第二个问题,当然不一样!!
attr是定义一个属性(实例变量),不是导入什么模块!!
看来Ry之前给解答的一些问题你还没有懂啊?

最后我的建议:
不要去管那些概念!!照着教学录像做,到时候这些东西自然都会明白!!
举个不恰当的例子,我们学英语,学它的目的是能说而不是会背语法!!
类似的,
学脚本的目的是能写而不是能讲概念!!
作者: 芯☆淡茹水    时间: 2014-11-14 23:31
本帖最后由 芯☆淡茹水 于 2014-11-15 00:19 编辑

点评时没把问题看清楚。
问题2:
$game_actors 的 [] 和 其实例变量 @data 的 [] 是不同的。
$game_actors 的 [] 是 Game_Actors 的 [] 方法,
实例变量 @data 的 [] 是  Array 的 [] 方法。#<= 貌似是这样的说法。
只是 $game_actors[] 沿用了其内部的实例变量 @data[] ,这两个 [] 是相等的。
  1. #--------------------------------------------------------------------------
  2.   def [](actor_id)
  3.     if actor_id > 999 or $data_actors[actor_id] == nil
  4.       return nil
  5.     end
  6.     if @data[actor_id] == nil
  7.       @data[actor_id] = Game_Actor.new(actor_id)
  8.     end
  9.     return @data[actor_id]
  10.   end
复制代码
这个只是定义了 Game_Actors 的 [] 的方法,它并没有在生成实例 $game_actors 时把所有角色都加入到 @data 里。
初始时, p $game_actors.data   #=> []
在调用某个角色:$game_actors[actor_id] 时,才往里面添加对应角色。
首先判断 actor_id 是否大于 999 或者 数据库相对应的 actor_id 是否为 nil 。是就返回 nil
然后判断如果数组 @data 里没有添加与 actor_id 相对应的角色,添加一个新的 Game_Actor 类。
最后返回 @data[actor_id]。
下面这样可以用LZ的方法调用添加过的角色:
RUBY 代码复制
  1. p $game_actors.data[1].class  # => NilClass
  2. p $game_actors[1].class       # => Game_Actor
  3. p $game_actors.data[1].class  # => Game_Actor

作者: RyanBern    时间: 2014-11-15 11:28
本帖最后由 RyanBern 于 2014-11-15 11:40 编辑

第一个问题参考恐惧剑刃的回答,问题关键在于$data_actors还没载入。
第二个问题参考芯大的回答,问题的关键在于定义的Game_Actors#[]和Array#[]不一样,Game_Actors#[]多了一步对@data内容的初始化。
两个答案结合起来就是标准回答了,RB在这里不加补充了。

其实我要啰嗦的是,学脚本/编程的时候要格外注重自己的心态,不要过多地增加自己的主观色彩,不要总是觉得程序写出来应该是怎样。一切要以事实为准,头脑中想得再好,弄到实际操作中出现了错误,这基本就说明你的想法是有问题的。不要总把错误归到程序或者计算机上,他们只是奉命行事,做事出了问题肯定是下达命令的人(写代码的人)思路出现了问题。也不要总觉得出现的问题很晦涩,很难懂,实际就是你自己考虑问题不全面不细致或者根本就是想错了。所以写程序就是在锻炼唯物主义思维
作者: taroxd    时间: 2014-11-15 15:44
本帖最后由 taroxd 于 2014-11-15 15:46 编辑
RyanBern 发表于 2014-11-15 11:28
第一个问题参考恐惧剑刃的回答,问题关键在于$data_actors还没载入。
第二个问题参考芯大的回答,问题的关 ...


Rb大大快告诉我为什么VA里的 Plane#visible 永远返回 true

你当我想在 ULDS 里面写那个局部变量 visible 啊。害得我还要为了更新 visible 再多写一个方法。




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