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