Čitatelia ako vy pomáhajú podporovať MUO. Keď uskutočníte nákup pomocou odkazov na našej stránke, môžeme získať pridruženú províziu. Čítaj viac.

Pygame poskytuje niekoľko vstavaných funkcií na detekciu kolízií medzi hernými objektmi. Sú neoceniteľné, pretože presne určiť, kedy a ako sa pohybujúce sa objekty prekrývajú, môže byť komplikovaná úloha.

Naučte sa, ako pridať základnú fyziku a kolízie do vašej hry pomocou modulu pygame.

Zabudované funkcie detekcie kolízie Pygame

Najzákladnejšou vstavanou funkciou detekcie kolízie je spritecollide. Zahŕňa spritu, skupinu spritov a booleovskú hodnotu, ktorá označuje, či sprite majú alebo nemajú "zomrieť" (byť odstránené), keď sa zrazia. Táto funkcia vráti zoznam spritov, ktoré sa zrazili. Tu je príklad použitia:

collided_sprites = pygame.sprite.spritecollide (sprite1, sprite_group, Pravda)

Ďalšou užitočnou funkciou detekcie kolízií je groupcollide, ktorá obsahuje dve skupiny spritov a tiež booleovskú hodnotu. Táto funkcia vráti slovník s kolidovanými spritami ako kľúčmi a spritmi, s ktorými sa zrazili, ako hodnotami. Tu je príklad použitia:

instagram viewer
crash_dict = pygame.sprite.groupcollide (skupina1, skupina2, Pravda, Pravda)

Vytvorenie základnej plošinovky pomocou funkcie spritecollide

Ak chcete vytvoriť základnú plošinovkovú hru pomocou Pygame, budete musieť vytvoriť škriatka hráča, ktorého bude môcť používateľ ovládať, a škriatka platformy, na ktorom bude hráč stáť. Funkciu spritecollide môžete použiť na zistenie, kedy sa hráčsky sprite zrazí so spriteom na plošine, a zabrániť hráčovi prepadnúť cez plošinu.

Začať, nainštalujte modul pygame pomocou pip:

pip install pygame

Potom, vytvárať jednoduché triedy pre hráča a platformu, pričom obe by mali zdediť triedu Sprite od Pygame. Trieda Player by mala mať metódu aktualizácie na spracovanie pozície hráča na základe rýchlosti. Tiež by mala mať premennú y_velocity na uplatnenie gravitačného efektu. Trieda Platform by mala mať metódu __init__, ktorá preberá súradnice platformy a vytvára povrch s touto veľkosťou.

Trieda hráčov

Triedu hráča môžete vytvoriť pomocou súboru pygame.sprite. Modul Sprite. Táto trieda inicializuje prehrávač s danými súradnicami x a y. Potom metóda aktualizácie aktualizuje pozíciu hráča zvýšením hodnoty y_velocity.

importovať pygame

triedaHráč(pygame.sprite. sprite):
def__init__(ja, x, y):
super().__init__()
self.image = pygame. Povrch((32, 32))
self.rect = self.image.get_rect (vľavo hore=(x, y))
self.y_velocity = 0

defaktualizovať(ja):
self.rect.y += self.y_velocity

Trieda platformy

Trieda Platform tiež používa pygame.sprite. Modul Sprite. Táto trieda inicializuje platformu s danými súradnicami x a y, ako aj šírkou a výškou.

triedaPlošina(pygame.sprite. sprite):
def__init__(vlastné, x, y, šírka, výška):
super().__init__()
self.image = pygame. Povrch ((šírka, výška))
self.rect = self.image.get_rect (vľavo hore=(x, y))

The Game Loop

Herná slučka vám umožní vytvoriť okno s veľkosťou 640x480. Potom spustí slučku, ktorá skontroluje všetky udalosti, ako napríklad príkaz quit. Skontroluje tiež prípadné kolízie medzi prehrávačom a platformou. Nakoniec vyplní obrazovku bielou farbou, nakreslí prehrávač a platformu a potom prevráti 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 vytvorte okno
pygame.init()
obrazovka = pygame.display.set_mode((640, 480))

# Hlavná herná slučka
beh = Pravda

zatiaľ čo beh:
pre udalosť v pygame.event.get():
ak event.type == pygame. UKONČIŤ:
beh = Nepravdivé

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

ak zrazilo sa:
player.y_velocity = 0
screen.fill((255, 255, 255))
player_group.draw (obrazovka)
platform_group.draw (obrazovka)
pygame.display.flip()

pygame.quit()

Nižšie je výstup:

