У мяча есть позиция (bx, by) и скорость
(dx, dy) — на сколько он сдвигается за кадр по горизонтали и
вертикали. Каждый кадр прибавляем скорость к позиции:
bx += dx by += dy
А отскок — это смена знака у нужной скорости. Ударился о левую или
правую стену — разворачиваем dx. О потолок или пол —
разворачиваем dy:
# Мяч: позиция (bx, by) и скорость (dx, dy) BALL_R = 8 bx, by = WIDTH / 2, HEIGHT / 2 dx, dy = 4.0, 4.0 while True: # ... события и ракетка ... # Мяч летит bx += dx by += dy # Отскок: у краёв меняем знак скорости if bx < BALL_R or bx > WIDTH - BALL_R: dx = -dx if by < BALL_R or by > HEIGHT - BALL_R: dy = -dy # Рисуем мяч кружком pygame.draw.circle(screen, BALL_COLOR, (int(bx), int(by)), BALL_R)
BALL_R в проверке?bx — это центр мяча, а BALL_R — его радиус.
Мяч касается стены не центром, а краем — поэтому отскакиваем, когда центр
подошёл к стене на радиус: bx < BALL_R (левый край) и
bx > WIDTH - BALL_R (правый).
4.0)?Скоро мяч будет лететь под углом с дробной скоростью (например 3.7). Поэтому
сразу пишем 4.0, а координаты держим дробными, а при рисовании
превращаем в целые: int(bx).
dx, dy = 7.0, 7.0.dx, dy = 3.0, 6.0.BALL_R = 14.