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

Project1

 找回密码
 注册会员
搜索
查看: 3532|回复: 21
打印 上一主题 下一主题

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

[复制链接]

Lv4.逐梦者

梦石
0
星屑
14571
在线时间
2191 小时
注册时间
2019-1-24
帖子
1123

R考场第七期纪念奖

跳转到指定楼层
1
发表于 2019-4-10 15:00:52 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 miantouchi 于 2019-4-15 12:53 编辑

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

脚本开头有这么一段注释,他们差了一个s,并且 Game_Actor在Game_Actors 类内部使用,怎么个使用法?
Game_Actors 类里面就不几段代码,目前我就知道个继承类的关系,他俩明显也不是继承的关系。
怎么理解这个内部使用,如何使用?

Lv4.逐梦者

梦石
0
星屑
14571
在线时间
2191 小时
注册时间
2019-1-24
帖子
1123

R考场第七期纪念奖

10
 楼主| 发表于 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是数据库全部人物数据
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14571
在线时间
2191 小时
注册时间
2019-1-24
帖子
1123

R考场第七期纪念奖

9
 楼主| 发表于 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的内容,红色部分是我分析的内容
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

8
发表于 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 是为了占位。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14571
在线时间
2191 小时
注册时间
2019-1-24
帖子
1123

R考场第七期纪念奖

7
 楼主| 发表于 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?
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14571
在线时间
2191 小时
注册时间
2019-1-24
帖子
1123

R考场第七期纪念奖

6
 楼主| 发表于 2019-4-11 12:20:56 | 只看该作者
RyanBern 发表于 2019-4-10 22:42
Game_Actors 是一个类数组(Array-Like),尽管它不是数组但是也可以进行取下标的运算。

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

理解示意图

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

1.jpg

点评

好强大的帖子,拜读了,里面有很多是我学习已来困惑地方,虽然一时间不能都整明白。  发表于 2019-4-12 18:18
参考这个帖子的0.3节:https://rpg.blue/forum.php?mod=viewthread&tid=335455  发表于 2019-4-11 12:55
回复 支持 1 反对 0

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

5
发表于 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

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14571
在线时间
2191 小时
注册时间
2019-1-24
帖子
1123

R考场第七期纪念奖

4
 楼主| 发表于 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
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
39009
在线时间
5716 小时
注册时间
2006-11-10
帖子
6618
3
发表于 2019-4-10 15:40:22 | 只看该作者
简单的说
game_actors 是把数据库里的角色"本地保存"

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

点评

麻烦看下我说的对吗?在下楼了  发表于 2019-4-10 20:36
回复 支持 反对

使用道具 举报

Lv6.析梦学徒

老鹰

梦石
40
星屑
34705
在线时间
6738 小时
注册时间
2012-5-26
帖子
3259

极短24评委极短23参与极短22参与极短21评委老司机慢点开短篇十吟唱者组别冠军开拓者剧作品鉴家

2
发表于 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 08:42

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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