Implementacja podstawowej fizyki i wykrywania kolizji w Pygame

Implementacja podstawowej fizyki i wykrywania kolizji w Pygame
Czytelnicy tacy jak ty pomagają wspierać MUO. Kiedy dokonujesz zakupu za pomocą linków na naszej stronie, możemy otrzymać prowizję partnerską. Czytaj więcej.

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:

  prosta gra platformowa wykorzystująca pygame

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
  prosta gra platformowa z grawitacją i przyspieszeniem

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.