„Pygame“ siūlo keletą integruotų funkcijų, skirtų žaidimo objektų susidūrimams aptikti. Tai neįkainojama, nes tiksliai nustatyti, kada ir kaip judantys objektai persidengia, gali būti sudėtinga užduotis.
Sužinokite, kaip į žaidimą įtraukti pagrindinę fiziką ir susidūrimus naudodami pygame modulį.
„Pygame“ integruotos susidūrimų aptikimo funkcijos
Paprasčiausia integruota susidūrimo aptikimo funkcija yra spritecollide. Ji paima sprite, spraitų grupę ir loginę reikšmę, rodančią, ar spraitai turi „mirti“ (būti pašalinti), kai jie susiduria. Ši funkcija grąžina susidūrusių spritų sąrašą. Štai pavyzdys, kaip jį naudoti:
kaip ištrinti ps4 paskyrą
collided_sprites = pygame.sprite.spritecollide(sprite1, sprite_group, True)
Kita naudinga susidūrimo aptikimo funkcija yra groupcollide, kuri taip pat apima dvi spritų grupes ir loginę reikšmę. Ši funkcija grąžina žodyną, kuriame yra susidūrę spraitai kaip raktai, o spraitai, su kuriais jie susidūrė, kaip reikšmės. Štai pavyzdys, kaip jį naudoti:
collision_dict = pygame.sprite.groupcollide(group1, group2, True, True)
Pagrindinio platformingo žaidimo kūrimas naudojant „spritecollide“ funkciją
Norėdami sukurti pagrindinį platformingo žaidimą naudodami Pygame, turėsite sukurti žaidėjo sprite, kurį vartotojas galėtų valdyti, ir platformos sprite, ant kurio žaidėjas galėtų stovėti. Galite naudoti spritecollide funkciją, kad aptiktumėte, kada žaidėjo sprite susiduria su platformos sprite ir neleistumėte žaidėjui iškristi per platformą.
Pradėti, įdiekite pygame modulį naudodami pip :
pip install pygame
Po to sukurti paprastas klases grotuvui ir platformai, kurie abu turėtų būti paveldėti iš Pygame's Sprite klasės. Žaidėjų klasėje turėtų būti atnaujinimo metodas, leidžiantis valdyti žaidėjo padėtį pagal greitį. Be to, jame turėtų būti y_velocity kintamasis, kad būtų pritaikytas gravitacijos efektas. Platformos klasėje turėtų būti __init__ metodas, kuris paima platformos koordinates ir sukuria tokio dydžio paviršių.
Žaidėjų klasė
Galite sukurti žaidėjo klasę naudodami pygame.sprite.Sprite modulį. Ši klasė inicijuos grotuvą nurodytomis x ir y koordinatėmis. Tada atnaujinimo metodas atnaujins grotuvo padėtį padidindamas y_velocity reikšmę.
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
Platformos klasė
Platformos klasėje taip pat naudojamas pygame.sprite.Sprite modulis. Ši klasė inicijuos platformą su nurodytomis x ir y koordinatėmis, taip pat pločiu ir aukščiu.
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))
Žaidimo kilpa
Žaidimo kilpa leis jums sukurti 640x480 dydžio langą. Tada bus paleista ciklas, kuris patikrins, ar nėra įvykių, pvz., komandą baigti. Jis taip pat patikrins, ar nėra susidūrimų tarp grotuvo ir platformos. Galiausiai jis užpildys ekraną balta spalva, nupieš grotuvą ir platformą, o tada apvers ekraną.
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()
Žemiau yra išvestis:
Gravitacijos ir šokinėjimo elgesio įgyvendinimas
Norėdami įgyvendinti savo platformingo žaidimo gravitaciją ir šokinėjimą, turėsite pridėti y greitį prie žaidėjo sprite ir atnaujinti jo y padėtį kiekviename kadre. Norėdami tai padaryti, galite naudoti atnaujinimo metodą Player klasėje ir pridėti šį kodo fragmentą:
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
Dabar kiekvieną kartą, kai iškviečiate atnaujinimo metodą, jis atnaujins žaidėjo padėtį pagal savo greitį ir sunkumą.
Norėdami priversti žaidėją šokinėti, galite susieti šokinėjimo veiksmą su konkrečiu klavišu arba mygtuku ir atnaujinti žaidėjo y greitį neigiama verte. Šis kodo fragmentas yra pavyzdys, kaip šokinėti, kai žaidėjas paspaudžia tarpo klavišą.
JUMP_VELOCITY = -10
# inside the game loop
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
player.y_velocity = JUMP_VELOCITY
Atminkite, kad prieš tikrindami rakto reikšmę turėsite patikrinti event.type, kad įsitikintumėte, jog įvykis yra KEYDOWN įvykis.
Pridedamas pagrindinės fizikos, tokios kaip trintis ir pagreitis
Norėdami į savo platformingo žaidimą įtraukti pagrindinę fiziką, pvz., trintį ir pagreitį, kiekviename kadre turėsite atnaujinti žaidėjo sprite x greitį. Galite pridėti x greitį prie žaidėjų klasės ir atnaujinti jį taip pat, kaip ir y greitį. Norėdami įgyvendinti trintį, kiekviename kadre galite šiek tiek sumažinti grotuvo sprito x greitį. Pavyzdžiui, galite įtraukti šį kodo fragmentą į grotuvo klasės atnaujinimo metodą:
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
Norėdami įgyvendinti pagreitį, galite nustatyti horizontalaus judėjimo kintamąjį player_movement ir atnaujinti žaidėjo sprito x greitį pagal žaidėjo_judesio reikšmę. Tai galite padaryti susiedami judesį su tam tikrais klavišais arba mygtukais ir atnaujindami žaidėjo x greitį įvykio cikle, pavyzdžiui:
„Galaxy“ skirtukas 3 neįsijungs
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
Naudodami šiuos metodus galite sukurti paprastą, bet įdomų platformingo žaidimą naudodami Pygame integruotas susidūrimo aptikimo funkcijas ir pagrindinę fiziką. Turėdami šiek tiek kūrybiškumo ir eksperimentuodami, galite naudoti šiuos metodus kurdami įvairius žaidimus ir žaidimų mechaniką.
Visą kodą galite rasti GitHub saugykla .
Žemiau yra išvestis:
Pagerinkite naudotojų įtraukimą į susidūrimus
Daugeliui žaidimų reikalingas tam tikras susidūrimo aptikimas. Galite naudoti susidūrimus, kad sukurtumėte daugybę žaidimų mechanikos, nuo paprastų platformingų iki sudėtingų fizikos modelių.
Įdiegus pagrindines fizikines priemones, tokias kaip gravitacija, trintis ir pagreitis, taip pat galima žymiai pagerinti vartotojų įsitraukimą, žaidimo objektams suteikiant tikroviškumo ir svorio pojūtį.