Python 在pygame代码中很难找到涉及奇怪物理行为的bug

Python 在pygame代码中很难找到涉及奇怪物理行为的bug,python,pygame,Python,Pygame,首先我要说我很累,我已经连续22个小时起床了。不管怎样,我在一个乒乓球游戏中遇到了一个古怪的物理问题。你知道古老的经典。我已经看了很长时间的代码,尝试不同的变化,注释出某些部分等,我找不到该死的错误 谁能帮我一下吗 球的物理性质是个问题。它从屏幕的顶部和底部反弹很好,但向左移动很好 但我不能让它在和从左边过来的桨相撞后回到右边。它只是迫使反弹一点,迫使它的方式回来,并在桨 然而,当我将球编程为在击中顶部或底部一侧后立即反弹时,我可以正确发送球,因此我不认为将球向右移动的实际代码有任何错误 但是向

首先我要说我很累,我已经连续22个小时起床了。不管怎样,我在一个乒乓球游戏中遇到了一个古怪的物理问题。你知道古老的经典。我已经看了很长时间的代码,尝试不同的变化,注释出某些部分等,我找不到该死的错误

谁能帮我一下吗

球的物理性质是个问题。它从屏幕的顶部和底部反弹很好,但向左移动很好

但我不能让它在和从左边过来的桨相撞后回到右边。它只是迫使反弹一点,迫使它的方式回来,并在桨

然而,当我将球编程为在击中顶部或底部一侧后立即反弹时,我可以正确发送球,因此我不认为将球向右移动的实际代码有任何错误

但是向右的移动与游戏所需要的物理相反,所以它是无用的,因为当它碰到左边的划桨时,它应该反弹并向右移动,它不应该“强迫”自己越过划桨向左移动

如果你能看到的话,这其实有点可笑:)

有谁能理解这一点并给我一个解释吗

[守则]

    # move the ball around

    # if the ball disappears off the either side of the screen, send it back heading  left
    if ballRect.left > WINDOWWIDTH or ballRect.right < 0:
        direction = getRandomDirection()
        ballRect.center = (WINDOWWIDTH - ballRect.width, random.randint(100, 200))

    if direction == 'downleft':
        ballRect.left -= BALLSPEEDX
        ballRect.top += BALLSPEEDY
    if direction == 'upleft':
        ballRect.left -= BALLSPEEDX
        ballRect.top -= BALLSPEEDY
    if direction == 'downright':
        ballRect.left += BALLSPEEDX
        ballRect.top += BALLSPEEDY
    if direction == 'upright':
        ballRect.left += BALLSPEEDX
        ballRect.top -= BALLSPEEDY

    if ballRect.top < 0:
        if direction == 'upleft':
            direction = 'downleft'
        if direction == 'upright':
            direction = 'downright'
    if ballRect.bottom > WINDOWHEIGHT:
        if direction == 'downleft':
            direction = 'upleft'
        if direction == 'downright':
            direction = 'upright'

    if paddleRect.colliderect(ballRect):
        if direction == 'upleft':
            direction = 'upright'
            ballRect.left += BALLSPEEDX
            ballRect.top -= BALLSPEEDY
        if direction == 'upright':
            direction = 'upleft'
            ballRect.left += BALLSPEEDX
            ballRect.top -= BALLSPEEDY
        if direction == 'downleft':
            direction = 'upleft'
            ballRect.left += BALLSPEEDX
            ballRect.top += BALLSPEEDY
        if direction == 'downright':
            direction = 'upright'
            ballRect.left -= BALLSPEEDX
            ballRect.top += BALLSPEEDY
