Menu
CoddyTech

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

challenge icon

Thử thách

Trung bình

Đánh bóng bật lại 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 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

Tự luyện tập: Playground Pygame