gpt4 book ai didi

python - pymunk - 如何限制移动?

转载 作者:太空宇宙 更新时间:2023-11-04 03:39:46 26 4
gpt4 key购买 nike

我正在使用 pymunk 制作一个 pong 克隆,以了解该库的工作原理。我让球正确地从墙上弹起,但 Racket 仍然拒绝停留在由段定义的矩形内,在屏幕的每一侧都有一个。

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。问题是,当桨到达屏幕的顶部或底部时,它不会在这些坐标上停止,而是会向上(或向下)一点点,直到释放相应的键,此时它会慢慢返回相反的位置方向。该部分似乎对拨片提供了某种阻力,但只能在屏幕中途将其停止。

out

为什么会这样? 如何限制 Racket 的移动,使其仅在周围部分建立的范围内移动?


来源:game.py | paddle.py

最佳答案

问题是你直接在每一帧的 body 上设置速度。这会给碰撞求解器带来问题,并允许桨穿过墙壁。要么改变它以施加脉冲,要么以另一种方式限制它的运动。

我在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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com