在下面的代码中,将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
答案 0 :(得分:2)
对于来自非脚本语言的人来说,这是一个普遍的误解。 请注意,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
通常来说,您无法真正按照描述的方式同步一个数字。这也不会有效率,因为您将不得不在内存中对该值进行冗余的“复制”。
这是封装问题以及数据存储方式/存储位置。如果您不确定如何重新设计代码,请记住“值一起改变,就属于一起”。祝你好运!