Project1

标题: Sprite_Battler的改写问题 [打印本页]

作者: kk9911    时间: 2021-3-31 08:52
标题: Sprite_Battler的改写问题
Sprite_Battler#update中
RUBY 代码复制
  1. if @battler.battler_name != @battler_name or#####1
  2.    @battler.battler_hue != @battler_hue
  3.     # 获取、设置位图
  4.     @battler_name = @battler.battler_name
  5.     @battler_hue = @battler.battler_hue
  6.     self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
  7.     @width = bitmap.width
  8.     @height = bitmap.height
  9.     self.ox = @width / 2
  10.     self.oy = @height
  11.     # 如果是战斗不能或者是隐藏状态就把透明度设置成 0
  12.     if @battler.dead? or @battler.hidden
  13.       self.opacity = 0
  14.     end
  15. end
  16. if @battler.hp != @battler_hp#####2
  17.    @battler_hp = @battler.hp
  18.    p 1
  19. end
  20. if @battler.states != @battler_states#####3
  21.    @battler_states = @battler.states
  22.    p 2
  23. end
  24. if Input.trigger?(Input::A)
  25.   @battler.states.push(3)#####4
  26.   p @battler_states#=>[3],'p 2'没有弹窗
  27. end

我仿照#####1处结构写了#####2和#####3,#####2处每次@battler.hp更改都可以正常调用'p 1',#####3处@battler.states更改只有第一次能调用'p 2',即@battler_states==nil和@battler.states==[]的时候,第一次调用后,@battler_states==[]和@battler.states==[]。此后再次更改@battler.states,比如#####4处,@battler.states.push(3),无法调用'p 2',但是'p @battler_states'结果是[3],像是执行了'@battler_states = @battler.states'。想不明白,也不知道搜什么,此问,谢谢
作者: 灯笼菜刀王    时间: 2021-3-31 10:13
因为, @battler.states是"对象"而不是"返回值"

if @battler.states != @battler_states#####3
   @battler_states = @battler.states
   p 2
end

你这句就是把 @battler_states "绑定" @battler.states 这个对象, 那自然, 除了第一次 @battler_states是nil,因此 != @battler.states 判定有效外, 其他时候, ==都是成立的, 因为就是"同一个人"嘛

举个栗子, 今天改名叫张三,明天改名叫李四, 你不一样还是你,  而你今天带个帽子,明天披个披风, 那对 你 == 你 这个判定有影响么?

那怎么才能让判定生效?

if @battler.states != @battler_states#####3
   @battler_states = @battler.states.dup
   p 2
end






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