Pygame – Vẽ đối tượng và hình dạng

Category: Pygame

Trong bài viết này, chúng ta sẽ xem cách vẽ một vật thể bằng Pygame. Có hai phiên bản để vẽ bất kỳ hình dạng nào: hình khối hoặc chỉ là phác thảo.

Vẽ đối tượng và hình dạng trong PyGame

Bạn có thể dễ dàng vẽ các hình dạng cơ bản trong pygame bằng phương thức vẽ của pygame. 

Vẽ hình chữ nhật: 

Để vẽ hình chữ nhật trong dự án pygame, bạn có thể sử dụng hàm draw.rect().

Cú pháp: pygame.draw.rect(surface, color, rect, width)

Các thông số:

surface : Ở đây, chúng ta có thể truyền bề mặt mà chúng ta muốn vẽ hình chữ nhật. Trong ví dụ trên, chúng ta đã tạo một đối tượng bề mặt có tên là 'cửa sổ'.
color : Ở đây chúng ta có thể truyền màu cho hình chữ nhật. Trong ví dụ này, chúng ta sử dụng màu xanh lam.
rect :- Ở đây chúng ta có thể truyền hình chữ nhật, vị trí và kích thước.
width :- Ở đây, chúng ta có thể truyền độ dày đường nét. Chúng ta cũng có thể tạo một hình chữ nhật đặc bằng cách thay đổi giá trị của tham số width này. Vậy hãy cùng xem xét điều đó.

Trước tiên, hãy nhập mô-đun cần thiết và khởi tạo pygame. Tiếp theo, tạo đối tượng bề mặt có kích thước cụ thể bằng phương thức display.set_mode() của pygame. Tô màu trắng cho nền của đối tượng bề mặt bằng hàm fill() của pygame. Tạo một hình chữ nhật bằng phương thức draw.rect() của pygame. Cập nhật đối tượng Surface.

Ví dụ 1: Vẽ hình chữ nhật có đường viền bằng pygame.

# nhập mô-đun pygame
import pygame
from pygame.locals import *

# khởi động pygame và cấp quyền
# sử dụng các chức năng của pygame
pygame.init()

# tạo đối tượng surface hiển thị
# với kích thước cụ thể
window = pygame.display.set_mode((600, 600))

# tô màu trắng cho toàn bộ màn hình
window.fill((255, 255, 255))

# sử dụng hàm draw.rect của pygame
# để vẽ hình chữ nhật viền (không tô đầy)
pygame.draw.rect(window, (0, 0, 255), 
                 [100, 100, 400, 100], 2)

# vẽ nội dung surface lên màn hình
pygame.display.update()

Đầu ra:

Chúng ta có thể tạo một hình chữ nhật đặc bằng cách đặt tham số chiều rộng bằng 0 và phần còn lại của phương pháp vẫn giữ nguyên.

Ví dụ 2: Vẽ một hình chữ nhật đặc.

# nhập mô-đun pygame
import pygame
from pygame.locals import *

# khởi động pygame và cấp quyền
# sử dụng các chức năng của pygame
pygame.init()

# tạo đối tượng surface hiển thị
# với kích thước cụ thể
window = pygame.display.set_mode((600, 600))

# tô toàn bộ màn hình với màu trắng
window.fill((255, 255, 255))

# sử dụng hàm draw.rect của pygame
# để vẽ hình chữ nhật đặc (tô đầy)
pygame.draw.rect(window, (0, 0, 255),
                 [100, 100, 400, 100], 0)

# vẽ nội dung surface lên màn hình
pygame.display.update()

Đầu ra:

Vẽ hình tròn:

Để vẽ một hình tròn trong dự án pygame của bạn, bạn có thể sử dụng hàm draw.circle(). Toàn bộ cách tiếp cận giống như trên, chỉ khác là hàm và tham số được thay đổi cho phù hợp.

Cú pháp: pygame.draw.circle(surface, color, center, radius, width)


Các thông số:


