Project1

标题: 游戏读档会SKILLS会被重置问题 [打印本页]

作者: yang1zhi    时间: 2017-5-1 11:24
标题: 游戏读档会SKILLS会被重置问题
本帖最后由 RyanBern 于 2017-5-1 16:40 编辑

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


RUBY 代码复制
  1. def refresh
  2.     # 游戏数据载入后角色对像直接从 $game_actors
  3.     # 分离。
  4.     # 回避由于载入造成的角色再设置的问题。
  5.     new_actors = []
  6.     for i in [email]0...@actors.size[/email]
  7.       if $data_actors[@actors[i].id] != nil
  8.         new_actors.push($game_actors[@actors[i].id])
  9.         p new_actors[i].skills
  10.       end
  11.     end
  12.     @actors = new_actors
  13.   end

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

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

更细致的讨论请见下面帖子的主楼,章节 0.3
https://rpg.blue/forum.php?mod=viewthread&tid=335455
作者: yang1zhi    时间: 2017-5-1 22:47
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,每次可以获得不同的相同角色数据。
作者: RyanBern    时间: 2017-5-1 23:22
本帖最后由 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 都不会真正去拷贝它,而是只去拷贝一个引用。
RUBY 代码复制
  1. class A
  2.   attr_accessor :id
  3.   attr_accessor :skills
  4.   def initialize
  5.     @id = 0
  6.     @skills = [0]
  7.   end
  8. end
  9.  
  10. a1 = A.new
  11. a2 = a1.dup
  12. a2.id = 1
  13. a2.skills[0] = 1
  14. p a2.id # => 1
  15. p a1.id # => 0,无问题,即时值不受影响
  16. p a2.skills[0] # => 1
  17. p a1.skills[0] # => 1,注意,这里只是拷贝引用,因此数组 @skills 并未真正复制


另外请注意提问题的方式,如果你使用了非默认的脚本/系统请务必指出来,以免对回答者造成困扰。
作者: RyanBern    时间: 2017-5-2 22:09
yang1zhi 发表于 2017-5-1 22:47
改动太多了,不好贴。XAS都改得面目全非了。
添加队伍不是用的add_actor = $game_actors[actor_id].dup吗 ...

RUBY 代码复制
  1. a = []
  2. actor = $game_actors[1].dup
  3. a.push actor
  4. actor = $game_actors[1].dup
  5. a.push actor
  6. a[0].learn_skill(1)
  7. p a[0].skills, a[1].skills

这是简单的测试脚本,在新游戏下仍然输出 [1, 57]。

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




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