Põhifüüsika ja kokkupõrgete tuvastamise rakendamine Pygame'is

Põhifüüsika ja kokkupõrgete tuvastamise rakendamine Pygame'is
Teiesugused lugejad aitavad MUO-d toetada. Kui teete ostu meie saidil olevate linkide abil, võime teenida sidusettevõtte komisjonitasu. Loe rohkem.

Pygame pakub mitmeid sisseehitatud funktsioone mänguobjektide kokkupõrgete tuvastamiseks. Need on hindamatud, sest liikuvate objektide kattumise aja ja viisi täpselt välja selgitamine võib olla keeruline ülesanne.





Siit saate teada, kuidas pygame'i mooduli abil oma mängu lisada põhifüüsikat ja kokkupõrkeid.





Pygame'i sisseehitatud kokkupõrgete tuvastamise funktsioonid

Kõige elementaarsem sisseehitatud kokkupõrke tuvastamise funktsioon on spritecollide. See võtab spraidi, spraitide rühma ja tõeväärtuse, mis näitab, kas spraidid peaksid kokkupõrkel 'surema' (eemaldama) või mitte. See funktsioon tagastab kokkupõrkunud spraitide loendi. Siin on näide selle kasutamisest:





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

Veel üks kasulik kokkupõrgete tuvastamise funktsioon on groupcollide, mis võtab kaks spraitide rühma ja ka tõeväärtuse. See funktsioon tagastab sõnastiku, milles on klahvidena põrkuvad spraidid ja väärtusteks spraidid, millega nad kokku põrkasid. Siin on näide selle kasutamise kohta.

 collision_dict = pygame.sprite.groupcollide(group1, group2, True, True)

Põhilise platvormimängu loomine funktsiooni spritecollide abil

Pygame'i abil põhiplatvormimängu loomiseks peate looma mängija spraidi, mida kasutaja saab juhtida, ja platvormi spraidi, millel mängija saab seista. Spritecollide funktsiooni abil saate tuvastada, millal mängija sprait platvormi spraidiga kokku põrkub, ja vältida mängija kukkumist läbi platvormi.



Alustama, installige pygame'i moodul pip abil :

 pip install pygame

Pärast seda, luua lihtsaid klasse mängija ja platvormi jaoks, mis mõlemad peaksid pärima Pygame'i Sprite'i klassist. Mängijaklassil peaks olema uuendusmeetod, mis võimaldab mängija positsiooni kiiruse alusel käsitleda. Gravitatsiooniefekti rakendamiseks peaks sellel olema ka muutuja y_velocity. Platvormi klassis peaks olema meetod __init__, mis võtab platvormi koordinaadid ja loob sellise suurusega pinna.





Mängija klass

Mängijaklassi saate luua mooduli pygame.sprite.Sprite abil. See klass lähtestab mängija antud x ja y koordinaatidega. Seejärel värskendab värskendusmeetod mängija asukohta, suurendades y_velocity väärtust.

 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

Platvormi klass

Platvormi klass kasutab ka moodulit pygame.sprite.Sprite. See klass lähtestab platvormi antud x- ja y-koordinaatide ning laiuse ja kõrgusega.





 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))

Mängutsükkel

Mängutsükkel võimaldab teil luua akna suurusega 640x480. Seejärel käivitab see tsükli, mis kontrollib sündmusi, näiteks väljumiskäsku. Samuti kontrollib see mängija ja platvormi vahelisi kokkupõrkeid. Lõpuks täidab see ekraani valge värviga, joonistab mängija ja platvormi ning pöörab seejärel ekraani ümber.

 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()

Allpool on väljund:

  Lihtne platvormimäng, kasutades pygame'i

Gravitatsiooni ja hüppekäitumise rakendamine

Gravitatsiooni- ja hüppekäitumise rakendamiseks oma platvormimängus peate lisama oma mängija spraitile kiiruse y ja värskendama selle y-positsiooni igas kaadris. Selleks saate kasutada Player klassis olevat värskendusmeetodit ja lisada järgmine koodijupp:

 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

Nüüd iga kord, kui helistate värskendusmeetodile, värskendab see mängija asukohta vastavalt selle kiirusele ja raskusastmele.

Mängija spraidi hüppamiseks saate hüppetoimingu siduda kindla klahvi või nupuga ja värskendada mängija y kiirust negatiivse väärtusega. Järgmine koodilõik on näide hüppamisest, kui mängija vajutab tühikuklahvi.

iphone 7 kodunupp ei tööta
 JUMP_VELOCITY = -10 

# inside the game loop
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
    player.y_velocity = JUMP_VELOCITY

Pange tähele, et enne võtme väärtuse kontrollimist peate kontrollima faili event.type, et veenduda, et sündmus on KEYDOWN.

Põhifüüsika (nt hõõrdumine ja kiirendus) lisamine

Põhifüüsika (nt hõõrdumine ja kiirendus) lisamiseks oma platvormimängule peate igas kaadris värskendama oma mängija spraidi kiirust x. Saate lisada mängija klassile x kiiruse ja värskendada seda samamoodi nagu y kiirust. Hõõrdumise rakendamiseks saate igas kaadris mängija spraiti x kiirust veidi vähendada. Näiteks saate Player klassi värskendusmeetodi sisse lisada järgmise koodilõigu:

 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

Kiirenduse rakendamiseks saate määrata horisontaalse liikumise jaoks muutuja player_movement ja värskendada mängija spraidi x kiirust vastavalt mängija_liikumise väärtusele. Seda saate teha, sidudes liikumise kindlate klahvide või nuppudega ja värskendades näiteks mängija x kiirust sündmusetsüklis:

 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

Neid tehnikaid kasutades saate Pygame'i sisseehitatud kokkupõrketuvastusfunktsioonide ja põhifüüsika abil luua lihtsa, kuid lõbusa platvormimängu. Väikese loovuse ja katsetamise abil saate neid tehnikaid kasutada erinevate mängude ja mängumehaanika loomiseks.

Täieliku koodi leiate aadressilt GitHubi hoidla .

Allpool on väljund:

  lihtne platvormimäng gravitatsiooni ja kiirendusega

Parandage kasutajate seotust kokkupõrgetega

Paljud mängud nõuavad teatud tüüpi kokkupõrke tuvastamist. Kokkupõrgete abil saate luua laias valikus mängumehaanikat, alates lihtsatest platvormiseadmetest kuni keerukate füüsikapõhiste simulatsioonideni.

Põhifüüsika, nagu gravitatsioon, hõõrdumine ja kiirendus, rakendamine võib samuti oluliselt parandada kasutajate seotust, lisades mänguobjektidele realistlikkust ja kaalutunnetust.