Menu
CoddyTech

Hình chữ nhật thật bất công

Thuộc phần Sprite và hình ảnh trong hành trình Pygame của Coddy. Bài học 22 trên 39.

Điều khiển con tàu hướng về quả bóng gai bằng các phím mũi tên. Va chạm giữa các Rect, colliderect, nhanh và đơn giản, nhưng với quả bóng tròn thì kết quả không chính xác. Rect của quả bóng là hình vuông bao quanh nó, kể cả các góc trong suốt, còn Rect của con tàu có khoảng trống bên cạnh mũi tàu.

Hãy làm cho phép kiểm tra dễ thấy: vẽ đường viền quanh Rect của quả bóng và tô màu đường viền theo kết quả mà colliderect trả về.

if ship_rect.colliderect(ball_rect):
    colour = (230, 60, 60)
else:
    colour = (90, 90, 120)
pygame.draw.rect(screen, colour, ball_rect, 2)

Sau đó, cho tàu tiến đến quả bóng từ phía dưới bên phải. Đường viền chuyển sang màu đỏ trong khi vẫn còn một khoảng trời rõ ràng giữa con tàu và các gai: các góc của hai Rect chồng lên nhau, nhưng hình ảnh thì không. Trong trò chơi, điều đó khiến bạn mất mạng một cách vô ích, và người chơi sẽ nhận ra.

Các bài học tiếp theo sẽ kiểm tra chính những hình ảnh đó.

challenge icon

Thử thách

Dễ

Hiển thị khi hai hình chữ nhật va chạm.

  1. Sau khi vẽ quả bóng và con tàu, vẽ đường viền quanh ball_rect rộng 2 pixel.
  2. Đổi đường viền thành màu đỏ (230, 60, 60) khi ship_rect va chạm với nó, nếu không thì dùng màu xám (90, 90, 120).

Nhấn Chơi rồi bay từ góc dưới bên phải vào: đường viền chuyển sang màu đỏ trước khi hai hình chạm nhau. Sau đó nhấn Kiểm tra.

Tự làm thử

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Near Miss")
clock = pygame.time.Clock()

ship = pygame.image.load("assets/images/ship.png").convert_alpha()
ship_rect = ship.get_rect(topleft=(420, 320))
ball = pygame.image.load("assets/images/spike_ball.png").convert_alpha()
ball_rect = ball.get_rect(center=(320, 240))

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_LEFT]:
        ship_rect.x -= 4
    if keys[pygame.K_RIGHT]:
        ship_rect.x += 4
    if keys[pygame.K_UP]:
        ship_rect.y -= 4
    if keys[pygame.K_DOWN]:
        ship_rect.y += 4

    screen.fill((20, 22, 40))
    screen.blit(ball, ball_rect)
    screen.blit(ship, ship_rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Tất cả bài học trong Sprite và hình ảnh

Tự luyện tập: Playground Pygame