本帖最后由 miantouchi 于 2019-4-15 12:53 编辑 $game_actors是存储所有主角角色的变量 $game_party.actors是存储当前队伍中所有角色的数组 如: # ● 设置初期同伴 #-------------------------------------------------------------------------- def setup_starting_members @actors = [] for i in $data_system.party_members#初期同伴4个人。是角色 ID 的数组。 @actors.push($game_actors) end end 只是把初期的4个同伴加入到了@actors数组当中,$game_actors这句就相当于调用里面的方法,data[]数组里面存入指定的人物数据。 $game_actors是数据库全部人物数据 |
本帖最后由 miantouchi 于 2019-4-12 21:56 编辑 RyanBern 发表于 2019-4-12 19:35
假如我现在调用$game_actors[1]这句 def [](1) if 1 > 999 or $data_actors[1] == nil return nil end if @data[1] == nil @data[1] = Game_Actor.new(1) end return @data[1] end @data[1]保存的就是Game_Actor的第1个实例 所以 $game_actors[2]执行的就是@data[2]保存的就是Game_Actor的第2个实例 $game_actors[3]执行的就是@data[3]保存的就是Game_Actor的第3个实例 ...... 一会还有东西要发,先看看我这步对不对,最上面的是Game_Actors的内容,红色部分是我分析的内容 |
miantouchi 发表于 2019-4-12 18:34 不太对。 你可以这样理解,$game_actors 是 Game_Actors 类的一个实例,它是一个全局仓库,里面按顺序放着玩家操控的角色的数据。$game_actors[1] 就是存放 ID 为 1 的角色的数据,这个你先前理解的是对的。 @actors 不是 $game_party 的子集,而是 $game_actors 的子集(更详细来说是 $game_actors 内部实现中数组 @data 的子集,这个你参考 Game_Actors 代码就能看见 @data 的定义 ) 你这个回复里 “Game_Actor 类的第一个实例内容”的说法是错误的,没有这个概念。 $game_actors 第一个位置是 nil 是因为 ruby 中数组下标以 0 开始,但是角色 ID 以 1 开始。用 nil 是为了占位。 |
本帖最后由 miantouchi 于 2019-4-12 18:39 编辑 RyanBern 发表于 2019-4-10 22:42 看了你的示意图之后,不知道我理解的对不对,不对的希望指正 第1我理解的: ①@actors是$game_party的子集 @actors这个数组每个成员相当于一个引用,并不是实际内容, 实际内容是Game_Actor类的实例。@actors[0]引用了, Game_Actor类的第一个实例"角色1数据"的实际内容,@actors[1]....依次类推。 ②$game_actors[1]同样也是指向Game_Actor类第一个实例的引用"角色数据1", 并不是我理解的$game_actors[1]就是"角色1数据", @actors[0],@actors[1],@actors[2],$game_actors[1],$game_actors[2],$game_actors[3],$game_actors[4]这些只是引用,不是实际的内容。 ③所以@actors[0]和$game_actors[1]都同时指向了Game_Actor类的第一个实例内容,所以@actors并不等于$game_actors只是他俩引用指向的内容相同 第2个困惑:$game_actors第一个位置为什么是nil? |
Game_Actors 是一个类数组(Array-Like),尽管它不是数组但是也可以进行取下标的运算。 游戏进行的时候从始至终只有一个 Game_Actors 的实例,它里面按照角色 ID 存储着所有 Game_Actor 的实例,这些实例仅此一份,在游戏进行中会随着玩家操作不断变化(例如升级,学习技能,当前血量等)。 需要注意在队伍 Game_Party 中也有一个 @actors 数组,这不是 Game_Actors,它记录了当前队伍中的角色,里面的数据仅仅引用 $game_actors 的内容。因此 2 楼的说法是不对的。 |
本帖最后由 miantouchi 于 2019-4-16 16:29 编辑 打个比方,我方有4个人, game_actors这个的时候就是全部我方角色4个人的集合,相当于包含了这4个角色。 当$game_actors[0],就相当于Game_Actor类的一个实例,相当于第一个人物,然后把第一个人物传入@data[0] 当$game_actors[1],就相当于Game_Actor类的一个实例,相当于第二个人物,然后把第二个人物传入@data[1] 当$game_actors[2],就相当于Game_Actor类的一个实例,相当于第三个人物,然后把第三个人物传入@data[2] 当$game_actors[3],就相当于Game_Actor类的一个实例,相当于第四个人物,然后把第四个人物传入@data[3] 想要用Game_Actor的实例,必须要先用Game_Actors类的全局变量$game_actors,才能得到Game_Actor类的实例。 |
简单的说 game_actors 是把数据库里的角色"本地保存" 这也是为什么你的阿尔西斯可以升级到10级后,离队休假, 之后再入队的时候还能保持原本的属性(别手贱勾上初始化...), 而不是恢复到数据库设置的那个状态的原因 |
本帖最后由 百里_飞柳 于 2019-4-10 22:42 编辑 …… game_actors里面有个数组专门存Game_Actor的实例的,你可以理解为存的是一队人物的实例, 大概就是 game_actor是我方角色的实例 game_actors存储的是全部我方角色(在队伍中的) game_party存的是玩家的队伍(含有我方角色、持有道具、持有金钱)的全部信息 修正: 经dalao们提醒我才发现,game_actors里存储的是与数据库里角色一一对应的实例,用于保存角色在游戏中途修改后的属性信息的 而game_party中有@actors存储当前队伍中的角色的id,当需要获得角色实例时,是通过$game_actors[id]获得 |
站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作
GMT+8, 2024-11-11 09:16
Powered by Discuz! X3.1
© 2001-2013 Comsenz Inc.