Pamatfizikas un sadursmju noteikšanas ieviešana programmā Pygame

Pamatfizikas un sadursmju noteikšanas ieviešana programmā Pygame
Tādi lasītāji kā jūs palīdz atbalstīt MUO. Veicot pirkumu, izmantojot saites mūsu vietnē, mēs varam nopelnīt filiāles komisiju. Lasīt vairāk.

Pygame nodrošina vairākas iebūvētas funkcijas, lai noteiktu sadursmes starp spēles objektiem. Tie ir nenovērtējami, jo precīzi noteikt, kad un kā kustīgie objekti pārklājas, var būt sarežģīts uzdevums.





Uzziniet, kā pievienot savai spēlei pamata fiziku un sadursmes, izmantojot pygame moduli.





Pygame iebūvētās sadursmju noteikšanas funkcijas

Visvienkāršākā iebūvētā sadursmes noteikšanas funkcija ir spritecollide. Tas aizņem spraitu, spraitu grupu un Būla vērtību, kas norāda, vai spraitiem ir vai nav 'jāmirst' (jāizņem), kad tie saduras. Šī funkcija atgriež sarakstu ar spraitiem, kas ir sadūrušies. Šeit ir piemērs, kā to izmantot:





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

Vēl viena noderīga sadursmes noteikšanas funkcija ir groupcollide, kas ietver divas spraitu grupas un Būla vērtību. Šī funkcija atgriež vārdnīcu ar sadursmes spraitiem kā taustiņiem un spraitiem, ar kuriem tie sadūrās kā vērtībām. Šeit ir piemērs, kā to izmantot:

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

Pamata platformera spēles izveide, izmantojot spritecollide funkciju

Lai izveidotu pamata platformas spēli, izmantojot Pygame, jums būs jāizveido spēlētāja sprite, kuru lietotājs var kontrolēt, un platformas sprite, kurā spēlētājs var stāvēt. Varat izmantot spritecollide funkciju, lai noteiktu, kad spēlētāja spraits saduras ar platformas spraitu, un neļautu spēlētājam izkrist cauri platformai.



Sākt, instalējiet pygame moduli, izmantojot pip :

prāta spēles, ko spēlēt kopā ar draugu
 pip install pygame

Pēc tam, izveidot vienkāršas klases Spēlētājam un Platformai, kurām abām jābūt mantotām no Pygame Sprite klases. Spēlētāju klasei ir jābūt atjaunināšanas metodei, lai apstrādātu spēlētāja pozīciju, pamatojoties uz ātrumu. Turklāt tam ir jābūt mainīgajam y_velocity, lai izmantotu gravitācijas efektu. Platformas klasei ir jābūt __init__ metodei, kas ņem platformas koordinātas un izveido virsmu ar šādu izmēru.





Spēlētāju klase

Jūs varat izveidot Player klasi, izmantojot pygame.sprite.Sprite moduli. Šī klase inicializēs atskaņotāju ar noteiktām x un y koordinātām. Pēc tam atjaunināšanas metode atjauninās atskaņotāja pozīciju, palielinot y_velocity vērtību.

 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

Platformas klase

Platformas klase izmanto arī moduli pygame.sprite.Sprite. Šī klase inicializēs platformu ar norādītajām x un y koordinātām, kā arī platumu un augstumu.





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

Spēles cilpa

Spēles cilpa ļaus jums izveidot logu ar izmēru 640x480. Pēc tam tiks palaists cilpa, kas pārbaudīs notikumus, piemēram, komandu iziet. Tas arī pārbaudīs, vai nav sadursmes starp atskaņotāju un platformu. Visbeidzot, tas aizpildīs ekrānu ar baltu krāsu, uzzīmēs atskaņotāju un platformu un pēc tam apvērs displeju.

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

Zemāk ir izvade:

  vienkārša platformas spēle, izmantojot pygame

Gravitācijas un lēkšanas uzvedības īstenošana

Lai savā platformera spēlē īstenotu gravitācijas un lēkšanas uzvedību, spēlētāja spraitam būs jāpievieno y ātrums un jāatjaunina tā y pozīcija katrā kadrā. Lai to izdarītu, atskaņotāja klasē varat izmantot atjaunināšanas metodi un pievienot šādu koda fragmentu:

kā izveidot interneta savienojumu mājās
 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

Tagad katru reizi, kad izsaucat atjaunināšanas metodi, tā atjauninās spēlētāja pozīciju atbilstoši tā ātrumam un smagumam.

Lai liktu spēlētājam spraitam lēkt, varat saistīt lēciena darbību ar noteiktu taustiņu vai pogu un atjaunināt spēlētāja y ātrumu ar negatīvu vērtību. Šis koda fragments ir piemērs tam, kā lēkt, kad spēlētājs nospiež atstarpes taustiņu.

 JUMP_VELOCITY = -10 

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

Ņemiet vērā, ka pirms atslēgas vērtības pārbaudes jums būs jāpārbauda event.type, lai pārliecinātos, ka notikums ir KEYDOWN notikums.

Pievienojot pamata fizikas, piemēram, berzi un paātrinājumu

Lai platformas spēlei pievienotu pamata fiziku, piemēram, berzi un paātrinājumu, jums būs jāatjaunina spēlētāja spraita ātrums x katrā kadrā. Spēlētāju klasei varat pievienot x ātrumu un atjaunināt to tāpat kā y ātrumu. Lai īstenotu berzi, katrā kadrā varat samazināt atskaņotāja spraita x ātrumu par nelielu daudzumu. Piemēram, atskaņotāja klases atjaunināšanas metodē varat pievienot šādu koda fragmentu:

 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

Lai ieviestu paātrinājumu, horizontālajai kustībai varat iestatīt mainīgo player_movement un atjaunināt atskaņotāja spraita ātrumu x atbilstoši player_movement vērtībai. To var izdarīt, piesaistot kustību konkrētiem taustiņiem vai pogām un atjauninot spēlētāja ātrumu x notikumu cilpā, piemēram:

 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

Izmantojot šīs metodes, varat izveidot vienkāršu, taču jautru platformas spēli, izmantojot Pygame iebūvētās sadursmju noteikšanas funkcijas un pamata fiziku. Ar nelielu radošuma un eksperimentu palīdzību jūs varat izmantot šīs metodes, lai izveidotu dažādas spēles un spēļu mehāniku.

Pilnu kodu varat atrast vietnē GitHub repozitorijs .

Zemāk ir izvade:

  vienkārša platformas spēle ar gravitāciju un paātrinājumu

Uzlabojiet lietotāju iesaisti sadursmju gadījumā

Daudzām spēlēm ir nepieciešama kāda veida sadursmes noteikšana. Varat izmantot sadursmes, lai izveidotu plašu spēļu mehānikas klāstu, sākot no vienkāršiem platformeriem līdz sarežģītām uz fiziku balstītām simulācijām.

Pamatfizikas, piemēram, gravitācijas, berzes un paātrinājuma, ieviešana var arī ievērojami uzlabot lietotāju iesaisti, pievienojot spēļu objektiem reālismu un svara sajūtu.