surface : Ở đây, chúng ta có thể truyền bề mặt mà chúng ta muốn vẽ đường tròn. Trong ví dụ trên, chúng ta đã tạo một đối tượng bề mặt có tên là 'cửa sổ'.
color : Ở đây chúng ta có thể truyền màu cho hình tròn. Trong ví dụ này, chúng ta sử dụng màu xanh lá cây.
center  :- Ở đây chúng ta có thể truyền tọa độ ( x, y ) cho tâm của hình tròn.
radius  :- Ở đây chúng ta có thể truyền bán kính của hình tròn.
width :- Ở đây, chúng ta có thể truyền độ dày đường thẳng. Chúng ta cũng có thể tạo một đường tròn đặc bằng cách thay đổi giá trị của tham số width này. Vậy hãy cùng xem xét điều đó.

Ví dụ 1: Vẽ một hình tròn rỗng.

# nhập mô-đun pygame
import pygame
from pygame.locals import *

# khởi động pygame và cấp quyền
# sử dụng các chức năng của pygame
pygame.init()

# tạo đối tượng surface hiển thị
# với kích thước cụ thể
window = pygame.display.set_mode((600, 600))

# tô toàn bộ màn hình với màu trắng
window.fill((255, 255, 255))

# sử dụng hàm draw.circle của pygame
# để vẽ hình tròn có viền (không tô đầy)
pygame.draw.circle(window, (0, 255, 0), 
                   [300, 300], 170, 3)

# vẽ nội dung surface lên màn hình
pygame.display.update()

Đầu ra:

Chúng ta có thể tạo một hình tròn đặc bằng cách đặt tham số chiều rộng bằng 0. 

Ví dụ 2: vẽ một hình tròn đặc

# nhập mô-đun pygame
import pygame
from pygame.locals import *

# khởi động pygame và cấp quyền
# sử dụng các chức năng của pygame
pygame.init()

# tạo đối tượng surface hiển thị
# với kích thước cụ thể
window = pygame.display.set_mode((600, 600))

# tô toàn bộ màn hình với màu trắng
window.fill((255, 255, 255))

# sử dụng hàm draw.circle của pygame
# để vẽ hình tròn đặc (tô đầy)
pygame.draw.circle(window, (0, 255, 0),
                   [300, 300], 170, 0)

# vẽ nội dung surface lên màn hình
pygame.display.update()

Đầu ra:

Tương tự như vậy, bạn có thể vẽ các hình dạng cơ bản khác bằng cách sử dụng mô-đun vẽ của pygame. 

Vẽ hình đa giác:

Có thể vẽ đa giác mong muốn bằng hàm polygon(). 

Cú Pháp: polygon(surface, color, points, width)

Một lần nữa cách tiếp cận vẫn giữ nguyên, chỉ có chức năng và tham số thay đổi.

Ví dụ 1: vẽ một đa giác đặc

# nhập mô-đun pygame
import pygame
from pygame.locals import *

# khởi động pygame và cấp quyền
# sử dụng các chức năng của pygame
pygame.init()

# tạo đối tượng surface hiển thị
# với kích thước cụ thể
window = pygame.display.set_mode((600, 600))

# tô toàn bộ màn hình với màu trắng
window.fill((255, 255, 255))

# sử dụng hàm draw.polygon của pygame
# để vẽ hình đa giác đặc (tô đầy)
pygame.draw.polygon(window, (255, 0, 0), 
                    [[300, 300], [100, 400],
                     [100, 300]])

# vẽ nội dung surface lên màn hình
pygame.display.update()

Đầu ra:

Ví dụ 2: Vẽ một đa giác rỗng

# nhập mô-đun pygame
import pygame
from pygame.locals import *

# khởi động pygame và cấp quyền
# sử dụng các chức năng của pygame
pygame.init()

# tạo đối tượng surface hiển thị
# với kích thước cụ thể
window = pygame.display.set_mode((600, 600))

# tô toàn bộ màn hình với màu trắng
window.fill((255, 255, 255))

# sử dụng hàm draw.polygon của pygame
# để vẽ hình đa giác có viền (không tô đầy)
pygame.draw.polygon(window, (255, 0, 0), 
                    [[300, 300], [100, 400],
                     [100, 300]], 5)

# vẽ nội dung surface lên màn hình
pygame.display.update()

Đầu ra:

