Čtenáři jako vy pomáhají podporovat MUO. Když provedete nákup pomocí odkazů na našich stránkách, můžeme získat provizi přidružené společnosti. Přečtěte si více.

Pygame poskytuje několik vestavěných funkcí pro detekci kolizí mezi herními objekty. Ty jsou neocenitelné, protože zjistit, kdy a jak přesně se pohybující se objekty překrývají, může být komplikovaný úkol.

Naučte se, jak přidat základní fyziku a kolize do vaší hry pomocí modulu pygame.

Vestavěné funkce detekce kolize v Pygame

Nejzákladnější vestavěnou funkcí detekce kolize je spritecollide. Zahrnuje skřítka, skupinu skřítků a booleovskou hodnotu udávající, zda mají skřítci „umřít“ (být odstraněni), když se srazí. Tato funkce vrací seznam spritů, které kolidovaly. Zde je příklad použití:

collided_sprites = pygame.sprite.spritecollide (sprite1, sprite_group, Skutečný)

Další užitečnou funkcí detekce kolize je groupcollide, která přijímá dvě skupiny spritů a také booleovskou hodnotu. Tato funkce vrací slovník s kolidovanými sprity jako klíči a sprity, se kterými kolidovaly, jako hodnotami. Zde je příklad použití:

instagram viewer
crash_dict = pygame.sprite.groupcollide (skupina1, skupina2, Skutečný, Skutečný)

Vytvoření základní plošinovky pomocí funkce spritecollide

Chcete-li vytvořit základní plošinovkovou hru pomocí Pygame, budete muset vytvořit skřítka hráče, kterého může uživatel ovládat, a skřítka platformy, na kterém bude hráč stát. Funkci spritecollide můžete použít k detekci, kdy se hráčský sprite srazí s platformovým spritem, a zabránit hráči v pádu skrz platformu.

Začít, nainstalujte modul pygame pomocí pip:

pip nainstalovat pygame

Potom, vytvářet jednoduché třídy pro hráče a platformu, které by obě měly zdědit od třídy Sprite v Pygame. Třída Player by měla mít metodu aktualizace pro zpracování pozice hráče na základě rychlosti. Také by měl mít proměnnou y_velocity, aby se použil gravitační efekt. Třída Platform by měla mít metodu __init__, která vezme souřadnice platformy a vytvoří povrch s touto velikostí.

Třída hráče

Třídu Player můžete vytvořit pomocí pygame.sprite. Modul Sprite. Tato třída inicializuje přehrávač s danými souřadnicemi x a y. Poté metoda aktualizace aktualizuje pozici hráče zvýšením hodnoty y_velocity.

import pygame

třídaHráč(pygame.sprite. Skřítek):
def__init__(já, x, y):
super().__init__()
self.image = pygame. Povrch((32, 32))
self.rect = self.image.get_rect (vlevo nahoře=(x, y))
self.y_velocity = 0

defAktualizace(já):
self.rect.y += self.y_velocity

Třída platformy

Třída Platform také používá pygame.sprite. Modul Sprite. Tato třída inicializuje platformu s danými souřadnicemi x a y, stejně jako šířkou a výškou.

třídaPlošina(pygame.sprite. Skřítek):
def__init__(vlastní, x, y, šířka, výška):
super().__init__()
self.image = pygame. Povrch ((šířka, výška))
self.rect = self.image.get_rect (vlevo nahoře=(x, y))

The Game Loop

Herní smyčka vám umožní vytvořit okno o velikosti 640x480. Poté spustí smyčku, která zkontroluje všechny události, jako je například příkaz quit. Zkontroluje také případné kolize mezi hráčem a platformou. Nakonec vyplní obrazovku bílou barvou, nakreslí přehrávač a platformu a poté převrátí displej.

hráč = hráč (100, 300)
player_group = pygame.sprite. Skupina()
player_group.add (hráč)

platforma = platforma(50, 400, 100, 20)
platform_group = pygame.sprite. Skupina()
platform_group.add (platforma)

# Inicializujte pygame a vytvořte okno
pygame.init()
obrazovka = pygame.display.set_mode((640, 480))

# Hlavní herní smyčka
běh = Skutečný

zatímco běh:
pro událost v pygame.event.get():
-li event.type == pygame. PŘESTAT:
běh = Nepravdivé

player_group.update()
collided = pygame.sprite.spritecollide (hráč, skupina platform, Nepravdivé)

