Làm thế nào để thêm Sự kiện tùy chỉnh trong Pygame?

Category: Pygame

Trong bài viết này, chúng ta sẽ xem cách thêm sự kiện tùy chỉnh trong PyGame

Cài đặt

Thư viện PyGame có thể được cài đặt bằng lệnh bên dưới:

pip install pygame 

Mặc dù PyGame đi kèm với một bộ sự kiện (ví dụ: KEYDOWN và KEYUP), nó cho phép chúng ta tạo các sự kiện tùy chỉnh bổ sung theo yêu cầu của trò chơi. Sự kiện tùy chỉnh giúp tăng khả năng kiểm soát và tính linh hoạt của chúng ta đối với trò chơi. Sự kiện tùy chỉnh cũng giống như việc tạo sự kiện do người dùng định nghĩa.

Cú pháp:

<event_name> = pygame.USEREVENT + 1

Ví dụ:

# Ở đây, tên sự kiện là CỘNG và TRỪ


ADDITION = pygame.USEREVENT + 1 


SUBTRACTION = pygame.USEREVENT + 2

Bây giờ, làm thế nào để xuất bản các sự kiện tùy chỉnh sau khi chúng được tạo? Có thể thực hiện theo hai cách:

  • Sử dụng phương thức pygame.event.post() .

  • Sử dụng phương thức pygame.time.set_timer() .

Sử dụng phương thức pygame.event.post()

Chúng ta có thể đăng trực tiếp sự kiện bằng phương thức pygame.event.post() . Phương thức này sẽ thêm sự kiện của chúng ta vào cuối các sự kiện trong hàng đợi. Để thực hiện điều này, chúng ta cần chuyển đổi sự kiện sang kiểu sự kiện của Pygame để khớp với các thuộc tính của phương thức đăng và tránh lỗi.

Cú pháp:

# Bước 1 - Chuyển đổi sự kiện thành kiểu dữ liệu sự kiện của pygame

ADD_event = pygame.event.Event(event)

# Bước 2 - Đăng sự kiện

pygame.event.post(ADD_event)    # event_name as parameter

Sử dụng phương thức pygame.time.set_timer()

Phát sóng sự kiện định kỳ bằng bộ đếm thời gian PyGame. Ở đây, chúng ta sẽ sử dụng một phương pháp khác để phát hành sự kiện bằng hàm set_timer() , hàm này nhận hai tham số: tên sự kiện người dùng và khoảng thời gian tính bằng mili giây.

Cú pháp:

# event_name, thi gian tính bng ms

pygame.time.set_timer(event, duration)

Lưu ý: Trong trường hợp này, chúng ta không cần phải chuyển đổi sự kiện do người dùng xác định thành kiểu dữ liệu sự kiện PyGame.

Bây giờ, để tạo một biểu đồ với các sự kiện tùy chỉnh, trước tiên hãy thiết lập các thuộc tính cho màn hình theo yêu cầu. Sau đó, hãy tạo một sự kiện và chuyển đổi nó sang kiểu dữ liệu sự kiện PyGame. Tiếp theo, hãy thêm mã cho các thao tác sẽ tạo ra một sự kiện tùy chỉnh.

Trong quá trình triển khai đã nêu, cả hai cách tiếp cận đều đã được xử lý.

Chương trình : 

# Chương trình Python để thêm các sự kiện tùy chỉnh
import pygame


pygame.init()

# Thiết lập màn hình và bộ đếm thời gian
screen = pygame.display.set_mode((500, 500))
timer = pygame.time.Clock()

# Đặt tiêu đề cửa sổ
pygame.display.set_caption('Sự kiện tùy chỉnh')

# Định nghĩa các màu
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

# Theo dõi trạng thái màu nền hiện tại
bg_active_color = WHITE
screen.fill(WHITE)

# Sự kiện người dùng tùy chỉnh để thay đổi màu sắc
CHANGE_COLOR = pygame.USEREVENT + 1

# Sự kiện người dùng tùy chỉnh để phóng to/thu nhỏ hình hộp
ON_BOX = pygame.USEREVENT + 2

# Tạo hình chữ nhật
box = pygame.Rect((225, 225, 50, 50))
grow = True

# Gửi một sự kiện để thay đổi màu sau mỗi 500 mili giây
pygame.time.set_timer(CHANGE_COLOR, 500)

running = True
while running:

    # Kiểm tra các sự kiện đã được gửi
    # và dựa vào đó thực hiện các hành động cần thiết
    for event in pygame.event.get():
        
        # Thay đổi màu sắc sau mỗi 500 mili giây
        if event.type == CHANGE_COLOR:
            if bg_active_color == GREEN:
                screen.fill(GREEN)
                bg_active_color = WHITE
            elif bg_active_color == WHITE:
                screen.fill(WHITE)
                bg_active_color = GREEN

        if event.type == ON_BOX:

            # Phóng to và thu nhỏ hình hộp
            if grow:
                box.inflate_ip(3, 3)
                grow = box.width < 75
            else:
                box.inflate_ip(-3, -3)
                grow = box.width < 50

        if event.type == pygame.QUIT:
            
            # Thoát khỏi chương trình
            running = False

    # Gửi sự kiện khi con trỏ chuột nằm trên hình hộp
    if box.collidepoint(pygame.mouse.get_pos()):
        pygame.event.post(pygame.event.Event(ON_BOX))

    # Vẽ hình chữ nhật lên màn hình
    pygame.draw.rect(screen, RED, box)

    # Cập nhật màn hình
    pygame.display.update()
    
    # Thiết lập số khung hình mỗi giây
    timer.tick(30)

pygame.quit()

Đầu ra: 

Trong phần triển khai ở trên, chúng ta đã sử dụng phương thức .post() để bơm phồng/xẹp hộp khi con trỏ ở trên cùng của hộp và phương thức .set_timer() để chuyển màu nền sau mỗi 500ms.  

Published on Jul 28, 2025

Related Posts