Pygame - Điều khiển Sprite

Category: Pygame

Trong bài viết này, chúng ta sẽ thảo luận về cách điều khiển sprite, chẳng hạn như di chuyển về phía trước, lùi lại, làm chậm hoặc tăng tốc, và một số thuộc tính mà sprite nên có. Chúng ta sẽ thêm các trình xử lý sự kiện vào chương trình để phản hồi các sự kiện nhấn phím. Khi người chơi sử dụng các phím mũi tên trên bàn phím, chúng ta sẽ gọi các phương thức thuần túy để di chuyển đối tượng trên màn hình.

Các chức năng được sử dụng

  • moveRight(): Phương thức này nhận tham số pixel, nghĩa là số pixel cần di chuyển một đối tượng theo đúng hướng. Về cơ bản, phương thức này cộng pixel vào tọa độ x hiện tại của đối tượng.

  • moveLeft(): Phương thức này nhận tham số pixel, nghĩa là số pixel mà một đối tượng cần được di chuyển sang trái. Về cơ bản, phương thức này trừ pixel vào tọa độ x hiện tại của đối tượng.

  • moveForward(): Phương thức này nhận một đối số là speed, nghĩa là tốc độ sẽ tăng lên bao nhiêu lần. Về cơ bản, phương thức này tăng tốc độ theo hệ số n theo hướng y của đối tượng.

  • moveBackward(): Phương thức này nhận một đối số là speed, nghĩa là tốc độ sẽ giảm theo bao nhiêu hệ số . Về cơ bản, phương thức này giảm tốc độ theo hệ số n theo hướng y của vật thể.

Trước tiên, chúng ta hãy xem xét cách triển khai lớp Sprite, lớp này giúp chúng ta tạo đối tượng trên bề mặt PyGame và cùng với 4 phương thức bổ sung giúp chúng ta di chuyển về phía trước, phía sau, sang phải và sang trái.

Ví dụ: Lớp Sprite

import pygame

# Biến Toàn Cầu
COLOR = (255, 100, 98)
SURFACE_COLOR = (167, 255, 100)
WIDTH = 500
HEIGHT = 500

# lớp đối tượng
class Sprite(pygame.sprite.Sprite):
    def __init__(self, color, height, width):
        super().__init__()

        self.image = pygame.Surface([width, height])
        self.image.fill(SURFACE_COLOR)
        self.image.set_colorkey(COLOR)

        pygame.draw.rect(self.image,
                         color,
                         pygame.Rect(0, 0, width, height))

        self.rect = self.image.get_rect()

    def moveRight(self, pixels):
        self.rect.x += pixels

    def moveLeft(self, pixels):
        self.rect.x -= pixels

    def moveForward(self, speed):
        self.rect.y += speed * speed/10

    def moveBack(self, speed):
        self.rect.y -= speed * speed/10

Bây giờ chúng ta sẽ xem cách kiểm soát vòng lặp chương trình chính để xử lý các sprite. Phần đầu tiên của vòng lặp sẽ phản hồi các sự kiện như tương tác khi người dùng sử dụng chuột hoặc bàn phím. Sau đó, các phương thức xử lý sự kiện trên đối tượng của chúng ta sẽ được xử lý. Mỗi trình xử lý sự kiện sẽ gọi phương thức tương ứng từ lớp Sprite.

Trong đoạn mã này, chúng ta có quyền điều khiển đối tượng, tức là đối tượng của chúng ta là một đối tượng theo hướng được chỉ định. Nếu chúng ta nhấn phím mũi tên phải, nó sẽ di chuyển theo hướng đó và tương tự với tất cả các phím mũi tên. Ở đây, chúng ta sử dụng phương thức pygame.KEYDOWN để khởi tạo phương thức sử dụng các phím mũi tên để điều khiển đối tượng. Sau đó, chúng ta phải điều khiển phương thức tương ứng để kích hoạt phím cụ thể để thực hiện hành động cụ thể.

Ví dụ, nếu chúng ta có phím mũi tên phải, chúng ta phải gọi phương thức pygame.K_RIGHT để di chuyển về bên phải theo hướng của đối tượng và tương tự đối với phương thức pygame.K_DOWN được sử dụng để di chuyển lên theo hướng của đối tượng.

Ví dụ: Kiểm soát sprite 

import random
import pygame

# Biến Toàn Cầu
COLOR = (255, 100, 98)
SURFACE_COLOR = (167, 255, 100)
WIDTH = 500
HEIGHT = 500

# Lớp đối tượng
class Sprite(pygame.sprite.Sprite):
    def __init__(self, color, height, width):
        super().__init__()

        self.image = pygame.Surface([width, height])
        self.image.fill(SURFACE_COLOR)
        self.image.set_colorkey(COLOR)

        pygame.draw.rect(self.image,
                         color,
                         pygame.Rect(0, 0, width, height))

        self.rect = self.image.get_rect()

    def moveRight(self, pixels):
        self.rect.x += pixels

    def moveLeft(self, pixels):
        self.rect.x -= pixels

    def moveForward(self, speed):
        self.rect.y += speed * speed/10

    def moveBack(self, speed):
        self.rect.y -= speed * speed/10


pygame.init()


RED = (255, 0, 0)


size = (WIDTH, HEIGHT)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Creating Sprite")


all_sprites_list = pygame.sprite.Group()

playerCar = Sprite(RED, 20, 30)
playerCar.rect.x = 200
playerCar.rect.y = 300


all_sprites_list.add(playerCar)

exit = True
clock = pygame.time.Clock()

while exit:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_x:
                exit = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        playerCar.moveLeft(10)
    if keys[pygame.K_RIGHT]:
        playerCar.moveRight(10)
    if keys[pygame.K_DOWN]:
        playerCar.moveForward(10)
    if keys[pygame.K_UP]:
        playerCar.moveBack(10)

    all_sprites_list.update()
    screen.fill(SURFACE_COLOR)
    all_sprites_list.draw(screen)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Đầu ra:

Published on Jul 28, 2025

Related Posts