Pygame - Xử lý sự kiện

Category: Pygame

Sự kiện là một hành động được người dùng thực hiện để đạt được kết quả mong muốn. Ví dụ, nếu người dùng nhấp vào một nút thì đó được gọi là sự kiện nhấp. Giờ đây, tất cả các sự kiện được người dùng thực hiện sẽ được đưa vào một hàng đợi gọi là hàng đợi sự kiện. Vì là hàng đợi nên nó tuân theo quy tắc Vào trước Ra trước, tức là phần tử được thêm vào trước sẽ được lấy ra trước. Trong trường hợp này, khi một sự kiện được tạo, nó sẽ được thêm vào cuối hàng đợi và khi sự kiện được xử lý thì nó sẽ được lấy ra từ đầu. Mỗi phần tử trong hàng đợi này được liên kết với một thuộc tính, không gì khác ngoài một số nguyên biểu thị loại sự kiện đó. Chúng ta hãy tìm hiểu một vài thuộc tính quan trọng của các loại sự kiện phổ biến.

Số SR.

Sự kiện

Thuộc tính

1.

KEYDOWN 

 key, mod, unicode

2.

KEYUP

key, mod

3.

MOUSEBUTTONUP 

pos, button

4.

MOUSEBUTTONDOWN

pos, button

5.

MOUSEMOTION

 pos, rel, buttons

6.

QUIT

Vì bạn đã hiểu sự kiện trong pygame là gì, giờ chúng ta hãy cùng tìm hiểu sâu hơn về chủ đề này. Điều quan trọng cần biết là việc xử lý sự kiện phải được thực hiện trong hàm main. Lý do là nếu sự kiện được xử lý, có khả năng xảy ra độ trễ đầu vào, dẫn đến trải nghiệm người dùng kém. Quá trình xử lý được thực hiện bằng pygame.event.get(). Đây là một hàm sẽ trả về danh sách các sự kiện có thể được xử lý lần lượt. 

Các loại sự kiện

1) Sự kiện bàn phím: 

Như đã đề cập ở trên, sự kiện là một hành động do người dùng thực hiện. Vậy chúng ta hãy cùng tự hỏi, những hành động nào có thể được thực hiện trên bàn phím? Câu trả lời đơn giản là nhấn hoặc thả phím. Nhấn phím được gọi là KEYDOWN và thả phím được gọi là KEYUP. Thuộc tính liên kết với các sự kiện này được gọi là phím kiểu số nguyên. Công dụng của nó là biểu diễn phím của bàn phím. Các phím chung được biểu diễn bằng một hằng số nguyên được xác định trước, là chữ K hoa. Chữ K này được theo sau bởi một dấu gạch dưới và sau đó là tên của phím. Ví dụ: K_s, K_F7.

Thực tế là chữ in hoa không có hằng số nguyên. Giải pháp cho vấn đề này là một thứ gọi là modifier, hay còn gọi là mod, tức là mod cho các phím shift, alt, ctrl, v.v. được nhấn đồng thời. Giá trị nguyên của mod được lưu trữ trong một biến gọi là KMOD_, theo sau là tên của phím. Ví dụ: KMOD_RSHIFT, KMOD_CTRL, v.v. Hãy cùng ôn lại các khái niệm đã học trong chủ đề sự kiện bàn phím với sự trợ giúp của một đoạn mã nhỏ.

for event in pygame.event.get():
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_w:
            print("Move the character forwards")
        elif event.key == pygame.K_s:
            print("Move the character backwards")
        elif event.key == pygame.K_a:
            print("Move the character left")
        elif event.key == pygame.K_d:
            print("Move the character right")

2) Sự kiện chuột

Bây giờ chúng ta hãy tìm hiểu các loại sự kiện chuột khác nhau. Hai sự kiện đầu tiên là MOUSEBUTTONDOWN và MOUSEBUTTONUP, tương tự như KEYDOWN và KEYUP, ngoại trừ việc chúng ta sử dụng chuột. Ngoài ra, còn có một sự kiện chuột khác được gọi là MOUSEMOTION. Hãy cùng tìm hiểu chi tiết về cả ba sự kiện chuột này .

