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

问题描述

在下面的代码中,将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

解决方法

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

+------------------+------------------+-------------------------+-------------------------+
| (No column name) | (No column name) | (No column name)        | (No column name)        |
+------------------+------------------+-------------------------+-------------------------+
| 0.04445          | 0.044445         | 4.4449999999999996e-002 | 4.4444999999999998e-002 |
+------------------+------------------+-------------------------+-------------------------+

您正在复制该号码。 另一方面,在处理表或用户数据对象时,则可以通过引用进行分配:

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

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

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