Az Önhöz hasonló olvasók támogatják a MUO-t. Amikor a webhelyünkön található linkek használatával vásárol, társult jutalékot kaphatunk. Olvass tovább.

A Pygame számos beépített funkciót kínál a játékobjektumok közötti ütközések észlelésére. Ezek felbecsülhetetlen értékűek, mert bonyolult feladat lehet meghatározni, hogy a mozgó objektumok pontosan mikor és hogyan fedik át egymást.

Tanuld meg, hogyan adhatsz hozzá alapvető fizikát és ütközéseket a játékodhoz a pygame modul segítségével.

A Pygame beépített ütközésészlelési funkciói

A legalapvetőbb beépített ütközésérzékelő funkció a spritecollide. Egy sprite-ot, egy sprite-csoportot és egy logikai értéket vesz fel, amely jelzi, hogy a sprite-eknek "meg kell-e halniuk" (el kell-e távolítani), amikor ütköznek. Ez a függvény az ütközött sprite-ok listáját adja vissza. Íme egy példa a használatára:

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

Egy másik hasznos ütközésészlelő funkció a groupcollide, amely két sprite-csoportot és egy logikai értéket is felvesz. Ez a függvény egy szótárt ad vissza, amelyben kulcsként az ütközött sprite-eket, értékeként pedig azokat a sprite-eket, amelyekkel ütköztek. Íme egy példa a használatára:

instagram viewer

collision_dict = pygame.sprite.groupcollide (csoport1, csoport2, Igaz, Igaz)

Alapszintű platformjáték létrehozása a spritecollide függvény használatával

Egy alap platformer játék Pygame használatával létrehozásához létre kell hoznia egy játékos sprite-ot, amelyet a felhasználó irányíthat, és egy platform sprite-ot, amelyen a játékos állhat. A spritecollide funkció segítségével észlelheti, ha a játékos sprite ütközik a platform sprite-tal, és megakadályozhatja, hogy a játékos átessen a platformon.

Kezdeni, telepítse a pygame modult a pip segítségével:

pip install pygame

Azt követően, egyszerű osztályokat hozzon létre a Player és a Platform számára, mindkettőnek a Pygame Sprite osztályából kell örökölnie. A Player osztálynak rendelkeznie kell egy frissítési módszerrel, amely a játékos pozícióját a sebesség alapján kezeli. Ezenkívül rendelkeznie kell egy y_velocity változóval a gravitációs hatás alkalmazásához. A Platform osztálynak rendelkeznie kell egy __init__ metódussal, amely veszi a platform koordinátáit, és létrehoz egy ilyen méretű felületet.

Játékos osztály

Létrehozhat egy Player osztályt a pygame.sprite használatával. Sprite modul. Ez az osztály inicializálja a játékost adott x és y koordinátákkal. Ezután a frissítési módszer frissíti a lejátszó pozícióját az y_velocity érték növelésével.

import pygame

osztályJátékos(pygame.sprite. Kobold):
def__benne__(én, x, y):
szuper().__init__()
self.image = pygame. Felület((32, 32))
self.rect = self.image.get_rect (topleft=(x, y))
self.y_velocity = 0

deffrissítés(maga):
self.rect.y += self.y_velocity

Platform osztály

A Platform osztály a pygame.sprite fájlt is használja. Sprite modul. Ez az osztály inicializálja a platformot adott x és y koordinátákkal, valamint szélességgel és magassággal.

osztályFelület(pygame.sprite. Kobold):
def__benne__(saját, x, y, szélesség, magasság):
szuper().__init__()
self.image = pygame. Felület ((szélesség, magasság))
self.rect = self.image.get_rect (topleft=(x, y))

A játékhurok

A játékhurok lehetővé teszi egy 640x480 méretű ablak létrehozását. Ezután egy ciklust fog futtatni, amely ellenőrzi az eseményeket, például a kilépés parancsot. Azt is ellenőrzi, hogy nincs-e ütközés a lejátszó és a platform között. Végül fehér színnel kitölti a képernyőt, megrajzolja a lejátszót és a platformot, majd megfordítja a kijelzőt.

játékos = játékos(100, 300)
player_group = pygame.sprite. Csoport()
player_group.add (lejátszó)

platform = Platform(50, 400, 100, 20)
platform_group = pygame.sprite. Csoport()
platform_group.add (platform)

# Inicializálja a pygame-et és hozzon létre ablakot
pygame.init()
képernyő = pygame.display.set_mode((640, 480))

# Fő játékhurok
futás = Igaz

míg futás:
számára esemény ban ben pygame.event.get():
ha event.type == pygame. KILÉPÉS:
futás = Hamis

player_group.update()
ütközött = pygame.sprite.spritecollide (lejátszó, platform_csoport, Hamis)

