0

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

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

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

4

1 回答 1

0

这里显而易见的是,最终值是 usings而不是self.speed.

附带说明:
通常,在进行物理模拟时,最好使用物理单位。我的意思是,以秒为单位考虑时间,而不是循环传递等,并以此为单位工作。如果您想使用速度增加距离,请执行此操作dist += dt*speed,而不是dist += speed。通常这涉及到额外的乘法,但这是非常值得的。否则,您将有效地使用时间单位dt=1.,这是可能的,但比起初看起来更棘手。

例如,在这里,您正在添加self.displacement[1] - self.speed,并且在下一行中您执行self.displacement[1] = self.displacement[1] - s, wheres似乎是一个距离。尽管从数量上看,这两件事看起来很相似,但在物理上它们却大不相同。这里有一个错误并不奇怪,因为整个事情很难理解。

于 2013-08-05T18:14:13.290 回答