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

Project1

 找回密码
 注册会员
搜索
查看: 2760|回复: 18

[已经解决] 对于RB大大 脚本教程中的3个疑问。

[复制链接]

Lv4.逐梦者

梦石
0
星屑
14051
在线时间
2135 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

发表于 2021-9-16 15:48:22 | 显示全部楼层 |阅读模式

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

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

x
如下图这个是截取RB大大的教程部分。
1.png
问题1:RB大大给的结论是,$game_actors是存储所有主角角色的变量,编写的时候利用了类Array的外壳。
但是我看了下脚本如下图
5.jpg
2.png
3.png
$game_actors默认是有当前队伍成员信或者是战斗者成员信息,并不是全部成员信息吧,也就是默认存了1,2,7,8这四个角色的信息,其过程中入队/离队的人员
也会加入到$game_actors里面,并不是下图的1到8号数据库默认所有角信息。
4.png

2.我的第二疑问是,第一张的思维导图当中,Game_Party当中的【2】 指向的是角色数据4,角色数据3 没有指向的箭头。
我自己想了想,是不是,默认4有,角色数据1到角色数据4,后来经过操作,角色数据3离队了,所以Game_Party当中的@actor数组少了1个,
也就是数据角色3对应的项目被删除了。而$game_actors里面数据还是四个,不知道我想的对不对

3.第3个疑问,大家可以想想,如果不调用$game_party.refresh,会出现什么后果,而此时的内存地址模型又是怎样的?
这句话,我按照代码测试了$game_actors[1]和$game_party.actors[0]是一样的,但是它们的地址却不一样,
我自己装备了一些东西,保存了一些物品,升了几级,载入存档后也没发现什么异常。

Lv5.捕梦者

梦石
0
星屑
33038
在线时间
10469 小时
注册时间
2009-3-15
帖子
4756
发表于 2021-9-16 16:24:26 | 显示全部楼层
本帖最后由 soulsaga 于 2021-9-16 22:27 编辑

这个看不懂.....

点评

哎..看错了..不用理..  发表于 2021-9-16 18:16
太精简了。。。  发表于 2021-9-16 16:44
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23963
在线时间
3338 小时
注册时间
2011-7-8
帖子
3925

开拓者

发表于 2021-9-16 16:40:37 | 显示全部楼层
什么意思,你有3个问题?还是教程里提出了3个问题?

点评

意思是我有3个地方没看懂,提出了3个问题。  发表于 2021-9-16 16:43
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7921
在线时间
1049 小时
注册时间
2012-4-3
帖子
1271

开拓者

发表于 2021-9-17 14:38:27 手机端发表。 | 显示全部楼层
第三个问题,对game_party的refresh,它的内容就是对@actors的重新排序。refresh的原文是:“游戏数据载入后角色对象直接从$game_actors分离,回避由于载入造成的角色再设置的问题。”如果队伍的角色顺序产生变化,最好是要refresh的。
至于内存地址,如果你有耐心,可以调出cache的脚本,追踪并记录它的地址,如行走图的内存精灵就是它的路径,一般是:Graphics/Characters/+文件名。

点评

我说的不好,建议直接看看game_party关于refresh的原文吧,内容不多,就几行。  发表于 2021-9-18 05:37
你这个回答不太对,可以看下5楼  发表于 2021-9-17 23:00
这个地方真是有点抽象,需要好好理解  发表于 2021-9-17 20:08
补充:全局搜索了一下,用到$game_party.refresh的地方仅在读档时。  发表于 2021-9-17 14:44

评分

参与人数 1+1 收起 理由
miantouchi + 1 塞糖

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7926
在线时间
1181 小时
注册时间
2007-7-29
帖子
2055
发表于 2021-9-17 16:13:24 | 显示全部楼层
本帖最后由 enghao_lim 于 2021-9-17 16:20 编辑

1. Game_Actors只是一个类Array,更严格上来说是Hash表,它并不是时时储存着所有的角色,只有在角色第一被调用是才会储存,之后一直带入存档,也就是说如果有角色从来都没有被使用过,$game_actors里头也不会储存过该角色的资料,具体被调用才储存参考函数:def [](actor_id)。
2. 如果初始队伍就是1,2,4那3不会被创建。如果3曾经离队,也会记录在案。
3. 如果不调用refresh,那读档后的阿尔西斯就不再是阿尔西斯。给个简单的测试方法:取消调用refresh。初始队伍不要有阿尔西斯,然后让阿尔西斯加入,存档,返回标题,读档,再让阿尔西斯加入。恭喜完成两个阿尔西斯。
不调用refresh的后果就是造成$game_party.actors都是$game_actors的克隆体,克隆体看似一样,但其实已经不一样。后续的RM其实已经解决了这个会误导新手的问题,那就是$game_party.actors不再是储存对象本身而是ID而已,这样存档的时候就不会有克隆体。

