本帖最后由 芯☆淡茹水 于 2014-11-15 00:19 编辑
点评时没把问题看清楚。
问题2:
$game_actors 的 [] 和 其实例变量 @data 的 [] 是不同的。
$game_actors 的 [] 是 Game_Actors 的 [] 方法,
实例变量 @data 的 [] 是 Array 的 [] 方法。#<= 貌似是这样的说法。
只是 $game_actors[] 沿用了其内部的实例变量 @data[] ,这两个 [] 是相等的。#--------------------------------------------------------------------------
def [](actor_id)
if actor_id > 999 or $data_actors[actor_id] == nil
return nil
end
if @data[actor_id] == nil
@data[actor_id] = Game_Actor.new(actor_id)
end
return @data[actor_id]
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的方法调用添加过的角色:
p $game_actors .data [ 1 ] .class # => NilClass
p $game_actors [ 1 ] .class # => Game_Actor
p $game_actors .data [ 1 ] .class # => Game_Actor
p $game_actors .data [ 1 ] .class # => NilClass
p $game_actors [ 1 ] .class # => Game_Actor
p $game_actors .data [ 1 ] .class # => Game_Actor