Vẽ hình dạng đường thẳng:

Đường thẳng là thực thể vẽ cơ bản nhất và có thể được vẽ trong pygame bằng hàm line().

Cú Pháp: pygame.draw.line(surface, color, start_pos, end_pos, width)

Ví dụ 1: vẽ một đường thẳng

# nhập mô-đun pygame
import pygame
from pygame.locals import *

# khởi động pygame và cấp quyền
# sử dụng các chức năng của pygame
pygame.init()

# tạo đối tượng surface hiển thị
# với kích thước cụ thể
window = pygame.display.set_mode((600, 600))

# tô toàn bộ màn hình với màu trắng
window.fill((255, 255, 255))

# sử dụng hàm draw.line của pygame
# để vẽ một đường thẳng
pygame.draw.line(window, (0, 0, 0), 
                 [100, 300], 
                 [500, 300], 5)

# vẽ nội dung surface lên màn hình
pygame.display.update()

Đầu ra:

Vẽ nhiều hình dạng:

Bạn có thể vẽ nhiều hình dạng trên cùng một đối tượng bề mặt. Để làm được điều đó, các mô-đun cần thiết đầu tiên được nhập và pygame được khởi tạo. Bây giờ, hãy tạo đối tượng bề mặt có kích thước cụ thể bằng phương thức display.set_mode() của pygame. Tô màu nền của đối tượng bề mặt bằng màu trắng bằng hàm fill() của pygame. Việc tạo các hình dạng cần thiết đã được mô tả ở trên. Cập nhật đối tượng Bề mặt

Ví dụ 1: Vẽ một hình tròn bên trong một hình chữ nhật.

# nhập mô-đun pygame
import pygame
from pygame.locals import *

# khởi động pygame và cấp quyền
# sử dụng các chức năng của pygame
pygame.init()

# tạo đối tượng surface hiển thị
# với kích thước cụ thể
window = pygame.display.set_mode((600, 600))

# tô toàn bộ màn hình với màu trắng
window.fill((255, 255, 255))

# sử dụng hàm draw.rect của pygame
# để vẽ hình chữ nhật
pygame.draw.rect(window, (0, 0, 255),
                 [50, 200, 500, 200])

# sử dụng hàm draw.circle của pygame
# để vẽ hình tròn bên trong hình chữ nhật
pygame.draw.circle(window, (0, 255, 0),
                   [300, 300], 100)

# vẽ nội dung surface lên màn hình
pygame.display.update()

Đầu ra:

Ví dụ 2: Vẽ các hình chữ nhật nằm bên trong nhau.

# nhập mô-đun pygame
import pygame
from pygame.locals import *

# khởi động pygame và cấp quyền
# sử dụng các chức năng của pygame
pygame.init()

# tạo đối tượng surface hiển thị
# với kích thước cụ thể
window = pygame.display.set_mode((600, 600))

# tô toàn bộ màn hình với màu trắng
window.fill((255, 255, 255))

# tạo danh sách các hình chữ nhật khác nhau
rectangle_list = [pygame.Rect(50, 100, 500, 200),
                  pygame.Rect(70, 120, 460, 160),
                  pygame.Rect(90, 140, 420, 120),
                  pygame.Rect(110, 160, 380, 80),
                  pygame.Rect(130, 180, 340, 40)
                  ]

# tạo danh sách các màu khác nhau
color_list = [(0,   0,   0),
              (255, 255, 255),
              (0,   0, 255),
              (0, 255,   0),
              (255,   0,   0)
              ]

# tạo một biến để sử dụng
# khi lặp qua danh sách màu
color_var = 0

# lặp qua danh sách các hình chữ nhật
# bằng vòng lặp for
for rectangle in rectangle_list:

    # vẽ hình chữ nhật
    # bằng phương thức draw.rect()
    pygame.draw.rect(window, color_list[color_var],
                     rectangle)

    # tăng giá trị biến color_var
    # thêm 1 sau mỗi lần lặp
    color_var += 1

# vẽ nội dung surface lên màn hình
pygame.display.update()

Đầu ra:

Viết các hàm vẽ của riêng bạn:

