Đánh trúng thanh đỡ
Thuộc phần Dự án trong hành trình Pygame của Coddy. Bài học 14 trên 33.
Khi bóng chạm vào một thanh đỡ, bóng sẽ đi ngược lại hướng đó. ball.colliderect(right) cho bạn biết chúng có chạm nhau hay không.
Đổi dấu bằng vx = -vx có một vấn đề. Nếu bóng vẫn nằm bên trong thanh đỡ ở khung hình tiếp theo (bóng chạm vào đầu thanh đỡ hoặc thanh đỡ di chuyển đè lên bóng), dấu lại đổi lần nữa rồi tiếp tục đổi: bóng rung 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)Bóng luôn đi sang phải khi bật khỏi thanh đỡ bên trái và luôn đi sang trái khi bật khỏi thanh đỡ bên phải, bất kể hai vật chạm nhau trong bao nhiêu khung hình.
Thử thách
Trung bìnhĐánh bóng bật lại 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 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 Dự án
2Pong hai người chơi
Quả bóngNảyTự luyện tập: Playground Pygame