Lua中处于播放器状态的变量未按预期更新

Lua中处于播放器状态的变量未按预期更新,lua,game-development,love2d,Lua,Game Development,Love2d,在下面的代码中,self.player.x的值被分配给self.x在init处被分配,并在输入状态时向左或向右调整一点。PlayerPilotState然后在每一帧操纵self.player.x,我的期望是self.x会随之更新。当播放器被实例化时,像tilemap这样的项目作为def.tilemap分配给播放器,它们会随着地图的变化而更新。如何确保self.x等变量也会更新自身?我知道我可以在“每帧更新”下更新该变量,但它似乎不太会说话,而且因为我对编码相当陌生,我不明白为什么player.t

在下面的代码中,self.player.x的值被分配给self.x在init处被分配,并在输入状态时向左或向右调整一点。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

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

assert(type(self.player.x) == "number")
self.x = self.player.x -- copy
你在复制那个号码。 另一方面,在处理表或userdata对象时,赋值通过引用起作用:

assert(type(self.player) == "table")
self.ref = self.player -- reference
一般来说,你不可能真的有一个数字同步的方式,你所描述的。它也不会有效率,因为您必须在内存中对该值进行冗余“复制”

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