Implementácia gravitačného a skokového správania

Ak chcete implementovať gravitačné a skákacie správanie vo svojej platformovej hre, budete musieť pridať rýchlosť y do svojho hráčskeho sprite a aktualizovať jeho polohu y v každom snímku. Ak to chcete urobiť, môžete použiť metódu aktualizácie v triede Player a pridať nasledujúci útržok kódu:

triedaHráč(pygame.sprite. sprite):
def__init__(ja, x, y):
super().__init__()
self.image = pygame. Povrch((32, 32))
self.rect = self.image.get_rect (vľavo hore=(x, y))
self.y_velocity = 0

defaktualizovať(ja):
self.rect.y += self.y_velocity
self.y_velocity += GRAVITA # Použite gravitáciu na rýchlosť y

Teraz zakaždým, keď zavoláte metódu aktualizácie, aktualizuje pozíciu hráča podľa jeho rýchlosti a gravitácie.

Ak chcete prinútiť hráča skákať sprite, môžete akciu skákania naviazať na konkrétny kláves alebo tlačidlo a aktualizovať hráčovu rýchlosť y zápornou hodnotou. Nasledujúci úryvok kódu je príkladom toho, ako skočiť, keď hráč stlačí medzerník.

JUMP_VELOCITY = -10

# vo vnútri hernej slučky
ak event.type == pygame. KEYDOWN a event.key == pygame. K_SPACE:
player.y_velocity = JUMP_VELOCITY

Všimnite si, že pred kontrolou hodnoty kľúča budete musieť skontrolovať event.type, aby ste sa uistili, že udalosť je udalosťou KEYDOWN.

Pridanie základnej fyziky, ako je trenie a zrýchlenie

Ak chcete do svojej plošinovky pridať základnú fyziku, ako je trenie a zrýchlenie, budete musieť aktualizovať rýchlosť x vášho hráčskeho sprite v každom snímku. K triede hráča môžete pridať rýchlosť x a aktualizovať ju rovnakým spôsobom ako rýchlosť y. Ak chcete implementovať trenie, môžete znížiť rýchlosť x rýchlosti hráča sprite o malé množstvo v každom snímku. Do metódy aktualizácie triedy Player môžete napríklad pridať nasledujúci útržok kódu:

TRENIE = 0.9

triedaHráč(pygame.sprite. sprite):
def__init__(ja, x, y):
super().__init__()
self.image = pygame. Povrch((32, 32))
self.rect = self.image.get_rect (vľavo hore=(x, y))
self.y_velocity = 0
self.x_velocity = 0

defaktualizovať(ja):
self.rect.y += self.y_velocity
self.rect.x += self.x_velocity
self.y_velocity += GRAVITA # Použite gravitáciu na rýchlosť y
self.x_velocity *= TRENIE # Použite trenie na rýchlosť x

Ak chcete implementovať zrýchlenie, môžete nastaviť premennú player_movement pre horizontálny pohyb a aktualizovať x rýchlosť hráča sprite podľa hodnoty player_movement. Môžete to urobiť naviazaním pohybu na konkrétne klávesy alebo tlačidlá a aktualizáciou rýchlosti x hráča v slučke udalostí, napríklad:

ZRÝCHLOSŤ = 0.5
hráčsky_pohyb = 0

ak event.type == pygame. KEYDOWN:
ak event.key == pygame. K_LEFT:
hráčsky_pohyb = -1
elif event.key == pygame. K_RIGHT:
hráčsky_pohyb = 1
elif event.type == pygame. KEYUP:
ak event.key v (pygame. K_LEFT, pygame. K_RIGHT):
hráčsky_pohyb = 0

player.x_velocity += player_movement * ACCELERATION

Pomocou týchto techník môžete vytvoriť jednoduchú, ale zábavnú plošinovku pomocou vstavaných funkcií detekcie kolízií Pygame a základnej fyziky. S trochou kreativity a experimentovania môžete tieto techniky použiť na vytvorenie rôznych hier a herných mechanizmov.

Kompletný kód nájdete v úložisko GitHub.

Nižšie je výstup:

Zlepšite zapojenie používateľov pomocou kolízií

Mnoho hier vyžaduje určitú formu detekcie kolízií. Pomocou kolízií môžete vytvoriť širokú škálu herných mechanizmov, od jednoduchých plošinoviek až po zložité simulácie založené na fyzike.

Implementácia základnej fyziky, ako je gravitácia, trenie a zrýchlenie, môže tiež výrazne zlepšiť zapojenie používateľov, čím sa herným objektom pridá realizmus a pocit hmotnosti.