Python 有时球不会';在乒乓球比赛中不要从球拍上弹下来

Python 有时球不会';在乒乓球比赛中不要从球拍上弹下来,python,pygame,Python,Pygame,我有一个简单的乒乓球游戏,大部分效果都很好。但有时会发生这样的情况:球不会从桨上弹起。球沿着桨叶摆动和滑动,桨叶似乎以磁力拉动球,如动画所示: 每当环绕球的矩形与桨叶矩形碰撞时,球的方向都会改变: if ball.collide rect(左): 移动_x*=-1 如果ball.colliderect(右桨): 移动_x*=-1 是什么导致了这种行为 该问题可通过以下完整、最少且可验证的示例重现。设置球的位置,以便在右拨杆未移动时立即发生错误行为: 导入pygame pygame.init(

我有一个简单的乒乓球游戏,大部分效果都很好。但有时会发生这样的情况:球不会从桨上弹起。球沿着桨叶摆动和滑动,桨叶似乎以磁力拉动球,如动画所示:

每当环绕球的矩形与桨叶矩形碰撞时,球的方向都会改变:

if ball.collide rect(左):
移动_x*=-1
如果ball.colliderect(右桨):
移动_x*=-1
是什么导致了这种行为

该问题可通过以下完整、最少且可验证的示例重现。设置球的位置,以便在右拨杆未移动时立即发生错误行为:

导入pygame
pygame.init()
宽度,高度=600400
window=pygame.display.set_模式((宽度、高度))
clock=pygame.time.clock()
半径,移动x,移动y=10,3,3
ball=pygame.Rect(宽度//2+125,20,半径*2,半径)
桨叶高度=80
桨左=pygame.Rect(20,(高度桨高)//2,10,桨高)
PapperRight=pygame.Rect(宽度-30,(高度-桨叶高度)//2,10,桨叶高度)
运行=真
运行时:
时钟滴答(60)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:run=False
keys=pygame.key.get_pressed()
如果键[pygame.K_w]和paileleft.top>0:paileleft.y-=5
如果键[pygame.K_s]和paileleft.bottom<高度:paileleft.y+=5
如果键[pygame.K_UP]和palleright.top>0:palleright.y-=5
如果键[pygame.K_DOWN]和palleright.bottom<高度:palleright.y+=5
ball.x+=移动
ball.y+=移动y
如果ball.left=宽度:move_x*=-1
如果ball.top=高度:移动y*=-1
如果ball.colliderect(左桨):移动\u x*=-1
如果ball.colliderect(右桨):移动\u x*=-1
窗口填充(0)
pygame.draw.rect(窗口,(255,255,255),左)
pygame.draw.rect(窗口,(255,255,255),右)
pygame.draw.circle(窗口,(255,255,255),ball.center,radius)
pygame.display.flip()

当球没有击中前面的球拍,而是击中顶部或底部时,就会发生这种行为。实际上,球拍和球之间的碰撞是被检测到的,方向也改变了。但是球深深地穿透了桨叶,以至于下一步球无法离开与桨叶的碰撞区域。这会导致在下一帧中再次检测到碰撞,并再次更改球的方向。现在,球的移动方向与第一次碰撞前相同。这个过程一直持续到球离开底部的桨叶。这会导致沿桨叶前侧发生之字形运动

有不同的解决方案。一个选项不是反转方向,而是在击打右拨杆时将方向设置为向左,并在击打左拨杆时将方向设置为向右:

if ball.collide rect(左):
移动x=abs(移动x)
如果ball.colliderect(右桨):
move_x=-abs(move_x)

另一个选项是调整球的位置。如果右球拍被击中,球的右侧必须放在球拍的左侧。如果左侧球拍被击中,则必须将球的左侧置于球拍的右侧:

if ball.collide rect(左):
移动_x*=-1
ball.left=左桨.右桨
如果ball.colliderect(右桨):
移动_x*=-1
ball.right=blacker right.left

您对问题的描述是,它与桨叶顶部相撞,而不是与桨叶前部相撞。在这种情况下,它真的应该离开顶部,继续向右移动,但向上偏转吗?@GlennMackintosh不,我不同意。通常,桨的形状很薄。在乒乓球比赛中,没有人希望球从顶部或底部反弹。我在很多问题上都看到了山姆的问题。正因为如此,我写了这篇文章。@GlennMackintosh我明白你的意思。但是这个问题和答案是为面对这个问题的新手准备的。这是对行为的解释,而不是一个完美的答案。请随意添加更复杂的答案。