-li srazilo se:
player.y_velocity = 0
screen.fill((255, 255, 255))
player_group.draw (obrazovka)
platform_group.draw (obrazovka)
pygame.display.flip()

pygame.quit()

Níže je výstup:

Implementace chování gravitace a skákání

Chcete-li ve své platformové hře implementovat chování gravitace a skákání, budete muset přidat rychlost y svému hráčskému sprite a aktualizovat jeho polohu y v každém snímku. Chcete-li to provést, můžete použít metodu aktualizace uvnitř třídy Player a přidat následující fragment kódu:

třídaHráč(pygame.sprite. Skřítek):
def__init__(já, x, y):
super().__init__()
self.image = pygame. Povrch((32, 32))
self.rect = self.image.get_rect (vlevo nahoře=(x, y))
self.y_velocity = 0

defAktualizace(já):
self.rect.y += self.y_velocity
self.y_velocity += GRAVITA # Aplikujte gravitaci na rychlost y

Nyní pokaždé, když zavoláte metodu aktualizace, aktualizuje pozici hráče podle své rychlosti a gravitace.

Chcete-li, aby sprite hráče skákal, můžete akci skákání svázat s konkrétní klávesou nebo tlačítkem a aktualizovat hráčovu rychlost y zápornou hodnotou. Následující fragment kódu je příkladem toho, jak přeskočit, když hráč stiskne mezerník.

JUMP_VELOCITY = -10

# uvnitř herní smyčky
-li event.type == pygame. KEYDOWN a event.key == pygame. K_SPACE:
player.y_velocity = JUMP_VELOCITY

Všimněte si, že před kontrolou hodnoty klíče budete muset zkontrolovat event.type, abyste se ujistili, že událost je událost KEYDOWN.

Přidání základní fyziky, jako je tření a zrychlení

Chcete-li do své plošinovky přidat základní fyziku, jako je tření a zrychlení, budete muset v každém snímku aktualizovat rychlost x svého hráče. Můžete přidat x velocity do třídy hráče a aktualizovat ji stejným způsobem jako y velocity. Chcete-li implementovat tření, můžete snížit x velocity skřítka hráče o malé množství v každém snímku. Do metody aktualizace třídy Player můžete například přidat následující fragment kódu:

TŘENÍ = 0.9

třídaHráč(pygame.sprite. Skřítek):
def__init__(já, x, y):
super().__init__()
self.image = pygame. Povrch((32, 32))
self.rect = self.image.get_rect (vlevo nahoře=(x, y))
self.y_velocity = 0
self.x_velocity = 0

defAktualizace(já):
self.rect.y += self.y_velocity
self.rect.x += self.x_velocity
self.y_velocity += GRAVITA # Aplikujte gravitaci na rychlost y
self.x_velocity *= TŘENÍ # Použijte tření na rychlost x

Chcete-li implementovat zrychlení, můžete nastavit proměnnou player_movement pro horizontální pohyb a aktualizovat x rychlost sprajtu hráče podle hodnoty player_movement. Můžete to udělat tak, že pohyb navážete na konkrétní klávesy nebo tlačítka a aktualizujete x velocity hráče ve smyčce událostí, například:

AKCELERACE = 0.5
hráčský_pohyb = 0

-li event.type == pygame. KEYDOWN:
-li event.key == pygame. K_LEFT:
hráčský_pohyb = -1
elif event.key == pygame. K_RIGHT:
hráčský_pohyb = 1
elif event.type == pygame. KEYUP:
-li klíč události v (pygame. K_LEFT, pygame. K_RIGHT):
hráčský_pohyb = 0

player.x_velocity += player_movement * ACCELERATION

Pomocí těchto technik můžete vytvořit jednoduchou, ale zábavnou plošinovku pomocí vestavěných funkcí detekce kolizí a základní fyziky Pygame. S trochou kreativity a experimentování můžete tyto techniky použít k vytvoření řady různých her a herních mechanismů.

Kompletní kód najdete v úložiště GitHub.

Níže je výstup:

Zlepšete zapojení uživatelů s kolizemi

Mnoho her vyžaduje určitou formu detekce kolize. Pomocí kolizí můžete vytvořit širokou škálu herních mechanismů, od jednoduchých plošinovek až po složité simulace založené na fyzice.

Implementace základní fyziky, jako je gravitace, tření a zrychlení, může také výrazně zlepšit zapojení uživatelů a přidat herním objektům realismus a pocit hmotnosti.