Lua 中 Player State 中的变量没有按预期更新

在以下代码中,self.player.x 的值在初始化时被分配给 self.x,并在状态进入时稍微向左或向右调整。然后,PlayerPilotState 每帧操作 self.player.x,我的期望是 self.x 也会随之更新。像被分配给player的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
点赞
用户13619683
用户13619683

这是非脚本语言用户常有的误解。

注意,self.x和self.player.x是数字,所以当使用赋值语句时:

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

你正在复制该数字。 另一方面,当处理表或userdata对象时,赋值通过引用操作:

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

一般而言,你无法实现像你描述的那样同步单个数字。这也是不高效的,因为你需要在内存中进行冗余的“复制”该数值。

这是一个封装和数据存储位置的问题。如果你不确定如何重新设计你的代码,请记住“一起变化的值应该归于一类”。祝你好运!

2020-08-24 06:26:52