Kaltaisesi lukijat auttavat tukemaan MUO: ta. Kun teet ostoksen käyttämällä sivustollamme olevia linkkejä, voimme ansaita kumppanipalkkion. Lue lisää.

Pygame tarjoaa useita sisäänrakennettuja toimintoja peliobjektien välisten törmäysten havaitsemiseen. Nämä ovat korvaamattomia, koska sen selvittäminen, milloin ja miten liikkuvat kohteet menevät päällekkäin, voi olla monimutkainen tehtävä.

Opi lisäämään perusfysiikkaa ja törmäyksiä peliisi pygame-moduulin avulla.

Pygamen sisäänrakennetut törmäyksentunnistustoiminnot

Yleisin sisäänrakennettu törmäyksentunnistustoiminto on spritecollide. Se ottaa vastaan ​​spriten, ryhmän spritejä ja loogisen arvon, joka ilmaisee, pitäisikö spritien "kulla" (poistettava) niiden törmääessä. Tämä funktio palauttaa luettelon törmänneistä spriteistä. Tässä on esimerkki sen käytöstä:

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

Toinen hyödyllinen törmäyksen havaitsemistoiminto on groupcollide, joka ottaa kaksi sprite-ryhmää ja myös loogisen arvon. Tämä funktio palauttaa sanakirjan, jonka avaimina ovat törmäykset ja arvoina ne spritet, joiden kanssa ne törmäsivät. Tässä on esimerkki sen käytöstä:

instagram viewer

collision_dict = pygame.sprite.groupcollide (ryhmä1, ryhmä2, Totta, Totta)

Perustasohyppelypelin luominen spritecollide-funktion avulla

Perustason tasohyppelypelin luomiseksi Pygamella sinun on luotava pelaajaspriite, jota käyttäjä voi hallita, ja alustaspriite, jolla pelaaja voi seisoa. Spritecollide-toiminnon avulla voit havaita, milloin pelaajaspriitti törmää alustaspriteen ja estää pelaajaa putoamasta alustan läpi.

Aloittaa, asenna pygame-moduuli pip: llä:

pip asennus pygame

Sen jälkeen, luoda yksinkertaisia ​​luokkia soittimelle ja alustalle, joiden molempien pitäisi periä Pygamen Sprite-luokasta. Player-luokassa tulisi olla päivitysmenetelmä, joka käsittelee pelaajan asemaa nopeuden perusteella. Lisäksi siinä pitäisi olla y_velocity-muuttuja painovoimavaikutuksen soveltamiseksi. Platform-luokassa tulisi olla __init__-metodi, joka ottaa alustan koordinaatit ja luo tämän kokoisen pinnan.

Pelaajaluokka

Voit luoda Player-luokan käyttämällä pygame.spritea. Sprite moduuli. Tämä luokka alustaa soittimen annetuilla x- ja y-koordinaateilla. Sitten päivitysmenetelmä päivittää soittimen sijainnin lisäämällä y_velocity-arvoa.

tuonti pygame

luokkaaPelaaja(pygame.sprite. Sprite):
def__sen sisällä__(itse, x, y):
super().__init__()
self.image = pygame. Pinta((32, 32))
self.rect = self.image.get_rect (topleft=(x, y))
self.y_velocity = 0

defpäivittää(itse):
self.rect.y += self.y_velocity

Alustaluokka

Platform-luokka käyttää myös pygame.spritea. Sprite moduuli. Tämä luokka alustaa alustan annetuilla x- ja y-koordinaateilla sekä leveydellä ja korkeudella.

luokkaaAlusta(pygame.sprite. Sprite):
def__sen sisällä__(itse, x, y, leveys, korkeus):
super().__init__()
self.image = pygame. Pinta (leveys, korkeus)
self.rect = self.image.get_rect (topleft=(x, y))

Pelisilmukka

Pelisilmukan avulla voit luoda ikkunan, jonka koko on 640x480. Sitten se suorittaa silmukan, joka tarkistaa mahdolliset tapahtumat, kuten lopetuskomennon. Se tarkistaa myös mahdolliset törmäykset soittimen ja alustan välillä. Lopuksi se täyttää näytön valkoisella värillä, piirtää soittimen ja alustan ja kääntää sitten näyttöä.

pelaaja = pelaaja(100, 300)
player_group = pygame.sprite. Ryhmä()
player_group.add (pelaaja)

alusta = Platform(50, 400, 100, 20)
platform_group = pygame.sprite. Ryhmä()
platform_group.add (alusta)

# Alusta pygame ja luo ikkuna
pygame.init()
näyttö = pygame.display.set_mode((640, 480))

# Pääpelisilmukka
juoksu = Totta

sillä aikaa käynnissä:
varten tapahtuma sisään pygame.event.get():
jos event.type == pygame. LOPETTAA:
juoksu = Väärä

player_group.update()
törmäsi = pygame.sprite.spritecollide (pelaaja, alustaryhmä, Väärä)

jos törmäsi:
player.y_velocity = 0
screen.fill((255, 255, 255))
player_group.draw (näyttö)
platform_group.draw (näyttö)
pygame.display.flip()

