Ваша логика обнаружения столкновений не даст физически точных результатов. Например, независимо от того, где мяч сталкивается с веслом, он всегда начинает двигаться вниз со скоростью 5 пикселей / кадр. Это означает, что мяч будет проходить через весло при столкновении ударов сверху, но он будет «подпрыгивать» при попадании снизу. Это то, что заставляет мяч вести себя так, как он это делает. В этой строке задается скорость, если весло и мяч сталкиваются:
if pXY.colliderect(bXY): # KOLIDACJA OBIEKTOW
by=5
Немного лучше было бы изменить направление шара, если он сталкивается с веслом. Но это все равно заставляет шар двигаться только в обратном направлении по оси Y, независимо от того, где на весле мяч сталкивается (сверху, снизу, слева, справа). Код выше может быть изменен на этот код, чтобы получить этот эффект:
if pXY.colliderect(bXY): # KOLIDACJA OBIEKTOW
by*=-1
Этот последний фрагмент кода немного очищен и переведен на английский. Он использует второй блок кода сверху, чтобы отскочить мяч от весла:
import sys
import pygame
pygame.init()
window = pygame.display.set_mode((500, 500))
pygame.display.set_caption('new caption')
paddle = pygame.Surface((80, 20))
paddle.fill((128, 15, 220))
paddle_rect = paddle.get_rect()
paddle_rect.x = 225
paddle_rect.y = 460
ball = pygame.Surface((25, 25))
ball.fill((255, 0, 0))
ball_rect = ball.get_rect()
ball_rect.x = 120
ball_rect.y = 200
ball_velocity_x = 5
ball_velocity_y = 5
paddle_velocity_x = 3
clock = pygame.time.Clock()
while True:
# event processing code
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
paddle_velocity_x = -7
elif event.key == pygame.K_RIGHT:
paddle_velocity_x = 7
# update code
# update the position of the paddle and bounce it off the edges of the window
paddle_rect.x += paddle_velocity_x
if paddle_rect.x > 420 or paddle_rect.x < 0:
paddle_velocity_x *= -1
# update the position of the ball and bounce it off th eedges of the window
ball_rect.x += ball_velocity_x
ball_rect.y += ball_velocity_y
if ball_rect.x > 475 or ball_rect.x < 0:
ball_velocity_x *= -1
if ball_rect.y > 475 or ball_rect.y < 0:
ball_velocity_y *= -1
if paddle_rect.colliderect(ball_rect):
ball_velocity_y *= -1
# drawing code
window.fill((128, 128, 128))
window.blit(paddle, paddle_rect)
window.blit(ball, ball_rect)
pygame.display.update()
clock.tick(30)