Ismerje meg, hogyan építheti be a játékmenet mentése és betöltése funkciót a zökkenőmentes játékélmény érdekében.

A modern játékfejlesztésben a játék előrehaladásának mentése és betöltése kulcsfontosságú funkció, amely javítja a felhasználói élményt és az elkötelezettséget. A PyGame, egy népszerű könyvtár a 2D-s játékok Pythonban történő létrehozásához, biztosítja a szükséges eszközöket a mentési és betöltési funkció könnyű megvalósításához.

Egyszerű játék létrehozása

Mielőtt elkezdené, győződjön meg arról, hogy rendelkezik pip telepítve van a készülékére. A pip telepítése után futtassa az alábbi parancsot a telepítéséhez pygame modul:

pip install pygame

A PyGame mentési és betöltési rendszerének megvalósításának szemléltetéséhez kezdje egy egyszerű játék létrehozásával.

A cikkben használt kód itt érhető el GitHub adattár és az MIT licence alapján ingyenesen használható.

Ebben a játékban a játékosnak lehetősége lesz balra és jobbra mozogni. Íme egy példa kódrészlet, amely bemutatja a játék alapvető szerkezetét:

instagram viewer
import pygame

# Inicializálja a Pygame-et
pygame.init()

# Állítsa be a játékablakot
ablak_szélessége = 800
ablak_magassága = 600
ablak = pygame.display.set_mode((ablak_szélessége, ablak_magassága))
pygame.display.set_caption("Rendszer mentése és betöltése oktatóanyag")

# Játékváltozók
játékos_x = 400
player_y = 500
player_speed = 5

# 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

keys = pygame.key.get_pressed()
ha kulcsok[pygame. K_LEFT]:
player_x -= player_speed
ha kulcsok[pygame. K_RIGHT]:
player_x += player_speed

# Törölje a képernyőt
window.fill((0, 0, 0))

# Rajzold le a játékost
pygame.draw.rect (ablak, (255, 255, 255), (player_x, player_y, 50, 50))

# Frissítse a kijelzőt
pygame.display.flip()

# Lépjen ki a játékból
pygame.quit()

A játékállapot és az adatok állandóságának kezelése

A mentés és betöltés funkció megvalósítása előtt meg kell határoznia a játék állapotának kezelésének és az adatok megőrzésének módját. Az egyik általános megközelítés az használjon Python szótárt a vonatkozó játékadatok tárolására. Íme egy példa arra, hogyan módosíthatja az előző kódot a játékállapot-kezeléssel:

# Játékváltozók
game_state = {
'player_x': 400,
'player_y': 500
}

# Játékhurok
futás = Igaz
míg futás:
# ...

keys = pygame.key.get_pressed()
ha kulcsok[pygame. K_LEFT]:
játékállapot['player_x'] -= játékos_sebesség
ha kulcsok[pygame. K_RIGHT]:
játékállapot['player_x'] += játékos_sebesség

# ...

pygame.display.flip()

Mentés és betöltés funkció megvalósítása

A játék előrehaladásának mentéséhez és betöltéséhez használhatja a Python beépített funkcióját savanyú uborka modul, amely lehetővé teszi Python objektumok szerializálását és deszerializálását. Hozzon létre egy új nevű fájlt save-game.py és adja hozzá a kódot az alábbi frissítésekkel:

game_state = {
'player_x': player_x,
'player_y': játékos_y
}

# Mentse el a játék állapotát
defsave_game_state(játékállapot, fájlnév):
próbáld ki:
val vel nyitott (fájlnév, "wb") mint fájl:
pickle.dump (játékállapot, fájl)
nyomtatás("A játék állapota sikeresen mentve!")
kivéve IOError:
nyomtatás("Hiba: Nem sikerült menteni a játék állapotát.")

# A játék állapotának betöltése
defload_game_state(fájl név):
próbáld ki:
val vel nyitott (fájlnév, "rb") mint fájl:
game_state = pickle.load (fájl)
nyomtatás("A játék állapota sikeresen betöltve!")
Visszatérés game_state
kivéve (IOHiba, savanyúság. UnpicklingError):
nyomtatás("Hiba: Nem sikerült betölteni a játék állapotát.")

