Pygame zapewnia kilka wbudowanych funkcji do wykrywania kolizji między obiektami gry. Są one nieocenione, ponieważ dokładne ustalenie, kiedy i jak poruszające się obiekty zachodzą na siebie, może być skomplikowanym zadaniem.
dlaczego moja wiadomość nie jest dostarczona?
Dowiedz się, jak dodać podstawową fizykę i kolizje do swojej gry za pomocą modułu pygame.
Wbudowane funkcje wykrywania kolizji Pygame
Najbardziej podstawową wbudowaną funkcją wykrywania kolizji jest spritecollide. Przyjmuje duszka, grupę duszków i wartość logiczną wskazującą, czy duszki powinny „umrzeć” (zostać usunięte), gdy się zderzą. Ta funkcja zwraca listę duszków, które się zderzyły. Oto przykład, jak go używać:
collided_sprites = pygame.sprite.spritecollide(sprite1, sprite_group, True)
Inną użyteczną funkcją wykrywania kolizji jest groupcollide, która pobiera dwie grupy sprite'ów oraz wartość logiczną. Ta funkcja zwraca słownik ze zderzonymi sprite'ami jako kluczami i sprite'ami, z którymi się zderzyły jako wartościami. Oto przykład, jak go używać:
collision_dict = pygame.sprite.groupcollide(group1, group2, True, True)
Tworzenie podstawowej gry platformowej przy użyciu funkcji spritecollide
Aby stworzyć podstawową grę platformową za pomocą Pygame, musisz stworzyć sprite'a gracza, którego użytkownik może kontrolować, oraz sprite'a platformy, na którym gracz będzie mógł stanąć. Możesz użyć funkcji spritecollide, aby wykryć, kiedy sprite gracza zderza się z duszkiem platformy i zapobiec upadkowi gracza przez platformę.
Zacząć, zainstaluj moduł pygame za pomocą pip :
pip install pygame
Po tym, tworzyć proste klasy dla Gracza i Platformy, z których oba powinny dziedziczyć po klasie Sprite Pygame. Klasa Player powinna mieć metodę aktualizacji do obsługi pozycji gracza na podstawie prędkości. Powinien również mieć zmienną y_velocity, aby zastosować efekt grawitacji. Klasa Platform powinna mieć metodę __init__, która pobiera współrzędne platformy i tworzy powierzchnię o takim rozmiarze.
Klasa gracza
Możesz stworzyć klasę Player używając modułu pygame.sprite.Sprite. Ta klasa zainicjuje gracza z podanymi współrzędnymi x i y. Następnie metoda update zaktualizuje pozycję gracza poprzez zwiększenie wartości y_velocity.
jak wyłączyć mikrofon w systemie Windows 10
import pygame
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
Klasa platformy
Klasa Platform korzysta również z modułu pygame.sprite.Sprite. Ta klasa zainicjuje platformę z podanymi współrzędnymi x i y, a także szerokością i wysokością.
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))
Pętla gry
Pętla gry pozwoli Ci stworzyć okno o rozmiarze 640x480. Następnie uruchomi pętlę, która sprawdzi wszelkie zdarzenia, takie jak polecenie wyjścia. Sprawdzi również, czy nie ma kolizji między graczem a platformą. Na koniec wypełni ekran białym kolorem, narysuje gracza i platformę, a następnie odwróci wyświetlacz.
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)
# Initialize pygame and create window
pygame.init()
screen = pygame.display.set_mode((640, 480))
# Main game loop
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()
Poniżej znajduje się wyjście:
Wdrażanie grawitacji i skakania
Aby zaimplementować zachowanie grawitacji i skakania w grze platformowej, musisz dodać prędkość y do duszka gracza i zaktualizować jego pozycję y w każdej klatce. Aby to zrobić, możesz użyć metody update wewnątrz klasy Player i dodać następujący fragment kodu:
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 # Apply gravity to y velocity
Teraz za każdym razem, gdy wywołasz metodę aktualizacji, zaktualizuje ona pozycję gracza zgodnie z jego prędkością i grawitacją.
Aby duszek gracza skakał, możesz powiązać akcję skakania z określonym klawiszem lub przyciskiem i zaktualizować prędkość y gracza o wartość ujemną. Poniższy fragment kodu jest przykładem skoku, gdy gracz naciśnie spację.
JUMP_VELOCITY = -10
# inside the game loop
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
player.y_velocity = JUMP_VELOCITY
Pamiętaj, że przed sprawdzeniem wartości klucza będziesz musiał sprawdzić event.type, aby upewnić się, że zdarzenie jest zdarzeniem KEYDOWN.
Dodawanie podstaw fizyki, takich jak tarcie i przyspieszenie
Aby dodać podstawową fizykę, taką jak tarcie i przyspieszenie, do swojej gry platformowej, musisz zaktualizować prędkość x duszka gracza w każdej klatce. Możesz dodać prędkość x do klasy gracza i zaktualizować ją w taki sam sposób, jak prędkość y. Aby zaimplementować tarcie, możesz zmniejszyć prędkość x duszka gracza o niewielką wartość w każdej klatce. Na przykład możesz dodać następujący fragment kodu do metody aktualizacji klasy Player:
FRICTION = 0.9
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
self.x_velocity = 0
def update(self):
self.rect.y += self.y_velocity
self.rect.x += self.x_velocity
self.y_velocity += GRAVITY # Apply gravity to y velocity
self.x_velocity *= FRICTION # Apply friction to x velocity
Aby zaimplementować przyspieszenie, możesz ustawić zmienną player_movement dla ruchu poziomego i zaktualizować prędkość x duszka gracza zgodnie z wartością player_movement. Możesz to zrobić, powiązując ruch z określonymi klawiszami lub przyciskami i aktualizując prędkość x gracza w pętli zdarzeń, na przykład:
ACCELERATION = 0.5
player_movement = 0
if 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
Korzystając z tych technik, możesz stworzyć prostą, ale zabawną grę platformową, korzystając z wbudowanych funkcji wykrywania kolizji i podstawowej fizyki Pygame. Przy odrobinie kreatywności i eksperymentowania możesz użyć tych technik do stworzenia wielu różnych gier i mechanizmów gry.
Cały kod można znaleźć w Repozytorium GitHub .
Poniżej znajduje się wyjście:
jak założyć pasek na zegarek Apple Watch
Popraw zaangażowanie użytkowników dzięki kolizjom
Wiele gier wymaga jakiejś formy wykrywania kolizji. Możesz używać kolizji do tworzenia szerokiej gamy mechanizmów gry, od prostych platformówek po złożone symulacje oparte na fizyce.
Wdrożenie podstawowych fizyki, takich jak grawitacja, tarcie i przyspieszenie, może również znacznie poprawić zaangażowanie użytkownika, dodając realizmu i poczucia wagi obiektom gry.