在主游戏循环中,按下移动键可更改玩家状态:
for event in pygame.event.get():
elif event.type == KEYDOWN:
if event.key == K_w:
player.state = "moving_up"
elif event.type == KEYUP:
if event.key == K_w:
player.state = "stopping_up"
当调用播放器更新方法时,它会根据状态移动:
def update(self):
if self.state == "idle":
self.displacement = self.displacement
else:
if self.state == "moving_up":
self.displacement[1] = self.displacement[1] - self.speed
if self.state == "stopping_up":
s = self.rect.top % 32
self.displacement[1] = self.displacement[1] - s
self.state = "idle"
new_position = self.rect.move(self.displacement)
self.rect = new_position
当我移动播放器时,每次按下键后速度似乎都会加快。例如我第一次移动速度很好,但下次它比以前更快,它只是滚雪球...
这是向右移动时的(速度),(位移)打印:
idle
0.02 [0.7200000000000003, 0]
0.02 [0.7400000000000003, 0]
0.02 [0.7600000000000003, 0]
...
0.02 [1.2400000000000007, 0]
0.02 [1.2600000000000007, 0]
0.02 [19.26, 0]
idle
你可以看到,在最后一次移动中,位移会大大增加。
知道为什么会这样吗?
更新,这是另一个用s:
打印出来的0.02 [1.1600000000000006, 0]
0.02 [1.1800000000000006, 0]
0.02 [1.2000000000000006, 0]
0.02 [1.2200000000000006, 0]
0.02 [1.2400000000000007, 0]
0.02 [1.2600000000000007, 0]
s: remainder to next tile 18
0.02 [19.2600000000000007, 0]
看起来s导致了位移的跳跃。
这是故意的,因为它应该找到到下一个瓷砖的距离并让玩家移动到那里。 (瓦片是32x32),s是剩下的,直到下一个。
似乎我需要修改移动代码,因为它没有达到我的预期。
答案 0 :(得分:0)
显而易见的是,最终值是使用s
而不是self.speed
。
作为旁注:
通常,在进行物理模拟时,最好使用物理单位。我的意思是,考虑时间,以秒为单位,而不是循环传递等,并从此工作。如果您想使用速度增加距离,请执行dist += dt*speed
,而不是dist += speed
。通常这涉及和额外的乘法,但它是值得的。否则,你有效地使用时间单位,以便dt=1.
,这是可能的,但比起初看起来更棘手。
例如,您在这里添加self.displacement[1] - self.speed
,然后在下一行中self.displacement[1] = self.displacement[1] - s
,其中s
似乎是距离。虽然在数量上这两件事看起来很相似,但在物理上他们却非常不同。这里有一个错误并不奇怪,因为整个事情很难理解。