Project1

标题: 对于RB大大 脚本教程中的3个疑问。 [打印本页]

作者: miantouchi    时间: 2021-9-16 15:48
标题: 对于RB大大 脚本教程中的3个疑问。
如下图这个是截取RB大大的教程部分。

问题1:RB大大给的结论是,$game_actors是存储所有主角角色的变量,编写的时候利用了类Array的外壳。
但是我看了下脚本如下图



$game_actors默认是有当前队伍成员信或者是战斗者成员信息,并不是全部成员信息吧,也就是默认存了1,2,7,8这四个角色的信息,其过程中入队/离队的人员
也会加入到$game_actors里面,并不是下图的1到8号数据库默认所有角信息。


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]是一样的,但是它们的地址却不一样,
我自己装备了一些东西,保存了一些物品,升了几级,载入存档后也没发现什么异常。
作者: soulsaga    时间: 2021-9-16 16:24
本帖最后由 soulsaga 于 2021-9-16 22:27 编辑

这个看不懂.....
作者: guoxiaomi    时间: 2021-9-16 16:40
什么意思,你有3个问题?还是教程里提出了3个问题?
作者: Im剑侠客    时间: 2021-9-17 14:38
第三个问题,对game_party的refresh,它的内容就是对@actors的重新排序。refresh的原文是:“游戏数据载入后角色对象直接从$game_actors分离,回避由于载入造成的角色再设置的问题。”如果队伍的角色顺序产生变化,最好是要refresh的。
至于内存地址,如果你有耐心,可以调出cache的脚本,追踪并记录它的地址,如行走图的内存精灵就是它的路径,一般是:Graphics/Characters/+文件名。
作者: enghao_lim    时间: 2021-9-17 16:13
本帖最后由 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而已,这样存档的时候就不会有克隆体。
作者: miantouchi    时间: 2021-9-19 10:12
本帖最后由 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这四个角色


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







3.下面是验证结果图

上图是设置初期同伴 处p的结果,也就是指向同一地址




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


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


最后经过,   # 刷新同伴成员 $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画的思维导图。如果不准确希望指点下,好改正。







作者: miantouchi    时间: 2021-9-19 11:50
下面是我画的内存分析图,如有错误欢迎指正。


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



这张是调用$game_party.refresh同步后示意图




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