我正在与pymunk进行pong克隆,以了解lib的工作原理。我使球正确地从墙壁上弹起,但是桨仍然拒绝停留在由线段定义的矩形内,在屏幕的每一侧。

def handle_input(self):
    keys = pygame.key.get_pressed()
    if keys[K_UP]: return Vec2d(0, 200)
    elif keys[K_DOWN]: return Vec2d(0, -200)
    else: return Vec2d(0, 0)


此功能检测是否按下了K_UPK_DOWN键。如果是这样,它将返回具有所需速度的新矢量,然后将其分配给paddle.body.velocity。问题是,当拨片到达屏幕的顶部或底部时,而不是停止在这些坐标上,它会进一步向上(或向下)一点,直到松开相应的按键,然后在相反的位置缓慢返回方向。该部分似乎为桨提供了某种阻力,但仅设法将其阻止在屏幕中间。



为什么会这样呢?如何限制桨的运动,使其仅在周围线段所确定的范围内运动?



来源:game.py | paddle.py

最佳答案

问题是您直接在每帧身体上设置速度。这将为碰撞解决器带来问题,并使桨叶穿过墙壁移动。您可以更改它,以便改用脉冲,或者以其他方式限制它的移动。

我在pymunk的examples文件夹中有一个类似的示例breakout.py,在这里我使用了GrooveJoint来限制其移动:

player_body = pymunk.Body(500, pymunk.inf)
player_shape = pymunk.Circle(player_body, 35)
player_shape.color = THECOLORS["red"]
player_shape.elasticity = 1.0
player_body.position = 300,100
# restrict movement of player to a straigt line
move_joint = pymunk.GrooveJoint(space.static_body, player_body, (100,100), (500,100), (0,0))
space.add(player_body, player_shape, move_joint)


完整代码在这里:
https://github.com/viblo/pymunk/blob/master/examples/breakout.py

请注意,每帧设置速度可能会有其他副作用,但是就您的情况而言,我认为它应该可以正常工作,就像突破示例一样。

关于python - pymunk-如何限制运动?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27058546/

10-12 19:37