Lua 中的玩家状态变量未按预期更新

Variable in Player State in Lua not updating as expected

在下面的代码中,self.player.x 的值赋给了 self.x,它在初始化时赋值,并在进入状态时向左或向右稍微调整了一下。 PlayerPilotState 然后每帧操纵 self.player.x,我的期望是 self.x 会随之更新。当玩家被实例化时,诸如瓦片地图之类的项目将作为 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

对于使用 non-scripted 种语言的人来说,这是一种常见的误解。 请注意 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

一般来说,您无法真正按照您描述的方式同步一个号码。它也不会有效,因为您将不得不在内存中制作该值的冗余“副本”。

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