Подача
Урок 35 из 41 курса Создавайте игры с 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. Во время ожидания показывайте по центру в точке(300, 360)текстPress Space to serve.
Нажмите «Играть» и пропустите мяч: он ждёт посередине, пока не будет нажата клавиша Space. Затем нажмите «Проверить».
Попробуйте сами
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