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您的数据已存储。如果您不确定如何重新设计您的代码,请记住“一起改变的值,属于一起”。祝你好运!
在下面的代码中,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您的数据已存储。如果您不确定如何重新设计您的代码,请记住“一起改变的值,属于一起”。祝你好运!