如何在不应该​​的情况下阻止玩家加速

时间:2013-08-05 16:21:03

标签: python pygame game-physics

在主游戏循环中,按下移动键可更改玩家状态:

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是剩下的,直到下一个。

似乎我需要修改移动代码,因为它没有达到我的预期。

1 个答案:

答案 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似乎是距离。虽然在数量上这两件事看起来很相似,但在物理上他们却非常不同。这里有一个错误并不奇怪,因为整个事情很难理解。