在pygame鳕鱼中很难找到包含奇怪物理行为的bug

2024-06-21 20:01:11 发布

您现在位置:Python中文网/ 问答频道 /正文

首先我得说我很累我已经连续起床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

[/代码]


Tags: the代码权利iftop物理leftdirection
2条回答

如果你移除direction,你可以像这样反弹:

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

如果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 ...

相关问题 更多 >