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 đó.
Thử thách
DễHiển thị khi hai hình chữ nhật va chạm.
- Sau khi vẽ quả bóng và con tàu, vẽ đường viền quanh
ball_rectrộng 2 pixel. - Đổi đường viền thành màu đỏ
(230, 60, 60)khiship_rectva 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
5Va chạm chính xác đến từng pixel
Hình chữ nhật thật bất côngMặt nạSprite chính xác đến từng pixelVùng va chạm hình tròn3Lớp cho đối tượng trong trò chơi
Lớp đầu tiên của bạnPhương thứcSelf là đối tượngDanh sách đối tượngĐối tượng có hình ảnhDanh sách kẻ địchLớp con6Hoạt ảnh từ sprite sheet
Cắt sprite sheetBộ đếm khung hìnhTạo hoạt ảnh theo thời gianHiệu ứng nổ chỉ chạy một lầnTự luyện tập: Playground Pygame