ha ütközött:
player.y_velocity = 0
screen.fill((255, 255, 255))
player_group.draw (képernyő)
platform_group.draw (képernyő)
pygame.display.flip()

pygame.quit()

Alább látható a kimenet:

A gravitáció és az ugráló viselkedés megvalósítása

A gravitáció és az ugrás viselkedésének megvalósításához a platformer játékban egy y sebességet kell hozzáadnia a játékos sprite-hoz, és frissítenie kell annak y pozícióját minden egyes keretben. Ehhez használhatja a Player osztályon belüli frissítési metódust, és hozzáadhatja a következő kódrészletet:

osztályJátékos(pygame.sprite. Kobold):
def__benne__(én, x, y):
szuper().__init__()
self.image = pygame. Felület((32, 32))
self.rect = self.image.get_rect (topleft=(x, y))
self.y_velocity = 0

deffrissítés(maga):
self.rect.y += self.y_velocity
self.y_velocity += GRAVITÁCIÓ # Alkalmazza a gravitációt y sebességre

Mostantól minden alkalommal, amikor meghívod a frissítési módszert, az frissíti a játékos pozícióját a sebességének és a gravitációjának megfelelően.

Ahhoz, hogy a játékos sprite ugorjon, az ugrás műveletet egy adott billentyűhöz vagy gombhoz kötheti, és negatív értékkel frissítheti a játékos y sebességét. A következő kódrészlet egy példa arra, hogyan kell ugrani, amikor a játékos megnyomja a szóköz billentyűt.

JUMP_VELOCITY = -10

# a játékhurok belsejében
ha event.type == pygame. KEYDOWN és event.key == pygame. K_SPACE:
player.y_velocity = JUMP_VELOCITY

Vegye figyelembe, hogy a kulcsérték ellenőrzése előtt ellenőriznie kell az event.type fájlt, hogy megbizonyosodjon arról, hogy az esemény KEYDOWN esemény.

Alapvető fizika, például súrlódás és gyorsulás hozzáadása

Ahhoz, hogy az alapvető fizikát, például a súrlódást és a gyorsulást hozzáadhassa a platformer játékhoz, frissítenie kell a játékos sprite x sebességét minden képkockában. Hozzáadhat x sebességet a játékososztályhoz, és ugyanúgy frissítheti, mint az y sebességet. A súrlódás megvalósításához minden képkockában csökkentheti a játékos sprite x sebességét egy kis mértékben. Például a következő kódrészletet hozzáadhatja a Player osztály frissítési metódusához:

SÚRLÁS = 0.9

osztályJátékos(pygame.sprite. Kobold):
def__benne__(én, x, y):
szuper().__init__()
self.image = pygame. Felület((32, 32))
self.rect = self.image.get_rect (topleft=(x, y))
self.y_velocity = 0
self.x_velocity = 0

deffrissítés(maga):
self.rect.y += self.y_velocity
self.rekt.x += self.x_velocity
self.y_velocity += GRAVITÁCIÓ # Alkalmazza a gravitációt y sebességre
self.x_velocity *= súrlódás # Alkalmazzon súrlódást az x sebességre

A gyorsítás megvalósításához beállíthatunk egy player_movement változót a vízszintes mozgáshoz, és frissíthetjük a játékos sprite x sebességét a player_movement értéknek megfelelően. Ezt úgy teheti meg, hogy a mozgást meghatározott billentyűkhöz vagy gombokhoz köti, és frissíti a játékos x sebességét az eseményhurokban, például:

GYORSÍTÁS = 0.5
player_movement = 0

ha event.type == pygame. KEYDOWN:
ha event.key == pygame. K_LEFT:
player_movement = -1
elif event.key == pygame. K_RIGHT:
player_movement = 1
elif event.type == pygame. KEYUP:
ha esemény.kulcs ban ben (pygame. K_LEFT, pygame. K_JOBB):
player_movement = 0

player.x_velocity += player_movement * GYORSÍTÁS

Ezekkel a technikákkal egy egyszerű, de szórakoztató platformer játékot hozhat létre a Pygame beépített ütközésészlelő funkcióival és alapvető fizikával. Egy kis kreativitással és kísérletezéssel ezekkel a technikákkal különféle játékokat és játékmechanikákat hozhat létre.

A teljes kódot megtalálja a GitHub adattár.

Alább látható a kimenet:

Javítsa a felhasználók elköteleződését az ütközések során

Sok játék igényel valamilyen ütközésérzékelést. Az ütközések segítségével a játékmechanikák széles skáláját hozhatja létre, az egyszerű platformerektől a bonyolult fizikai alapú szimulációkig.

Az alapvető fizika, például a gravitáció, a súrlódás és a gyorsulás megvalósítása szintén nagymértékben javíthatja a felhasználók elkötelezettségét, realizmust és súlyérzetet adva a játékobjektumokhoz.