Project1
标题: 游戏读档会SKILLS会被重置问题 [打印本页]
作者: yang1zhi 时间: 2017-5-1 11:24
标题: 游戏读档会SKILLS会被重置问题
本帖最后由 RyanBern 于 2017-5-1 16:40 编辑
问题是出在这个。不执行这条就还是旧的SKILLS。执行了就被重置了。
可是他说# 回避由于载入造成的角色再设置的问题。
不执行是不是不好
$game_party.refresh
def refresh
# 游戏数据载入后角色对像直接从 $game_actors
# 分离。
# 回避由于载入造成的角色再设置的问题。
new_actors = []
for i in [email]0...@actors.size[/email]
if $data_actors[@actors[i].id] != nil
new_actors.push($game_actors[@actors[i].id])
p new_actors[i].skills
end
end
@actors = new_actors
end
def refresh
# 游戏数据载入后角色对像直接从 $game_actors
# 分离。
# 回避由于载入造成的角色再设置的问题。
new_actors = []
for i in [email]0...@actors.size[/email]
if $data_actors[@actors[i].id] != nil
new_actors.push($game_actors[@actors[i].id])
p new_actors[i].skills
end
end
@actors = new_actors
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
改动太多了,不好贴。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 编辑
如果将 $game_actors 作为角色的模板库无限生成角色的话,不应该同步。请确认在你的游戏中 $game_actors 只有这一个功能。如果不是,请明确 $game_actors 在你的系统中有哪些功能。
另外个人觉得使用模板生成角色数据的姿势有问题。首先,使用 dup (或者 clone)只是对对象进行浅层次的拷贝,从效果来看,它只会拷贝“第一层的数据”(例如数字,true 或者 false),不会拷贝所谓的“引用”。@skills 在 Game_Actor 类里应该是 Array(或者 Hash,记不清了),无论哪种情况,dup 都不会真正去拷贝它,而是只去拷贝一个引用。
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 并未真正复制
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 并未真正复制
另外请注意提问题的方式,如果你使用了非默认的脚本/系统请务必指出来,以免对回答者造成困扰。
作者: RyanBern 时间: 2017-5-2 22:09
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
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
这是简单的测试脚本,在新游戏下仍然输出 [1, 57]。
可能是你的第三方脚本还进行了别的操作。
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |