设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索

[已解决]Game_Actor和Game_Actors有什么关系联系?

查看数: 3533 | 评论数: 9 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2019-4-10 15:00

正文摘要:

本帖最后由 miantouchi 于 2019-4-15 12:53 编辑 # ■ Game_Actor #------------------------------------------------------------------------------ #  处理角色的类。本类在 Game_Actors 类 ($game_actors) ...

回复

miantouchi 发表于 2019-4-12 23:03:07
本帖最后由 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:52:45
本帖最后由 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的内容,红色部分是我分析的内容
RyanBern 发表于 2019-4-12 19:35:30
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 18:34:46
本帖最后由 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-10 22:42:42
Game_Actors 是一个类数组(Array-Like),尽管它不是数组但是也可以进行取下标的运算。

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

需要注意在队伍 Game_Party 中也有一个 @actors 数组,这不是 Game_Actors,它记录了当前队伍中的角色,里面的数据仅仅引用 $game_actors 的内容。因此 2 楼的说法是不对的。

点评

我画的示意图对吗?  发表于 2019-4-11 12:21
rb,cxl,awsl  发表于 2019-4-11 10:53
dl,sdl,awsl  发表于 2019-4-11 00:52

评分

参与人数 1+1 收起 理由
百里_飞柳 + 1 rb

查看全部评分

miantouchi 发表于 2019-4-10 20:35:20
本帖最后由 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类的实例。

点评

是这样  发表于 2019-4-10 21:48
灯笼菜刀王 发表于 2019-4-10 15:40:22
简单的说
game_actors 是把数据库里的角色"本地保存"

这也是为什么你的阿尔西斯可以升级到10级后,离队休假, 之后再入队的时候还能保持原本的属性(别手贱勾上初始化...), 而不是恢复到数据库设置的那个状态的原因

点评

麻烦看下我说的对吗?在下楼了  发表于 2019-4-10 20:36
百里_飞柳 发表于 2019-4-10 15:31:36
本帖最后由 百里_飞柳 于 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-11 10:38
已修正,过于丢人,早知道不回惹  发表于 2019-4-10 22:42
有误,$game_party 里存的不是 Game_Actors 的实例  发表于 2019-4-10 22:37
game_actor 可不一定都是我方啊 毕竟 actor里一般也会塞奇奇怪怪的东西来用 233  发表于 2019-4-10 22:12
麻烦看下我说的对吗?在下楼  发表于 2019-4-10 20:35
拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-11 09:16

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表