# Játékhurok
futás = Igaz
míg futás:

# ...

keys = pygame.key.get_pressed()
ha kulcsok[pygame. K_LEFT]:
player_x -= player_speed
játékállapot['player_x'] = játékos_x
ha kulcsok[pygame. K_RIGHT]:
player_x += player_speed
játékállapot['player_x'] = játékos_x

ha kulcsok[pygame. K_s]:
save_game_state (game_state, 'save_game.pickle')
ha kulcsok[pygame. K_l]:
game_state = load_game_state('save_game.pickle')
játékos_x = játék állapota['player_x']

# ...

# ...

Alább látható a kimenet:

Felhasználói felület tervezése a mentési helyekhez

A mentési és betöltési felület biztosításához megjelenítheti a mentési helyeket, amelyek lehetővé teszik a játékos számára, hogy kiválaszthassa, melyik nyílást szeretné menteni vagy betölteni. Ebben a példában a lehetőségek a konzolon jelennek meg, de használhatja Python GUI keretrendszerei egy felhasználóbarátabb felület létrehozásához.

Hozzon létre egy save_slots listát, amely az elérhető mentési helyeket képviseli. Ezenkívül adjon hozzá a kiválasztott_hely változó a játékos által kiválasztott slot nyomon követéséhez.

Az elérhető mentési helyek megjelenítése, amikor a játékos megnyomja a mentés gombot (K_s). A játékos a megfelelő számgomb megnyomásával választhat egy slotot (K_1, K_2, vagy K_3). Ha egy slot van kiválasztva, a játék állapota a kiválasztott slot után elnevezett fájlba kerül mentésre.

Hasonlóképpen, amikor a lejátszó megnyomja a betöltés gombot (K_l), jelenítse meg a mentési helyeket. A játékos a gombok megnyomásával választhat egy slotot K_a, K_b, vagy K_c a játék állapotának betöltéséhez. Alternatív megoldásként megteheti érintéses bemeneteket használjon ahelyett, hogy a billentyűzet bemeneteit a slot kiválasztásához. Ha egy slot van kiválasztva, a játék állapota betöltődik a megfelelő fájlból.

Hozzon létre egy új nevű fájlt interface.py és adja hozzá a kódot az alábbi frissítésekkel:

# Játékváltozók
save_slots = ["1. hely", "Slot 2", "3. hely"]
kiválasztott_hely = Egyik sem

# 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

ha event.type == pygame. KEYDOWN:
ha event.key == pygame. K_s:
# Mentés helyek megjelenítése
kiválasztott_hely = Egyik sem
számára én, slot ban ben felsorol (save_slots):
nyomtatás(f"Slot mentése {i+1}: {rés}")
nyomtatás("Válasszon helyet a játék mentéséhez.")

ha event.key == pygame. K_l:
nyomtatás("Slot kiválasztása: - a - 1. hely, b - 3. hely, c - 3. hely")
# Mentés helyek megjelenítése
kiválasztott_hely = Egyik sem
számára én, slot ban ben felsorol (save_slots):
nyomtatás(f"Slot mentése {i+1}: {rés}")
nyomtatás("Válasszon helyet a játék betöltéséhez.")

ha esemény.kulcs ban ben [pygame. K_1, pygame. K_2, pygame. K_3]:
# Mentse vagy töltse be a játékot a kiválasztott slot alapján
slot_index = event.key - pygame. K_1
select_slot = mentési_helyek [hely_index]

save_game_state (game_state, f"{selected_slot}.savanyú uborka")
nyomtatás(f"A játék mentve {selected_slot}!")

ha esemény.kulcs ban ben [pygame. K_a, pygame. K_b, pygame. K_c]:

slot_index = event.key - pygame. K_a
select_slot = mentési_helyek [hely_index]
game_state = load_game_state(f"{selected_slot}.savanyú uborka")
játékos_x = játék állapota['player_x']
nyomtatás(f"A játék letöltése innen: {selected_slot}!")
# ...

pygame.display.flip()

# ...

Alább látható a kimenet:

Nem szükséges forrásmegjelölés: Képernyőkép: Imran

