Pagrindinės fizikos ir susidūrimų aptikimo įdiegimas „Pygame“.

Pagrindinės fizikos ir susidūrimų aptikimo įdiegimas „Pygame“.
Tokie skaitytojai kaip jūs padeda palaikyti MUO. Kai perkate naudodami nuorodas mūsų svetainėje, galime uždirbti filialų komisinius. Skaityti daugiau.

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

  paprastas platformingo žaidimas naudojant pygame

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:

  paprastas platformingo žaidimas su gravitacija ir pagreičiu

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