Menu
CoddyTech

Xoay từ hình ảnh gốc

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

Một quả cầu gai quay liên tục sẽ xoay một chút sau mỗi khung hình. Có một cách viết trông hấp dẫn, nhưng lại gây lỗi:

ball = pygame.transform.rotate(ball, 2)  # sai

Mỗi khung hình xoay hình ảnh đã xoay ở khung hình trước. Mỗi lần xoay lại thêm một viền trong suốt, khiến Surface lớn thêm khoảng 3 phần trăm sau mỗi khung hình: kích thước tăng gấp đôi sau nửa giây, rộng gần 1.800 pixel sau hai giây. Các pixel cũng nhòe thêm một chút sau mỗi lần xoay. Chẳng mấy chốc, trò chơi chạy chậm như rùa bò.

Thay vào đó, hãy giữ lại hình ảnh gốc và góc xoay, rồi tạo hình ảnh đã xoay từ hình gốc sau mỗi khung hình:

angle += 2
spun = pygame.transform.rotate(ball, angle)
screen.blit(spun, spun.get_rect(center=(320, 240)))

Giờ đây, spun chỉ được xoay một lần từ tệp gốc, bất kể góc xoay là bao nhiêu: kích thước không bao giờ vượt quá 67 x 67 pixel và hình ảnh không bao giờ nhòe hơn sau một lần xoay. Quy tắc này áp dụng cho mọi phép biến đổi: hãy thao tác trên hình gốc, không phải trên bản sao gần nhất.

challenge icon

Thử thách

Trung bình

Xoay quả bóng gai mà không làm nó to lên.

  1. Trước vòng lặp, tạo angle = 0. Mỗi khung hình, tăng giá trị này thêm 2.
  2. Xoay ball ban đầu theo angle rồi vẽ kết quả với tâm tại (320, 240).
  3. Không bao giờ thay đổi chính ball.

Nhấn Chơi: quả bóng gai xoay và giữ nguyên kích thước. 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("Spinning Spikes")
clock = pygame.time.Clock()

ball = pygame.image.load("assets/images/spike_ball.png").convert_alpha()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    screen.fill((20, 22, 40))
    screen.blit(ball, ball.get_rect(center=(320, 240)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

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

Tự luyện tập: Playground Pygame