查看: 2078|回复: 26

[已经解决] 游戏读档会SKILLS会被重置问题

[复制链接]
梦石
0
星屑
12161
在线时间
4435 小时
注册时间
2014-4-11
回帖
5616

开拓者

发表于 2017-5-1 11:24:54 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 RyanBern 于 2017-5-1 16:40 编辑

问题是出在这个。不执行这条就还是旧的SKILLS。执行了就被重置了。
可是他说# 回避由于载入造成的角色再设置的问题。
不执行是不是不好
$game_party.refresh


[pre lang="Ruby"]
def refresh
    # 游戏数据载入后角色对像直接从 $game_actors
    # 分离。
    # 回避由于载入造成的角色再设置的问题。
    new_actors = []
    for i in 0...@actors.size
      if $data_actors[@actors.id] != nil
        new_actors.push($game_actors[@actors.id])
        p new_actors.skills
      end
    end
    @actors = new_actors
  end
[/pre]

点评

我现在在def refresh下一行添加return 暂时没发现问题  发表于 2017-5-1 21:48
如果只是技能次序问题的话,和这个没有关系。  发表于 2017-5-1 16:49
不是全部注释,那样就没队员了。把加入和离开队员,以及读档注释掉应该没问题。  发表于 2017-5-1 16:48
这个具体的没试过,一般说来没问题啊?! 加入和离开队员都要进行此项操作,可以把这个全部注释看有没不良反应。  发表于 2017-5-1 16:47
没有,我不知道为什么这个复制后的是这样,脚本内和你写的是一样的  发表于 2017-5-1 15:57
梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2017-5-1 16:51:11 | 显示全部楼层
$game_party.refresh 这句话是有必要的,它的作用如注释所说,它是为了同步
$game_actors 里的角色 与 $game_party.actors 里的角色,如果不加则会造成二者不一致,游戏在执行过程中,有时候修改前者的数据,有时候修改后者的数据。

更麻烦的是,如果一开始没有注意的话,这两个数据的差别就会越来越大,所以必须在每次读档的时候同步。因此主楼所说的重置问题可能是使用了极其久远的存档,并且在很久之前就去掉了这句话。

更细致的讨论请见下面帖子的主楼,章节 0.3
https://rpg.blue/forum.php?mod=viewthread&tid=335455

点评

默认脚本下,必须一致,否则会出错。如果你的工程有较大改动,请贴出改动的脚本  发表于 2017-5-1 22:25
话说$game_actors和$game_party.actors里的角色有必要一致吗。我是相同的一个角色也有多个不同的存在  发表于 2017-5-1 21:44
默认的技能规则是学会等级下的所有技能。我做了更改,只学会1级技能,其他随机。  发表于 2017-5-1 21:41
并不是很久前的存档。测试时存档的,存几次都是这样。是@data的问题,存档前就和队伍对不上了。读档后获取的是@data的内容。  发表于 2017-5-1 21:40
回复

使用道具 举报

梦石
0
星屑
12161
在线时间
4435 小时
注册时间
2014-4-11
回帖
5616

开拓者

 楼主| 发表于 2017-5-1 22:47:12 | 显示全部楼层
RyanBern 发表于 2017-5-1 16:51
$game_party.refresh 这句话是有必要的,它的作用如注释所说,它是为了同步
$game_actors 里的角色 与 $gam ...

改动太多了,不好贴。XAS都改得面目全非了。
添加队伍不是用的add_actor = $game_actors[actor_id].dup吗
@actors.push(add_actor)
后面DUP不是已经和$game_actors不一致了吗。
还可以对add_actor进行修正在PUSH进队伍。
我Game_Actor < Game_Battler
里面setup(actor_id)里的数值很多是不固定的。
还有后期也会有数值不固定的。
添加队伍是用的DUP,每次可以获得不同的相同角色数据。
回复

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2017-5-1 23:22:24 | 显示全部楼层
本帖最后由 RyanBern 于 2017-5-1 23:25 编辑
yang1zhi 发表于 2017-5-1 22:47
改动太多了,不好贴。XAS都改得面目全非了。
添加队伍不是用的add_actor = $game_actors[actor_id].dup吗 ...


如果将 $game_actors 作为角色的模板库无限生成角色的话,不应该同步。请确认在你的游戏中 $game_actors 只有这一个功能。如果不是,请明确 $game_actors 在你的系统中有哪些功能。

另外个人觉得使用模板生成角色数据的姿势有问题。首先,使用 dup (或者 clone)只是对对象进行浅层次的拷贝,从效果来看,它只会拷贝“第一层的数据”(例如数字,true 或者 false),不会拷贝所谓的“引用”。@skills 在 Game_Actor 类里应该是 Array(或者 Hash,记不清了),无论哪种情况,dup 都不会真正去拷贝它,而是只去拷贝一个引用。
[pre lang="Ruby"]class A
  attr_accessor :id
  attr_accessor :skills
  def initialize
    @id = 0
    @skills = [0]
  end
end

a1 = A.new
a2 = a1.dup
a2.id = 1
a2.skills[0] = 1
p a2.id # => 1
p a1.id # => 0,无问题,即时值不受影响
p a2.skills[0] # => 1
p a1.skills[0] # => 1,注意,这里只是拷贝引用,因此数组 @skills 并未真正复制
[/pre]

另外请注意提问题的方式,如果你使用了非默认的脚本/系统请务必指出来,以免对回答者造成困扰。

点评

恩,就是开新游戏,添加两次add_actor = $game_actors[actor_id].dup,PUSH进队伍。  发表于 2017-5-2 22:03
不是的。如果用新档测试,然后连续dup两个蝙蝠呢?  发表于 2017-5-2 21:37
应该是PUSH的关系吧。PUSH添加的都会变成新的独立的。  发表于 2017-5-2 21:34
可以测试一下我的代码,体会其中的区别。思考一下为什么你得到的结果为什么会不同。  发表于 2017-5-2 21:05
我刚测试了我的。同一只蝙蝠,修改一只的SKILLS,另一只没有影响。  发表于 2017-5-2 20:06
回复

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2017-5-2 22:09:29 | 显示全部楼层
yang1zhi 发表于 2017-5-1 22:47
改动太多了,不好贴。XAS都改得面目全非了。
添加队伍不是用的add_actor = $game_actors[actor_id].dup吗 ...

[pre lang="Ruby"]a = []
actor = $game_actors[1].dup
a.push actor
actor = $game_actors[1].dup
a.push actor
a[0].learn_skill(1)
p a[0].skills, a[1].skills
[/pre]
这是简单的测试脚本,在新游戏下仍然输出 [1, 57]。

可能是你的第三方脚本还进行了别的操作。

点评

我知道了$game_actors[@parameters[0]].setup(@parameters[0])  发表于 2017-5-2 23:38
运行你这个脚本后,两个是相同的SKILL  发表于 2017-5-2 22:48
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部