点评

refresh的作用就是把2.txt的A给消灭掉并修正回使用1.txt的A。  发表于 2021-9-18 14:49
不是读档的问题,是存档。存档的时候game_party被整个存入,就好像你原本只有一个A,存档时你把A存入1.txt和2.txt,那就有两个A了。  发表于 2021-9-18 14:48
我会理解为个人风格,直接中对象操作有对象操作的便利性,用ID有用ID的实用性。  发表于 2021-9-18 14:46
第三个的不调用refresh后果是看到了,读档后两个阿尔西斯,是读档的问题吗,代码写的有严谨吧。  发表于 2021-9-17 20:35
第一个应该是明白了,和我想的差不多。第二个应该是我引用方面没理解。 第三个太抽象了。  发表于 2021-9-17 20:32

评分

参与人数 2星屑 +150 +2 收起 理由
RyanBern + 150 + 1 认可答案
miantouchi + 1 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14051
在线时间
2135 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

 楼主| 发表于 2021-9-19 10:12:23 | 显示全部楼层
本帖最后由 miantouchi 于 2021-9-19 12:05 编辑
enghao_lim 发表于 2021-9-17 16:13
1. Game_Actors只是一个类Array,更严格上来说是Hash表,它并不是时时储存着所有的角色,只有在角色第一被 ...


感谢详细的分析解答,我根据RB的教程和你、菜刀、RPGzh500223的详细解释,通过代码去验证下了。我这个人抽象思维不太行
所以全程按照之前的笨办法,p出来还画了图。


1.首先,我设置成初始角色1,2,7,8这四个角色
1.png

2.然后分别再设置初期同伴 setup_starting_members 里面
  存档的两处地方,存档前后
  读档的两处地方,读档前后
共计5个地方p了下 $game_party.actors[2].to_s,$game_actors[7].to_s
队伍的第3号角色,数据库的7号角色,实际是同一个人(为了个人理解)

2.png

3.png

4.png

3.下面是验证结果图
5.png
上图是设置初期同伴 处p的结果,也就是指向同一地址

6.png

7.png
上面两张图是存档前后指向地址同一地址。

8.png
上图是读档,发现$game_party和$game_actors指向的地址均改变了

9.png
最后经过,   # 刷新同伴成员 $game_party.refresh
两个地址指向同一地址了。也就是同步了。

结论是:
①从进入游戏一直到读档之前$game_party和$game_actors 指向地址一直是一样的"#<Game_Actor:0x9ed5ec8>"
②存档过后,系统对$game_party和$game_actors又各自保存了一份。
③玩家退出游戏后原始的"#<Game_Actor:0x9ed5ec8>"内存地址消失
④现在玩家读档就会读出来之前存档后各自保存的$game_party和$game_actors地址(各自的新地址,不是最开始游戏的地址)
⑤也就是$game_party指向了"#<Game_Actor:0x9ea3120>",$game_actors指向了"#<Game_Actor:0x9ea48d8>"
⑥最后通过 $game_party.refresh  后$game_party的地址也指向了"#<Game_Actor:0x9ea48d8>"实现了同步。
如果不同步也就是容易造成一些乌龙,改了$game_party的话$game_actors的数据没有变化,反之同理。



下楼是我画的模仿RB画的思维导图。如果不准确希望指点下,好改正。






评分

参与人数 2星屑 +50 +2 收起 理由
RyanBern + 50 + 1 我很赞同
enghao_lim + 1 恭喜毕业~

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14051
在线时间
2135 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

 楼主| 发表于 2021-9-19 11:50:02 | 显示全部楼层
下面是我画的内存分析图,如有错误欢迎指正。

1.png
这张图是保存存档后,读档后系统指向数据一样,但是指向不同的示意图


2.png
这张是调用$game_party.refresh同步后示意图
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

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

GMT+8, 2024-3-29 09:36

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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