Menu
CoddyTech

Golpea la paleta

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

Cuando la pelota toca una paleta, debería dirigirse hacia el otro lado. ball.colliderect(right) te indica si se tocan.

Cambiar el signo, vx = -vx, tiene una trampa. Si la pelota todavía está dentro de la paleta en el siguiente fotograma (si golpeó el extremo de la paleta o si la paleta se movió sobre ella), el signo vuelve a cambiar 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 salir de la paleta izquierda, la pelota siempre va hacia la derecha, y al salir de la paleta derecha, siempre hacia la izquierda, sin importar cuántos fotogramas estén en contacto.

challenge icon

Desafío

Intermedio

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

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()
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Proyectos

Practica por tu cuenta: Playground de Pygame