【问题标题】:Variable in Player State in Lua not updating as expectedLua 中播放器状态中的变量未按预期更新
【发布时间】:2020-12-12 17:44:06
【问题描述】:

在下面的代码中,self.player.x 的值在初始化时赋值给 self.x,并在进入状态时稍微向左或向右调整。 PlayerPilotState 然后每帧操作 self.player.x,我的期望是 self.x 会随之更新。诸如 tilemap 之类的项目在播放器被实例化时作为 def.tilemap 分配给播放器,它们会随着地图的变化而更新。如何确保 self.x 等变量也会自行更新?我知道我可以在每帧更新下更新该变量,但这似乎不太好,因为我对编码还很陌生,所以我不明白为什么 player.tilemap 会更新而这个变量不会。谢谢!

function PlayerPilotState:init(pilot, passenger)
    self.player = pilot
    self.passenger = passenger
    self.animation = Animation {
        frames = {2, 3, 2, 8},
        interval = 0.1
    }
    self.player.currentAnimation = self.animation
    
    -- x value at middle of players to make collisions more readable
    -- and scalable (for left/right pilot/passenger cases)
    self.x = self.player.x
end

function PlayerPilotState:enter(params)
    -- determine which side passenger is riding on 
    self.ridingSide = params.ridingSide
    if self.ridingSide == 'left' then
        self.x = self.player.x - 1/2 * self.player.width
    else
        self.x = self.player.x + 1/2 * self.player.width
    end
end

【问题讨论】:

    标签: lua game-development love2d


    【解决方案1】:

    对于来自非脚本语言的人来说,这是一个常见的误解。 注意 self.x 和 self.player.x 是数字,所以当你使用赋值时:

    assert(type(self.player.x) == "number")
    self.x = self.player.x -- copy
    

    您正在复制该号码。 另一方面,在处理表或用户数据对象时,分配通过引用来工作:

    assert(type(self.player) == "table")
    self.ref = self.player -- reference
    

    一般来说,您无法真正按照您所描述的方式同步一个数字。这也不会很有效,因为您必须在内存中对该值进行冗余“复制”。

    这是一个封装问题以及数据存储方式/存储位置的问题。如果您不确定如何重新设计代码,请记住“一起改变的值,属于一起”。祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多