Menu
CoddyTech
flag Ru iconРусскийdown icon

Подача

Урок 35 из 40 курса Создавай игры на Pygame на Coddy.

После розыгрыша мяч должен ждать в центре, пока игрок не будет готов. Флаг указывает, ждёт ли он:

waiting = False

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            waiting = False
    # ракетки двигаются всегда
    if not waiting:
        # мяч движется, отскакивает и приносит очки; после набранного очка waiting = True

Ракетки находятся вне if, поэтому игроки могут подготовиться, пока мяч ждёт. Нажатие пробела срабатывает один раз при каждом нажатии, поэтому оно обрабатывается событием KEYDOWN.

Пока мяч ждёт, покажите внизу надпись Press Space to serve, расположенную по центру в точке (300, 360).

challenge icon

Задание

Средне
  1. Перед циклом установи waiting = False.
  2. Помести движение мяча, отскоки и начисление очков внутрь if not waiting: и устанавливай waiting = True после каждого очка.
  3. Событие KEYDOWN для pygame.K_SPACE устанавливает waiting = False.
  4. Во время ожидания показывай надпись Press Space to serve по центру в точке (300, 360).

Попробуйте сами

import pygame

pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Pong")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 36)

ball = pygame.Rect(293, 193, 14, 14)
vx, vy = 5, 4
left = pygame.Rect(20, 160, 12, 80)
right = pygame.Rect(568, 160, 12, 80)
left_score = 0
right_score = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_w]:
        left.y -= 6
    if keys[pygame.K_s]:
        left.y += 6
    if keys[pygame.K_UP]:
        right.y -= 6
    if keys[pygame.K_DOWN]:
        right.y += 6
    left.clamp_ip(screen.get_rect())
    right.clamp_ip(screen.get_rect())

    ball.x += vx
    ball.y += vy
    if ball.top <= 0 or ball.bottom >= 400:
        vy = -vy
    if ball.colliderect(left):
        vx = abs(vx)
    if ball.colliderect(right):
        vx = -abs(vx)
    if ball.left > 600:
        left_score += 1
        ball.center = (300, 200)
        vx = -vx
    if ball.right < 0:
        right_score += 1
        ball.center = (300, 200)
        vx = -vx

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (80, 160, 255), left)
    pygame.draw.rect(screen, (235, 80, 80), right)
    pygame.draw.rect(screen, (255, 196, 0), ball)
    score = font.render(f"{left_score} : {right_score}", True, (240, 240, 240))
    screen.blit(score, score.get_rect(center=(300, 30)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Создавай игры на Pygame

Потренируйтесь самостоятельно: Песочница Pygame