Tiros con efecto
Lección 36 de 40 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) // 6Por 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.
Desafío
DifícilEn ambas colisiones con las paletas, después de establecer vx, establece vy en la diferencia entre el centro de la pelota y el centro de esa paleta, dividida entre 6 con //.
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()
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Crea juegos con Pygame
1El ciclo del juego
Abrir una ventanaRellenar el fondo4Dos jugadores y una pelota
La pelotaRebotarPractica por tu cuenta: Playground de Pygame