i) MOUSEBUTTONDOWN: Sự kiện MOUSEBUTTONDOWN xảy ra khi người dùng nhấn nút chuột. Sự kiện này có một số thuộc tính như sau: 

  • Nút:  Là một số nguyên biểu thị nút đã được nhấn. Nút trái của chuột được biểu thị bằng 1, đối với nút cuộn chuột, số nguyên là 2, và số nguyên 3 là khi nhấn nút phải của chuột.

  • pos: Là vị trí tuyệt đối của chuột (x, y) khi người dùng nhấn nút chuột. 

ii) MOUSEBUTTONUP: Sự kiện MOUSEBUTTONUP xảy ra khi người dùng thả nút chuột. Sự kiện này có cùng các thuộc tính button và pos như MOUSEBUTTONDOWN đã đề cập ở trên.

iii) MOUSEMOTION: Sự kiện này xảy ra khi người dùng di chuyển chuột trong cửa sổ hiển thị. Sự kiện này có các thuộc tính buttons, pos và rel.

  • buttons: Đây là một bộ biểu thị xem các nút chuột (trái, bánh xe chuột, phải) có được nhấn hay không.

  • pos: Là vị trí tuyệt đối (x, y) của con trỏ tính bằng pixel.

  • rel: Biểu thị vị trí tương đối so với vị trí trước đó (rel_x, rel_y) tính bằng pixel.

Chúng ta hãy xem lại các giá trị cho từng thuộc tính nút chuột với sự trợ giúp của bảng sau:

Số SR.

Button

Value

1.

Left mouse button 

1

2.

Mouse wheel button

2

3.

Right mouse button 

3

4.

Mouse wheel scroll up

4

5.

Mouse wheel scroll down

5

Chúng ta hãy cùng xem lại các khái niệm đã học trong chủ đề sự kiện chuột với sự trợ giúp của một đoạn mã nhỏ. 

for event in pygame. event.get():
    if event.type == pygame.QUIT:
        raise SystemExit
    elif event.type == pygame.MOUSEMOTION:
        if event.rel[0] > 0:
            print("Mouse moving to the right")
        elif event.rel[1] > 0:
            print("Mouse moving down")
    elif event.type == pygame.MOUSEBUTTONDOWN:
        if event.button == 3:
            print("Right mouse button pressed")
    elif event.type == pygame.MOUSEBUTTONUP:
        print("Mouse button has been released")

Bây giờ chúng ta hãy xem xét một số chương trình pygame liên quan đến xử lý sự kiện.

Ví dụ 1:

 Chương trình sau sẽ kiểm tra xem chúng ta đã nhấn phím trái hay phím phải và hiển thị kết quả tương ứng.

import pygame
pygame.init()

# Tạo cửa sổ
gameWindow = pygame.display.set_mode((800, 300))
pygame.display.set_caption("Event Handling")


exit_game = False
game_over = False

# Tạo vòng lặp trò chơi
while not exit_game:
    for event in pygame.event.get():  # Vòng lặp For
        if event.type == pygame.QUIT:
            exit_game = True

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                print("You have pressed right arrow key")
            elif event.key == pygame.K_LEFT:
                print("You have pressed left arrow key")

pygame.quit()
quit()

Đầu ra:

Ví dụ 2:

Chương trình sau đây sẽ kiểm tra xem chúng ta có di chuyển chuột, nhấn nút chuột hay thả chuột và hiển thị kết quả tương ứng.

import pygame
pygame.init()

# Tạo cửa sổ
gameWindow = pygame.display.set_mode((800, 300))
pygame.display.set_caption("Event Handling")


exit_game = False
game_over = False

# Tạo vòng lặp trò chơi
while not exit_game:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit_game = True

        if event.type == pygame.QUIT:
            raise SystemExit
        elif event.type == pygame.MOUSEMOTION:
            if event.rel[0] > 0:
                print("Mouse moving to the right")
            elif event.rel[1] > 0:
                print("Mouse moving down")
        elif event.type == pygame.MOUSEBUTTONDOWN:  # Sự kiện nhấp chuột
            if event.button == 3:
                print("Right mouse button pressed")
        elif event.type == pygame.MOUSEBUTTONUP:  #Chuột được thả ra
            print("Mouse button has been released")

pygame.quit()
quit()

Đầu ra:

Published on Jul 28, 2025

Related Posts