В этой функции у меня есть обнаружение столкновений между мячом и лопаткой и счет (и другие вещи, которые не имеют отношения к этому вопросу). Когда мяч ударяется о лопасть, он отскакивает в противоположном направлении. Это отлично работает для левой стороны лопасти, но если мяч попадает сверху или снизу, он как бы скользит, и счет подскакивает.

def Objects (paddle,ball,hits,font,black):  
    if ball.BallRect.colliderect(paddle.PaddleRect):
        ball.vx *= -1
        score_text = font.render(f"Score: " + str(hits + 1),True, black)
        temp += 1
        
    else:
        score_text = font.render(f"Score: " + str(hits),True, black)
        window.blit(score_text,(20,20))
    
    return temp

Ответы (1)

Смотрите Иногда мяч не отскакивает от лопатки в игре в понг.

Когда мяч попадает в левую лопасть, мяч отскакивает вправо, и следующее направление x должно быть положительным. Когда мяч попадает в правую лопасть, мяч отскакивает влево, и следующее направление x должно быть отрицательным.
Используйте abs(x) для вычисления абсолютного значения числа. Новое направление мяча будет либо abs(ball.vx), либо -abs(ball.vx).

Вы должны различать leftPaddle и rightPaddle

if ball.BallRect.colliderect( leftPaddle.PaddleRect ):
    ball.vx = abs(ball.vx)

    # [...]

elif ball.BallRect.colliderect( rightPaddle.PaddleRect ):
    ball.vx = -abs(ball.vx)

    # [...]

Или вам нужно знать, какой паддл был поражен. Передайте либо "left", либо "right" в аргумент side:

def Objects(paddle, side, ball, hits, font, black):
    if ball.BallRect.colliderect(paddle.PaddleRect):
      
        if side == "left":
            ball.vx = abs(ball.vx)
        else:
            ball.vx = -abs(ball.vx)
    
      
        score_text = font.render(f "Score: " + str(hits + 1),True, black)
        temp += 1
        
    else:
        score_text = font.render(f "Score: " + str(hits),True, black)
        window.blit(score_text,(20,20))
    
    return temp

Если у вас есть только 1 весло, его достаточно, чтобы задать правильное направление. Если у вас есть только правильное весло:

def Objects(paddle, ball, hits, font, black):
    if ball.BallRect.colliderect(paddle.PaddleRect):

        ball.vx = -abs(ball.vx)

        score_text = font.render(f "Score: " + str(hits + 1),True, black)
        temp += 1

    else:
        score_text = font.render(f "Score: " + str(hits),True, black)
        window.blit(score_text,(20,20))
    
    return temp

2022 WebDevInsider