Bạn có thể dễ dàng tạo các chức năng vẽ chuyên biệt của riêng mình trong pygame. 

Bạn có thể thực hiện việc này bằng cách làm theo quy trình sau. Tạo một hàm vẽ lấy vị trí bắt đầu, chiều rộng và chiều cao làm tham số. Các hình dạng cần vẽ đã được mô tả ở trên. Gọi hàm drawfunction()

# nhập mô-đun pygame
import pygame
from pygame.locals import *

# tạo hàm vẽ


def drawingfunction(x, y, width, height):

    # tạo hình chữ nhật bằng phương thức draw.rect()
    pygame.draw.rect(window, (0, 0, 255), [x, y, width, height])

    # tính tọa độ tâm của hình tròn
    circle_x = width / 2 + x
    circle_y = height / 2 + y

    # tính bán kính của hình tròn
    if height < width:
        radius = height / 2
    else:
        radius = width / 2

    # vẽ hình tròn
    pygame.draw.circle(window, (0, 255, 0), [circle_x, circle_y], radius)


# khởi động pygame và cấp quyền
# sử dụng các chức năng của pygame
pygame.init()

# tạo đối tượng surface hiển thị
# với kích thước cụ thể
window = pygame.display.set_mode((600, 600))

# tô toàn bộ màn hình với màu trắng
window.fill((255, 255, 255))

# gọi hàm vẽ
drawingfunction(50, 200, 500, 200)

# vẽ nội dung surface lên màn hình
pygame.display.update()

Đầu ra:

Vẽ hình bằng chuột:

Bây giờ, hãy xem cách tạo hình dạng mỗi khi người dùng nhấp chuột. Chúng ta sẽ tạo hình tròn trong ví dụ tiếp theo, nhưng bạn có thể tạo bất kỳ hình dạng nào bạn muốn.

Tạo một danh sách để lưu trữ vị trí của hình cần vẽ. Tạo một biến để lưu trữ màu của hình. Tạo một biến mà chúng ta sẽ sử dụng để chạy vòng lặp while và Tạo một vòng lặp while. Lặp lại tất cả các sự kiện nhận được từ pygame.event.get(). Nếu loại sự kiện là quit thì đặt biến run thành false. Nếu loại sự kiện là MOUSEBUTTONDOWN (sự kiện này xảy ra khi người dùng nhấn nút chuột) thì lấy vị trí hiện tại trong một biến rồi thêm vị trí đó vào danh sách circle_positions của chúng ta. Lặp lại tất cả các vị trí trong mảng được tạo bằng vòng lặp for. Tiếp tục vẽ hình. Cập nhật đối tượng bề mặt.

# nhập mô-đun pygame
import pygame
from pygame.locals import *

# khởi động pygame và cấp quyền
# sử dụng các chức năng của pygame
pygame.init()

# tạo đối tượng surface hiển thị
# với kích thước cụ thể
window = pygame.display.set_mode((600, 600))

# tô toàn bộ màn hình với màu trắng
window.fill((255, 255, 255))

# tạo danh sách để lưu
# các vị trí của hình tròn
circle_positions = []

# bán kính của hình tròn
circle_radius = 60

# màu của hình tròn
color = (0, 0, 255)

# tạo một biến sẽ được sử dụng
# để chạy vòng lặp while
run = True

# tạo vòng lặp while
while run:

    # lặp qua tất cả các sự kiện nhận được từ
    # pygame.event.get()
    for event in pygame.event.get():

        # nếu loại sự kiện là QUIT (thoát)
        # thì gán biến run thành False
        if event.type == QUIT:
            run = False

        # nếu loại sự kiện là MOUSEBUTTONDOWN
        # thì lưu lại vị trí hiện tại của chuột
        elif event.type == MOUSEBUTTONDOWN:
            position = event.pos
            circle_positions.append(position)
            
    # sử dụng vòng lặp for để duyệt qua
    # danh sách circle_positions
    for position in circle_positions:

        # vẽ hình tròn
        pygame.draw.circle(window, color, position,
                           circle_radius)

    # vẽ nội dung surface lên màn hình
    pygame.display.update()

Đầu ra:


Published on Jul 28, 2025

Related Posts