pygame.quit()

Alla on tulos:

Painovoiman ja hyppykäyttäytymisen toteuttaminen

Toteuttaaksesi painovoiman ja hyppykäyttäytymisen tasohyppelypelissäsi, sinun on lisättävä pelaajaspriiteen y-nopeus ja päivitettävä sen y-sijainti jokaisessa kehyksessä. Voit tehdä tämän käyttämällä Player-luokan päivitysmenetelmää ja lisäämällä seuraavan koodinpätkän:

luokkaaPelaaja(pygame.sprite. Sprite):
def__sen sisällä__(itse, x, y):
super().__init__()
self.image = pygame. Pinta((32, 32))
self.rect = self.image.get_rect (topleft=(x, y))
self.y_velocity = 0

defpäivittää(itse):
self.rect.y += self.y_velocity
self.y_velocity += PAINOVOIMA # Käytä painovoimaa y-nopeuteen

Nyt joka kerta kun kutsut päivitysmenetelmää, se päivittää pelaajan paikan nopeudensa ja painovoimansa mukaan.

Saadaksesi pelaaja spriten hyppäämään, voit sitoa hyppytoiminnon tiettyyn näppäimeen tai painikkeeseen ja päivittää pelaajan y-nopeuden negatiivisella arvolla. Seuraava koodinpätkä on esimerkki hyppäämisestä, kun pelaaja painaa välilyöntiä.

JUMP_VELOCITY = -10

# pelisilmukan sisällä
jos event.type == pygame. NÄPPÄIN ja event.key == pygame. K_SPACE:
player.y_velocity = JUMP_VELOCITY

Huomaa, että sinun on tarkistettava event.type varmistaaksesi, että tapahtuma on KEYDOWN-tapahtuma ennen avainarvon tarkistamista.

Lisätään perusfysiikka, kuten kitka ja kiihtyvyys

Jos haluat lisätä tasohyppelypeliisi perusfysiikkaa, kuten kitkaa ja kiihtyvyyttä, sinun on päivitettävä pelaajaspriiten x-nopeus jokaisessa kehyksessä. Voit lisätä x nopeuden pelaajaluokkaan ja päivittää sen samalla tavalla kuin y nopeuden. Kitkan toteuttamiseksi voit pienentää soittimen spriten x-nopeutta pienellä määrällä jokaisessa kehyksessä. Voit esimerkiksi lisätä seuraavan koodinpätkän Player-luokan päivitysmenetelmään:

KITKA = 0.9

luokkaaPelaaja(pygame.sprite. Sprite):
def__sen sisällä__(itse, x, y):
super().__init__()
self.image = pygame. Pinta((32, 32))
self.rect = self.image.get_rect (topleft=(x, y))
self.y_velocity = 0
self.x_velocity = 0

defpäivittää(itse):
self.rect.y += self.y_velocity
self.rect.x += self.x_velocity
self.y_velocity += PAINOVOIMA # Käytä painovoimaa y-nopeuteen
self.x_velocity *= KITKA # Käytä kitkaa x-nopeuteen

Kiihdytyksen toteuttamiseksi voit asettaa muuttujan player_movement vaakasuuntaiselle liikkeelle ja päivittää pelaajaspriitin x-nopeuden player_movement-arvon mukaan. Voit tehdä tämän sitomalla liikkeen tiettyihin näppäimiin tai painikkeisiin ja päivittämällä pelaajan x-nopeuden tapahtumasilmukassa, esimerkiksi:

KIIHDYTYS = 0.5
pelaaja_liike = 0

jos event.type == pygame. KEYDOWN:
jos event.key == pygame. K_LEFT:
pelaaja_liike = -1
elif event.key == pygame. K_OIKEA:
pelaaja_liike = 1
elif event.type == pygame. KEYUP:
jos tapahtuma.avain sisään (pygame. K_LEFT, pygame. K_OIKEA):
pelaaja_liike = 0

player.x_velocity += player_movement * ACCELERATION

Käyttämällä näitä tekniikoita voit luoda yksinkertaisen mutta hauskan tasohyppelypelin käyttämällä Pygamen sisäänrakennettuja törmäyksentunnistustoimintoja ja perusfysiikkaa. Pienellä luovuudella ja kokeilulla voit käyttää näitä tekniikoita luomaan erilaisia ​​pelejä ja pelimekaniikkoja.

Löydät täydellisen koodin osoitteesta GitHub-arkisto.

Alla on tulos:

Paranna käyttäjien sitoutumista törmäyksiin

Monet pelit vaativat jonkinlaisen törmäyksen havaitsemisen. Voit käyttää törmäyksiä luodaksesi laajan valikoiman pelimekaniikkaa yksinkertaisista tasohyppelyistä monimutkaisiin fysiikkapohjaisiin simulaatioihin.

Perusfysiikan, kuten painovoiman, kitkan ja kiihtyvyyden, toteuttaminen voi myös parantaa huomattavasti käyttäjien sitoutumista lisäämällä peliobjekteihin realistisuutta ja painontuntoa.