Làm thế nào để sử dụng chuột để thay đổi kích thước và xoay hình ảnh trong PyGame?

Category: Pygame

Trong bài viết này, chúng ta sẽ thảo luận về cách chuyển đổi hình ảnh (thay đổi tỷ lệ và xoay hình ảnh) bằng chuột trong Pygame.

Tiếp cận

Bước 1: Đầu tiên, nhập thư viện Pygame và math.

import pygame
import math
from pygame.locals import *

Bước 2: Bây giờ, hãy lấy màu sắc làm dữ liệu đầu vào mà chúng ta muốn sử dụng trong trò chơi.

color_1 = #RGB value of color 1
color_2 = #RGB value of color 2
color_n = #RGB value of color n

Bước 3: Sau đó, khởi tạo hàm tạo

pygame.init()

Bước 4: Thiết lập kích thước cho trò chơi GUI của bạn.

w, h = #Width dimension, #Height dimension
screen = pygame.display.set_mode((w, h))

Bước 5: Thiết lập giá trị chạy để chạy trò chơi, góc mà trò chơi có thể di chuyển.

running = True
angle = 0
scale = 1

Bước 6: Tiếp theo, lấy hình ảnh làm đầu vào mà chúng ta muốn di chuyển bằng chuột

img_logo = pygame.image.load('#Enter the image url')
img_logo.convert()

Bước 7: Vẽ đường viền xung quanh hình ảnh.

rect_logo = img_logo.get_rect()
pygame.draw.rect(img_logo, color_1, rect_logo, 1)

Bước 8: Xác định vị trí trung tâm của trò chơi GUI và vị trí của chuột.

center = w//2, h//2
mouse = pygame.mouse.get_pos()

Bước 9: Lưu trữ hình ảnh trong một biến mới và tạo một hình chữ nhật xung quanh hình ảnh.

img = img_logo
rect = img.get_rect()
rect.center = center

Bước 10: Thiết lập những việc bạn muốn ứng dụng thực hiện khi ở trạng thái chạy.

while running:
    for event in pygame.event.get():
  • Bước 10.1: Khi ứng dụng đang chạy, hãy thoát ứng dụng nếu người dùng muốn thoát.

        if event.type == QUIT:
            running = False
  • Bước 10.2: Trong trường hợp người dùng không muốn thoát, hãy thiết lập góc xoay của hình ảnh.

        if event.type == KEYDOWN:
            if event.key == K_ra:
                if event.mod & KMOD_SHIFT:
                
                    # angle at which it should move left
                    angle -= 
                else:
                
                    # angle at which it should move right
                    angle += 
  • Bước 10.3: Ngoài ra, hãy thiết lập tỷ lệ kích thước hình ảnh sẽ giảm hoặc tăng.

            elif event.key == K_sa:
                if event.mod & KMOD_SHIFT:
                    scale /= #scale at which the image size should decrease
                else:
                    scale *= #scale at which the image size should increase
  • Bước 10.4: Thiết lập tọa độ, góc và tỷ lệ để hình ảnh sẽ xoay hoặc thay đổi kích thước.

        elif event.type == MOUSEMOTION:
  • Bước 10.4.1: Lưu trữ vị trí hiện tại của sự kiện trong biến mới.

            mouse = event.pos
  • Bước 10.4.2: Xác định tọa độ Descartes bằng cách sử dụng biến chuột và tâm của hình ảnh để xoay hình ảnh.

            x = mouse[0] - center[0]
            y = mouse[1] - center[1]
  • Bước 10.4.3: Tiếp theo, tính khoảng cách giữa hai điểm (0,0) và (x, y) bằng công thức √x 2 +y 2  

            d = math.sqrt(x ** 2 + y ** 2)
  • Bước 10.4.4: Bây giờ, hãy tính góc theo độ mà hình ảnh sẽ xoay bằng phương thức Python math.atan2() trả về arctangent của y/x, tính bằng radian.

            angle = math.degrees(-math.atan2(y, x))
  • Bước 10.4.5: Tính toán kích thước hình ảnh nên giảm hay tăng theo tỷ lệ nào bằng hàm abs , hàm này trả về độ lớn của số.

            scale = abs(5 * d / w)
  • Bước 10.4.6: Tính toán vị trí cập nhật của hình ảnh ở trạng thái chạy bằng hàm rotozoom, là phép biến đổi tỷ lệ và xoay kết hợp.

            img = pygame.transform.rotozoom(img_logo, angle, scale)
  • Bước 10.4.7: Xây dựng hình chữ nhật xung quanh hình ảnh đã cập nhật

            rect = img.get_rect()
            rect.center = center

