Menu
CoddyTech

Serwis

Lekcja 35 z 41 w kursie Twórz gry w Pygame w Coddy.

Po zdobyciu punktu piłka powinna czekać na środku, aż jeden z graczy będzie gotowy. Zmienna logiczna określa, czy piłka czeka:

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
    # Paletki poruszają się cały czas
    if not waiting:
        # Piłka porusza się, odbija i zdobywa punkty; zdobycie punktu ustawia waiting = True

Paletki znajdują się poza instrukcją if, więc gracze mogą przygotować się, gdy piłka czeka. Spacja to akcja wykonywana raz na naciśnięcie, dlatego wywołuje ją zdarzenie KEYDOWN.

Gdy piłka czeka, wyświetl u dołu, na środku, tekst Press Space to serve w punkcie (300, 360).

challenge icon

Wyzwanie

Średni

Po każdym punkcie poczekaj na serwis.

  1. Przed pętlą ustaw waiting = False.
  2. Umieść ruch piłki, odbicia i zdobywanie punktów pod if not waiting:, a po każdym punkcie ustaw waiting = True.
  3. Zdarzenie KEYDOWN dla pygame.K_SPACE ustawia waiting = False. Podczas oczekiwania wyświetl tekst Press Space to serve na środku, w punkcie (300, 360).

Naciśnij „Graj” i pozwól piłce przelecieć obok: zatrzyma się na środku, dopóki nie naciśniesz spacji. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

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()

Wszystkie lekcje w sekcji Twórz gry w Pygame

Poćwicz samodzielnie: Edytor online Pygame