# Нижней стены НЕТ — только левая, правая и верхняя if bx < BALL_R or bx > WIDTH - BALL_R: dx = -dx if by < BALL_R: dy = -dy ball_rect = pygame.Rect(bx - BALL_R, by - BALL_R, BALL_R * 2, BALL_R * 2) # Отскок от ракетки (только если мяч летит вниз) if ball_rect.colliderect(paddle) and dy > 0: dy = -dy # Куда по ракетке попал — туда и уйдёт вбок hit = (bx - (paddle_x + PADDLE_W / 2)) / (PADDLE_W / 2) dx = 5 * hit # Промахнулся — мяч в центр if by > HEIGHT: bx, by = WIDTH / 2, HEIGHT / 2 dx, dy = 4.0, 4.0
В прошлом уроке мяч отскакивал от пола. Теперь пол убираем — внизу стоит
ракетка, и отбивать должен игрок. Поэтому в проверке by осталась
только верхняя стена (by < BALL_R).
colliderect + «летит вниз»Делаем из мяча квадратик ball_rect и проверяем пересечение с
ракеткой. Условие and dy > 0 важно: отскакиваем только если мяч
падает (иначе он мог бы «прилипнуть» к ракетке и дёргаться).
Это делает игру управляемой! hit — насколько далеко от центра
ракетки попал мяч: 0 в центре, −1 у левого края, +1 у правого. Умножаем на 5
и получаем dx — у края мяч отлетит вбок, в центре — почти прямо
вверх.
5 на 8 — углы станут острее.