Подача
Урок 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).
Задание
Средне- Перед циклом установи
waiting = False. - Помести движение мяча, отскоки и начисление очков внутрь
if not waiting:и устанавливайwaiting = Trueпосле каждого очка. - Событие KEYDOWN для
pygame.K_SPACEустанавливаетwaiting = False. - Во время ожидания показывай надпись
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()
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Создавай игры на Pygame
Потренируйтесь самостоятельно: Песочница Pygame