Project1

标题: [已解决]Game_Actor和Game_Actors有什么关系联系? [打印本页]

作者: miantouchi    时间: 2019-4-10 15:00
标题: [已解决]Game_Actor和Game_Actors有什么关系联系?
本帖最后由 miantouchi 于 2019-4-15 12:53 编辑

# ■ Game_Actor
#------------------------------------------------------------------------------
#  处理角色的类。本类在 Game_Actors 类 ($game_actors)
# 的内部使用、Game_Party 类请参考 ($game_party) 。

脚本开头有这么一段注释,他们差了一个s,并且 Game_Actor在Game_Actors 类内部使用,怎么个使用法?
Game_Actors 类里面就不几段代码,目前我就知道个继承类的关系,他俩明显也不是继承的关系。
怎么理解这个内部使用,如何使用?
作者: 百里_飞柳    时间: 2019-4-10 15:31
本帖最后由 百里_飞柳 于 2019-4-10 22:42 编辑

…… game_actors里面有个数组专门存Game_Actor的实例的,你可以理解为存的是一队人物的实例,
然后在game_party里面存了一个game_actors

大概就是
game_actor是我方角色的实例
game_actors存储的是全部我方角色(在队伍中的)
game_party存的是玩家的队伍(含有我方角色、持有道具、持有金钱)的全部信息



修正:
经dalao们提醒我才发现,game_actors里存储的是与数据库里角色一一对应的实例,用于保存角色在游戏中途修改后的属性信息的
而game_party中有@actors存储当前队伍中的角色的id,当需要获得角色实例时,是通过$game_actors[id]获得
作者: 灯笼菜刀王    时间: 2019-4-10 15:40
简单的说
game_actors 是把数据库里的角色"本地保存"

这也是为什么你的阿尔西斯可以升级到10级后,离队休假, 之后再入队的时候还能保持原本的属性(别手贱勾上初始化...), 而不是恢复到数据库设置的那个状态的原因
作者: miantouchi    时间: 2019-4-10 20:35
本帖最后由 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类的实例。
作者: RyanBern    时间: 2019-4-10 22:42
Game_Actors 是一个类数组(Array-Like),尽管它不是数组但是也可以进行取下标的运算。

游戏进行的时候从始至终只有一个 Game_Actors 的实例,它里面按照角色 ID 存储着所有 Game_Actor 的实例,这些实例仅此一份,在游戏进行中会随着玩家操作不断变化(例如升级,学习技能,当前血量等)。

需要注意在队伍 Game_Party 中也有一个 @actors 数组,这不是 Game_Actors,它记录了当前队伍中的角色,里面的数据仅仅引用 $game_actors 的内容。因此 2 楼的说法是不对的。
作者: miantouchi    时间: 2019-4-11 12:20
RyanBern 发表于 2019-4-10 22:42
Game_Actors 是一个类数组(Array-Like),尽管它不是数组但是也可以进行取下标的运算。

游戏进行的时候从始 ...

理解示意图

1.jpg (78.45 KB, 下载次数: 13)

1.jpg

作者: miantouchi    时间: 2019-4-12 18:34
本帖最后由 miantouchi 于 2019-4-12 18:39 编辑
RyanBern 发表于 2019-4-10 22:42
Game_Actors 是一个类数组(Array-Like),尽管它不是数组但是也可以进行取下标的运算。

游戏进行的时候从始 ...



看了你的示意图之后,不知道我理解的对不对,不对的希望指正

第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?
作者: RyanBern    时间: 2019-4-12 19:35
miantouchi 发表于 2019-4-12 18:34
看了你的示意图之后,不知道我理解的对不对,不对的希望指正

第1我理解的:

不太对。

你可以这样理解,$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 21:52
本帖最后由 miantouchi 于 2019-4-12 21:56 编辑
RyanBern 发表于 2019-4-12 19:35
不太对。

你可以这样理解,$game_actors 是 Game_Actors 类的一个实例,它是一个全局仓库,里面按顺序放 ...

  1. class Game_Actors
  2.   #--------------------------------------------------------------------------
  3.   # ● 初始化对像
  4.   #--------------------------------------------------------------------------
  5.   def initialize
  6.     @data = []
  7.   end
  8.   #--------------------------------------------------------------------------
  9.   # ● 获取角色
  10.   #     actor_id : 角色 ID
  11.   #--------------------------------------------------------------------------
  12. def [](actor_id)
  13.     if actor_id > 999 or $data_actors[actor_id] == nil
  14.       return nil
  15.     end
  16.     if @data[actor_id] == nil
  17.       @data[actor_id] = Game_Actor.new(actor_id)
  18.     end
  19.     return @data[actor_id]
  20. end
复制代码

假如我现在调用$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 23:03
本帖最后由 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是数据库全部人物数据




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