Menu
CoddyTech

Tiros con efecto

Lección 36 de 41 del curso Crea juegos con Pygame de Coddy.

En Pong, el lugar donde la pelota golpea la paleta determina hacia dónde va. Cerca del extremo superior, sale disparada hacia arriba; cerca del extremo inferior, hacia abajo; y por el medio, directamente hacia el otro lado.

Mide qué tan lejos está el centro de la pelota del centro de la paleta y convierte esa distancia en el nuevo vy:

if ball.colliderect(right):
    vx = -abs(vx)
    vy = (ball.centery - right.centery) // 6

Por encima del centro, la diferencia es negativa, así que la pelota sube; por debajo, es positiva. Dividir entre 6 evita que vaya demasiado rápido: un golpe en el extremo produce un vy de aproximadamente 7.

Esto convierte Pong en un juego de habilidad: apuntas con la paleta.

challenge icon

Desafío

Difícil

Haz que las palas apunten hacia la pelota.

  1. En ambas colisiones con las palas, después de asignar vx, asigna a vy la diferencia entre el centro de la pelota y el centro de esa pala.
  2. Divídela entre 6 con //.

Presiona «Jugar» y golpea la pelota con el extremo de una pala: saldrá disparada en ángulo. Después, «Comprobar».

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
waiting = False

running = True
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

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

    if not waiting:
        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
            waiting = True
        if ball.right < 0:
            right_score += 1
            ball.center = (300, 200)
            vx = -vx
            waiting = True

    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)))
    if waiting:
        message = font.render("Press Space to serve", True, (240, 240, 240))
        screen.blit(message, message.get_rect(center=(300, 360)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Todas las lecciones de Crea juegos con Pygame

Practica por tu cuenta: Playground de Pygame