【发布时间】:2013-08-06 02:14:13
【问题描述】:
在主游戏循环中,按下移动键会改变玩家状态:
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 是直到下一个的余数。
似乎我需要修改运动代码,因为它没有达到我的预期。
【问题讨论】:
-
这里显而易见的是,最终值使用的是
s,而不是self.speed。也打印出s(即,它使用"stopping_up"条件)。如果不是这样,我们没有足够的信息来解决这个问题。 -
同意,需要查看
s的值。另外,为什么在计算s时使用%(模运算符)?值跳跃是有道理的,因为s将在self.rect.top传递 32 的倍数后跳跃 -
@tom10 我已经更新了帖子,看起来 s 是罪魁祸首。
-
好的,我想我会写这个作为答案,只是为了解决这个问题。
标签: python pygame game-physics