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:
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:
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.