Menu
CoddyTech

Đá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.

challenge icon

Thử thách

Trung bình

Đánh bóng bật khỏi các thanh đỡ.

  1. Sau khi bóng bật khỏi tường, khi bóng va chạm với left, hãy đặt vx = abs(vx).
  2. Khi bóng va chạm với right, hãy đặt vx = -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

Tự luyện tập: Playground Pygame