Đánh trúng thanh đỡ
Bài học 32 trên 41 trong khóa học Tạo trò chơi với Pygame của Coddy.
Khi quả bóng chạm vào một thanh đỡ, nó sẽ bay ngược lại. ball.colliderect(right) cho biết chúng có chạm nhau hay không.
Đổi dấu bằng vx = -vx có một điểm dễ gây lỗi. Nếu quả bóng vẫn nằm trong thanh đỡ ở khung hình tiếp theo (nó chạm vào đầu thanh đỡ hoặc thanh đỡ di chuyển đè lên nó), dấu lại bị đổi, rồi lại đổi tiếp: quả bóng rung lắc bên trong thanh đỡ.
Hãy đặt hướng thay vì đổi dấu. abs(vx) là vx không có dấu, vì vậy giá trị này luôn dương:
if ball.colliderect(left):
vx = abs(vx)
if ball.colliderect(right):
vx = -abs(vx)Khi bật ra khỏi thanh đỡ bên trái, quả bóng luôn bay sang phải; khi bật ra khỏi thanh đỡ bên phải, bóng luôn bay sang trái, bất kể chúng chạm nhau trong bao nhiêu khung hình.
Thử thách
Trung bìnhĐánh bóng bật khỏi các thanh đỡ.
- Sau khi bóng bật khỏi tường, khi bóng va chạm với
left, hãy đặtvx = abs(vx). - Khi bóng va chạm với
right, hãy đặtvx = -abs(vx).
Nhấn Chơi và đỡ bóng bằng thanh đỡ bên phải: bóng sẽ bật ngược lại. Sau đó, nhấn Kiểm tra.
Tự làm thử
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()
Tất cả bài học trong Tạo trò chơi với Pygame
1Vòng lặp trò chơi
Mở cửa sổTô màu nền4Hai người chơi và một quả bóng
Quả bóngNảyTự luyện tập: Playground Pygame