Triển khai Vật lý cơ bản và Phát hiện va chạm trong Pygame
Pygame cung cấp một số chức năng tích hợp để phát hiện xung đột giữa các đối tượng trò chơi. Đây là những điều vô giá vì tìm ra chính xác thời điểm và cách thức các đối tượng chuyển động chồng lên nhau có thể là một nhiệm vụ phức tạp.
Tìm hiểu cách thêm vật lý cơ bản và va chạm vào trò chơi của bạn bằng cách sử dụng mô-đun pygame.
Mục Lục
Các chức năng phát hiện va chạm tích hợp của Pygame
Chức năng phát hiện va chạm tích hợp cơ bản nhất là spritecollide. Nó nhận một sprite, một nhóm các sprite và một giá trị boolean cho biết liệu các sprite có nên “chết” (bị xóa) khi chúng va chạm hay không. Hàm này trả về một danh sách các họa tiết đã va chạm. Đây là một ví dụ về cách sử dụng nó:
collided_sprites = pygame.sprite.spritecollide(sprite1, sprite_group, True)
Một chức năng phát hiện va chạm hữu ích khác là va chạm nhóm, bao gồm hai nhóm họa tiết và một giá trị boolean. Hàm này trả về một từ điển với các sprite bị va chạm làm khóa và các sprite mà chúng va chạm với làm giá trị. Đây là một ví dụ về cách sử dụng nó:
collision_dict = pygame.sprite.groupcollide(group1, group2, True, True)
Tạo trò chơi platformer cơ bản bằng chức năng spritecollide
Để tạo một trò chơi platformer cơ bản bằng Pygame, bạn sẽ cần tạo một nhân vật người chơi mà người dùng có thể điều khiển và một nhân vật nền tảng để người chơi đứng trên đó. Bạn có thể sử dụng chức năng spritecollide để phát hiện khi sprite của người chơi va chạm với sprite của nền tảng và ngăn người chơi rơi qua nền tảng.
Để bắt đầu, hãy cài đặt mô-đun pygame bằng pip:
pip install pygame
Sau đó, tạo các lớp đơn giản cho Trình phát và Nền tảng, cả hai lớp này sẽ kế thừa từ lớp Sprite của Pygame. Lớp Người chơi phải có một phương thức cập nhật để xử lý vị trí của người chơi dựa trên vận tốc. Ngoài ra, nó phải có biến y_velocity để áp dụng hiệu ứng trọng lực. Lớp Nền tảng phải có phương thức __init__ lấy tọa độ của nền tảng và tạo bề mặt có kích thước đó.
lớp người chơi
Bạn có thể tạo một lớp Người chơi bằng mô-đun pygame.sprite.Sprite. Lớp này sẽ khởi tạo trình phát với tọa độ x và y cho trước. Sau đó, phương thức cập nhật sẽ cập nhật vị trí của người chơi bằng cách tăng giá trị y_velocity.
import pygameclass Player(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((32, 32))
self.rect = self.image.get_rect(topleft=(x, y))
self.y_velocity = 0
def update(self):
self.rect.y += self.y_velocity
Lớp nền tảng
Lớp Nền tảng cũng sử dụng mô-đun pygame.sprite.Sprite. Lớp này sẽ khởi tạo nền tảng với tọa độ x và y đã cho, cũng như chiều rộng và chiều cao.
class Platform(pygame.sprite.Sprite):
def __init__(self, x, y, width, height):
super().__init__()
self.image = pygame.Surface((width, height))
self.rect = self.image.get_rect(topleft=(x, y))
Vòng lặp trò chơi
Vòng lặp trò chơi sẽ cho phép bạn tạo một cửa sổ có kích thước 640×480. Sau đó, nó sẽ chạy một vòng lặp để kiểm tra bất kỳ sự kiện nào, chẳng hạn như lệnh thoát. Nó cũng sẽ kiểm tra mọi va chạm giữa người chơi và nền tảng. Cuối cùng, nó sẽ lấp đầy màn hình bằng một màu trắng, vẽ trình phát và nền tảng, sau đó lật màn hình.
player = Player(100, 300)
player_group = pygame.sprite.Group()
player_group.add(player)platform = Platform(50, 400, 100, 20)
platform_group = pygame.sprite.Group()
platform_group.add(platform)
pygame.init()
screen = pygame.display.set_mode((640, 480))
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
player_group.update()
collided = pygame.sprite.spritecollide(player, platform_group, False)
if collided:
player.y_velocity = 0
screen.fill((255, 255, 255))
player_group.draw(screen)
platform_group.draw(screen)
pygame.display.flip()
pygame.quit()
Dưới đây là đầu ra:
Thực hiện hành vi trọng lực và nhảy
Để thực hiện hành vi trọng lực và nhảy trong trò chơi platformer của bạn, bạn sẽ cần thêm vận tốc ay vào nhân vật người chơi của mình và cập nhật vị trí y của nó trong mỗi khung hình. Để làm điều này, bạn có thể sử dụng phương thức update bên trong lớp Player và thêm đoạn mã sau:
class Player(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((32, 32))
self.rect = self.image.get_rect(topleft=(x, y))
self.y_velocity = 0 def update(self):
self.rect.y += self.y_velocity
self.y_velocity += GRAVITY
Giờ đây, mỗi khi bạn gọi phương thức cập nhật, nó sẽ cập nhật vị trí của người chơi theo vận tốc và trọng lực của nó.
Để làm cho nhân vật người chơi nhảy, bạn có thể liên kết hành động nhảy với một phím hoặc nút cụ thể và cập nhật vận tốc y của người chơi bằng một giá trị âm. Đoạn mã sau đây là một ví dụ về cách nhảy khi người chơi nhấn phím cách.
JUMP_VELOCITY = -10
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
player.y_velocity = JUMP_VELOCITY
Lưu ý rằng bạn sẽ cần kiểm tra event.type để đảm bảo rằng sự kiện này là sự kiện KEYDOWN trước khi kiểm tra giá trị khóa.
Thêm vật lý cơ bản như ma sát và gia tốc
Để thêm vật lý cơ bản như ma sát và gia tốc vào trò chơi platformer của bạn, bạn sẽ cần cập nhật vận tốc x của nhân vật người chơi trong mỗi khung hình. Bạn có thể thêm vận tốc x vào lớp người chơi và cập nhật nó theo cách tương tự như vận tốc y. Để thực hiện ma sát, bạn có thể giảm một lượng nhỏ vận tốc x của nhân vật người chơi trong mỗi khung hình. Ví dụ: bạn có thể thêm đoạn mã sau vào bên trong phương thức cập nhật của lớp Người chơi:
FRICTION = 0.9class Player(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((32, 32))
self.rect = self.image.get_rect(topleft=(x, y))
self.y_velocity = 0
self.x_velocity = 0
def update(self):
self.rect.y += self.y_velocity
self.rect.x += self.x_velocity
self.y_velocity += GRAVITY
self.x_velocity *= FRICTION
Để thực hiện tăng tốc, bạn có thể đặt một biến, player_movement, cho chuyển động ngang và cập nhật vận tốc x của nhân vật người chơi theo giá trị player_movement. Bạn có thể làm điều này bằng cách liên kết chuyển động với các phím hoặc nút cụ thể và cập nhật vận tốc x của người chơi trong vòng lặp sự kiện, chẳng hạn:
ACCELERATION = 0.5
player_movement = 0if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
player_movement = -1
elif event.key == pygame.K_RIGHT:
player_movement = 1
elif event.type == pygame.KEYUP:
if event.key in (pygame.K_LEFT, pygame.K_RIGHT):
player_movement = 0
player.x_velocity += player_movement * ACCELERATION
Bằng cách sử dụng các kỹ thuật này, bạn có thể tạo một trò chơi platformer đơn giản nhưng thú vị bằng cách sử dụng các chức năng phát hiện va chạm tích hợp sẵn của Pygame và vật lý cơ bản. Với một chút sáng tạo và thử nghiệm, bạn có thể sử dụng những kỹ thuật này để tạo ra nhiều trò chơi và cơ chế trò chơi khác nhau.
Bạn có thể tìm thấy mã hoàn chỉnh trong kho lưu trữ GitHub.
Dưới đây là đầu ra:
Cải thiện mức độ tương tác của người dùng với va chạm
Nhiều trò chơi yêu cầu một số hình thức phát hiện va chạm. Bạn có thể sử dụng va chạm để tạo ra nhiều loại cơ chế trò chơi, từ trò chơi xếp hình đơn giản đến mô phỏng dựa trên vật lý phức tạp.
Việc triển khai các vật lý cơ bản như trọng lực, ma sát và gia tốc cũng có thể cải thiện đáng kể mức độ tương tác của người dùng, tăng thêm tính hiện thực và cảm giác về trọng lượng cho các đối tượng trong trò chơi.