Felülírási opciók kezelése

A meglévő mentések felülírásának beállításához alkalmazhat egy figyelmeztető üzenetet, amely megerősítést kér a lejátszótól a mentési fájl felülírása előtt. Hozzon létre egy új nevű fájlt overwriting-save.py és módosítsa a kódot az alábbi frissítésekkel:

# Mentse el a játék állapotát
defsave_game_state(játékállapot, fájlnév):
ha os.path.exists (file_name):
# Megerősítés kérése a meglévő mentési fájl felülírásához
felülírás = input("Már létezik a mentési fájl. Szeretné felülírni? (i/n): ")
ha felülír.lower() != 'y':
nyomtatás("Mentés törölve.")
Visszatérés

próbáld ki:
val vel nyitott (fájlnév, "wb") mint fájl:
pickle.dump (játékállapot, fájl)
nyomtatás("A játék állapota sikeresen mentve!")
kivéve IOError:
nyomtatás("Hiba: Nem sikerült menteni a játék állapotát.")

# ...

# A játék állapotának betöltése
defload_game_state(fájl név):
hanem os.path.exists (file_name):
nyomtatás("Hiba: nem létezik mentési fájl.")
VisszatérésEgyik sem

próbáld ki:
val vel nyitott (fájlnév, "rb") mint fájl:
game_state = pickle.load (fájl)
nyomtatás("A játék állapota sikeresen betöltve!")
Visszatérés game_state
kivéve (IOHiba, savanyúság. UnpicklingError):
nyomtatás("Hiba: Nem sikerült betölteni a játék állapotát.")
VisszatérésEgyik sem

# ...

A fenti kódban a játékállapot mentése előtt ellenőrizze, hogy a mentési fájl létezik-e már os.path.exists(). Ha igen, akkor megerősítést kér a lejátszótól a meglévő mentési fájl felülírására. Ha a lejátszó úgy dönt, hogy nem írja felül, a mentési művelet megszakad.

Hasonlóképpen, mielőtt betölt egy játékállapotot, ellenőrizze, hogy a mentési fájl létezik-e os.path.exists(). Ha nem, akkor hibaüzenettel értesíti a játékost.

Mentés és betöltés rendszer legjobb gyakorlatai

Amikor mentési és betöltési rendszert implementál a PyGame-ben vagy bármely játékfejlesztési projektben, vegye figyelembe a következő bevált módszereket:

  • Használjon jól definiált adatstruktúrát a játék állapotának ábrázolásához, és sorosítsa azt egy szerializációs könyvtár segítségével savanyú uborka. Ez lehetővé teszi a teljes játékállapot egyszerű mentését és betöltését.
  • Hozzon létre egy dedikált könyvtárat vagy mappát a mentett fájlok tárolására. Ez segít a mentett fájlok rendezésében, és megakadályozza a játék főkönyvtárának zsúfoltságát.
  • Valósítsa meg a hibakezelést, és tájékoztató hibaüzeneteket adjon a hibakeresés és hibaelhárítás segítése érdekében. Ez segít a játékosoknak megérteni a mentési és betöltési műveletek során felmerülő problémákat.
  • Fontolja meg több mentési rés megvalósítását, hogy a játékosok több játékot is elmentsenek. Ez rugalmasságot biztosít a játékosoknak, hogy felfedezzék a különböző utakat, vagy újrajátsszák a játék bizonyos szakaszait anélkül, hogy felülírnák a fejlődésüket.

Tedd vonzóbbá a játékokat a Mentés és betöltés rendszerrel

A mentés és betöltés funkció hozzáadása nagymértékben növelheti a játék elköteleződését és élvezetét. Lehetővé teszi a játékosok számára, hogy elmentsék fejlődésüket, és akkor térjenek vissza a játékba, amikor nekik kényelmes. Ezenkívül lehetőségeket nyit olyan összetett játékvilágok létrehozására, ahol a játékos döntéseinek és cselekedeteinek maradandó következményei vannak.

A mentési és betöltési rendszer bevezetésével képessé teheti játékosait arra, hogy magával ragadóbb és kielégítőbb játékélményben részesüljenek.