Bước 11: Tiếp theo, bạn cần thiết lập màu màn hình và hình ảnh trên màn hình.

    screen.fill(color_3)
    screen.blit(img, rect)

SBước 12: Sau đó, vẽ hình chữ nhật , đường thẳng và hình tròn để giúp di chuyển hình ảnh.

    pygame.draw.rect(screen, color_2, rect, #thickness of rectangle)
    pygame.draw.line(screen, color_3, center, mouse, #Thickness of line)
    pygame.draw.circle(screen, color_1, center, #radius of circle, #thickness of circumference)
    pygame.draw.circle(screen, color_2, mouse, #radius of circle, #thickness of circumference)

Bước 13: Ngoài ra, hãy cập nhật những thay đổi đã thực hiện trong trò chơi GUI.

  pygame.display.update()

Bước 14: Cuối cùng, thoát khỏi trò chơi GUI.

pygame.quit()

Dưới đây là cách thực hiện.

# Chương trình Python để biến đổi hình ảnh bằng chuột

# Import các thư viện pygame và math
import pygame
import math
from pygame.locals import *

# Khai báo các màu sử dụng
RED = (255, 0, 0)
BLACK = (0, 0, 0)
YELLOW = (255, 255, 0)

# Khởi tạo giao diện trò chơi
pygame.init()

# Cài đặt kích thước cửa sổ
w, h = 600, 440
screen = pygame.display.set_mode((w, h))

# Khởi tạo trạng thái ban đầu
running = True
angle = 0         # góc xoay ban đầu
scale = 1         # tỉ lệ phóng to/thu nhỏ ban đầu

# Tải ảnh từ file
img_logo = pygame.image.load('gfg_image.jpg')
img_logo.convert()

# Vẽ khung viền đỏ quanh hình ảnh
rect_logo = img_logo.get_rect()
pygame.draw.rect(img_logo, RED, rect_logo, 1)

# Xác định vị trí trung tâm và lấy tọa độ chuột
center = w // 2, h // 2
mouse = pygame.mouse.get_pos()

# Lưu ảnh gốc vào biến mới và tạo khung bao quanh ảnh
img = img_logo
rect = img.get_rect()
rect.center = center

# Vòng lặp game chính
while running:
    for event in pygame.event.get():

        # Thoát khỏi game khi người dùng bấm nút đóng
        if event.type == QUIT:
            running = False

        # Xử lý sự kiện nhấn phím
        if event.type == KEYDOWN:

            # Nếu nhấn phím 'ra' để thay đổi góc quay ảnh
            if event.key == K_ra:
                if event.mod & KMOD_SHIFT:
                    angle -= 5
                else:
                    angle += 5

            # Nếu nhấn phím 'sa' để thay đổi tỉ lệ ảnh
            elif event.key == K_sa:
                if event.mod & KMOD_SHIFT:
                    scale /= 1.5
                else:
                    scale *= 1.5

        # Khi di chuyển chuột, tính toán lại góc và tỉ lệ để biến đổi ảnh
        elif event.type == MOUSEMOTION:
            mouse = event.pos
            x = mouse[0] - center[0]
            y = mouse[1] - center[1]
            d = math.sqrt(x ** 2 + y ** 2)
            angle = math.degrees(-math.atan2(y, x))  # Tính góc xoay từ tâm đến chuột
            scale = abs(5 * d / w)                   # Tính tỉ lệ dựa trên khoảng cách từ tâm đến chuột
            img = pygame.transform.rotozoom(img_logo, angle, scale)  # Xoay và phóng ảnh
            rect = img.get_rect()
            rect.center = center

    # Đặt màu nền và vẽ ảnh đã biến đổi
    screen.fill(YELLOW)
    screen.blit(img, rect)

    # Vẽ các hình hỗ trợ trực quan: khung ảnh, đường thẳng, tâm, vị trí chuột
    pygame.draw.rect(screen, BLACK, rect, 3)
    pygame.draw.line(screen, RED, center, mouse, 2)
    pygame.draw.circle(screen, RED, center, 6, 1)
    pygame.draw.circle(screen, BLACK, mouse, 6, 2)

    # Cập nhật cửa sổ game
    pygame.display.update()

# Thoát khỏi game
pygame.quit()

Đầu ra:


Published on Jul 28, 2025

Related Posts