🎮 Все игры 🧱 Арканоид
1 2 3 4 5
Урок 3

Отскок от ракетки

Что ты увидишь Нижней стены больше нет — теперь мяч надо отбивать ракеткой. Промахнулся — мяч вернётся в центр. Файл: step3_paddle_ball.py
⬇️ Скачать код урока

📝 Что меняем

    # Нижней стены НЕТ — только левая, правая и верхняя
    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 — у края мяч отлетит вбок, в центре — почти прямо вверх.

попал слева → dx отрицательный → летит влево-вверх попал в центр → dx ≈ 0 → летит прямо вверх попал справа → dx положительный → летит вправо-вверх
🎮 Попробуй сам 1. Поменяй 5 на 8 — углы станут острее.
2. Верни мячу +1 к скорости при каждом отскоке от ракетки — станет быстрее.
← НазадУрок 2 — Мяч и стены