Menu
CoddyTech

Saque

Parte de la sección Proyectos del Journey de Pygame de Coddy. Lección 17 de 31.

Después de un punto, la pelota debe esperar en el centro hasta que un jugador esté listo. Una bandera indica si está esperando:

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
    # las paletas se mueven siempre
    if not waiting:
        # la pelota se mueve, rebota y anota; un punto establece waiting = True

Las palas están fuera del if, así que los jugadores pueden prepararse mientras la pelota espera. La barra espaciadora es una acción que se activa una vez por pulsación, por lo que se controla mediante un evento KEYDOWN.

Mientras la pelota espera, muestra Press Space to serve cerca de la parte inferior, centrado en (300, 360).

challenge icon

Desafío

Intermedio
  1. Antes del bucle, establece waiting = False.
  2. Coloca el movimiento de la pelota, los rebotes y la puntuación dentro de if not waiting:, y establece waiting = True después de cada punto.
  3. Un evento KEYDOWN para pygame.K_SPACE establece waiting = False.
  4. Mientras esperas, muestra Press Space to serve centrado en (300, 360).

Pruébalo tú mismo

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

Todas las lecciones de Proyectos

Practica por tu cuenta: Playground de Pygame