#移动球
#如果球从屏幕两侧消失,则将其向左转
如果ballRect.left>WINDOWWIDTH或ballRect.right<0:
方向=getRandomDirection()
ballRect.center=(WINDOWWIDTH-ballRect.width,random.randint(100200))
如果方向=='左下':
ballRect.left-=BALLSPEEDX
ballRect.top+=ballRect
如果方向=='upleft':
ballRect.left-=BALLSPEEDX
ballRect.top-=ballRect.top
如果方向==‘向下’:
ballRect.left+=BALLSPEEDX
ballRect.top+=ballRect
如果方向==‘垂直’:
ballRect.left+=BALLSPEEDX
ballRect.top-=ballRect.top
如果ballRect.top<0:
如果方向=='upleft':
方向='左下'
如果方向==‘垂直’:
方向=‘完全正确’
如果ballRect.bottom>窗口高度:
如果方向=='左下':
方向='upleft'
如果方向==‘向下’:
方向=‘直立’
如果PableRect.colliderect(ballRect):
如果方向=='upleft':
方向=‘直立’
ballRect.left+=BALLSPEEDX
ballRect.top-=ballRect.top
如果方向==‘垂直’:
方向='upleft'
ballRect.left+=BALLSPEEDX
ballRect.top-=ballRect.top
如果方向=='左下':
方向='upleft'
ballRect.left+=BALLSPEEDX
ballRect.top+=ballRect
如果方向==‘向下’:
方向=‘直立’
ballRect.left-=BALLSPEEDX
ballRect.top+=ballRect

[/code]

如果
方向=='upleft'
,这两个块都将执行

if paddleRect.colliderect(ballRect):
    if direction == 'upleft':
        direction = 'upright'
        ballRect.left += BALLSPEEDX * 4
        ballRect.top -= BALLSPEEDY * 4
    if direction == 'upright':
        direction = 'upleft'
        ballRect.left += BALLSPEEDX * 4
        ballRect.top -= BALLSPEEDY * 4
可能应该更像这样

if paddleRect.colliderect(ballRect):
    if direction == 'upleft':
        direction = 'upright'
        ballRect.left += BALLSPEEDX * 4
        ballRect.top -= BALLSPEEDY * 4
    elif direction == 'upright':
        direction = 'upleft'
        ballRect.left += BALLSPEEDX * 4
        ballRect.top -= BALLSPEEDY * 4
    elif ...

如果
directions==“upleft”
,这两个块都将执行

if paddleRect.colliderect(ballRect):
    if direction == 'upleft':
        direction = 'upright'
        ballRect.left += BALLSPEEDX * 4
        ballRect.top -= BALLSPEEDY * 4
    if direction == 'upright':
        direction = 'upleft'
        ballRect.left += BALLSPEEDX * 4
        ballRect.top -= BALLSPEEDY * 4
可能应该更像这样

if paddleRect.colliderect(ballRect):
    if direction == 'upleft':
        direction = 'upright'
        ballRect.left += BALLSPEEDX * 4
        ballRect.top -= BALLSPEEDY * 4
    elif direction == 'upright':
        direction = 'upleft'
        ballRect.left += BALLSPEEDX * 4
        ballRect.top -= BALLSPEEDY * 4
    elif ...

如果删除
方向
,则可以如下方式反弹:

if collide with left/right wall:
    xvel *= -1
if collide with top/bot wall:
    yvel *= -1

# then always
ball.rect.left += xvel
ball.rect.top += yvel

如果删除
方向
,则可以如下方式反弹:

if collide with left/right wall:
    xvel *= -1
if collide with top/bot wall:
    yvel *= -1

# then always
ball.rect.left += xvel
ball.rect.top += yvel

你最好在你的文本中添加更多的评论,并检查你已经有过的评论。。。在我看来,如果球刚离开屏幕,它会重新出现在中间,但不会“向左”,而是向随机方向移动。我不可能在没有注释解释的情况下解释您的代码,请记住,我们不能使用它并更改内容!一些
elif
s不是更有意义吗???@Jblaco我知道评论太少了。我将添加注释,但首先我必须去看牙医。:-)然后我必须去工作,所以我会在运输途中尝试添加它们。我会考虑的。你最好在你的文本中添加更多的评论,并检查你已经有的评论。。。在我看来,如果球刚离开屏幕,它会重新出现在中间,但不会“向左”,而是向随机方向移动。我不可能在没有注释解释的情况下解释您的代码,请记住,我们不能使用它并更改内容!一些
elif
s不是更有意义吗???@Jblaco我知道评论太少了。我将添加注释,但首先我必须去看牙医。:-)然后我必须去工作,所以我会在运输途中尝试添加它们。我会考虑的。是的,当然。。。用“elif”可以避免这种情况。好样的@非常感谢你!就这样!!是的,当然。。。用“elif”可以避免这种情况。好样的@非常感谢你!就这样!!