Menu
CoddyTech

Golpea la paleta

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

Cuando la pelota toca una paleta, debe dirigirse en la otra dirección. ball.colliderect(right) te indica si se tocan.

Cambiar el signo con vx = -vx tiene una trampa. Si la pelota sigue dentro de la paleta en el siguiente fotograma (ha tocado el extremo de la paleta o la paleta se ha movido encima de ella), cambia de signo una y otra vez: la pelota tiembla dentro de la paleta.

Establece la dirección en lugar de cambiar el signo. abs(vx) es vx sin su signo, así que siempre es positivo:

if ball.colliderect(left):
    vx = abs(vx)
if ball.colliderect(right):
    vx = -abs(vx)

Al rebotar en la paleta izquierda, la pelota siempre va hacia la derecha, y al rebotar en la paleta derecha, siempre va hacia la izquierda, por muchos fotogramas que se toquen.

challenge icon

Desafío

Intermedio

Haz que la pelota rebote en las paletas.

  1. Después del rebote en la pared, cuando la pelota choque con left, establece vx = abs(vx).
  2. Cuando choque con right, establece vx = -abs(vx).

Pulsa «Jugar» y atrapa la pelota con la paleta derecha: rebotará. Después, pulsa «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()

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)

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

    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)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Todas las lecciones de Crea juegos con Pygame

Practica por tu cuenta: Playground de Pygame