Siit saate teada, kuidas lisada mängu edenemise salvestamise ja laadimise funktsioon sujuvaks mängukogemuseks.

Kaasaegses mänguarenduses on mängu edenemise salvestamise ja laadimise võimalus ülioluline funktsioon, mis suurendab kasutajakogemust ja kaasatust. PyGame, populaarne Pythonis 2D-mängude loomiseks mõeldud raamatukogu, pakub vajalikke tööriistu salvestamise ja laadimise funktsiooni hõlpsaks rakendamiseks.

Lihtsa mängu loomine

Enne alustamist veenduge, et teil on pip teie seadmesse installitud. Pärast pipi installimist käivitage installimiseks allolev käsk pygame moodul:

pip install pygame

PyGame'is salvestamise ja laadimise süsteemi rakendamise illustreerimiseks alustage lihtsa mängu loomisest.

Selles artiklis kasutatud kood on saadaval selles GitHubi hoidla ja seda saate MIT-i litsentsi alusel tasuta kasutada.

Selles mängus on mängijal võimalus liikuda vasakule ja paremale. Siin on koodilõigu näide, mis näitab mängu põhistruktuuri:

importida pygame

# Initsialiseeri Pygame
pygame.init()

instagram viewer

# Seadistage mängu aken
akna_laius = 800
akna_kõrgus = 600
aken = pygame.display.set_mode((akna_laius, akna_kõrgus))
pygame.display.set_caption("Süsteemi salvestamise ja laadimise õpetus")

# Mängu muutujad
mängija_x = 400
mängija_y = 500
mängija_kiirus = 5

# Mängutsükkel
jookseb = Tõsi
samal ajal jooksmine:
jaoks sündmus sisse pygame.event.get():
kui event.type == mängumäng. VÄLJA:
jookseb = Vale

võtmed = pygame.key.get_pressed()
kui võtmed[pygame. K_LEFT]:
mängija_x - = mängija_kiirus
kui võtmed[pygame. K_RIGHT]:
mängija_x += mängija_kiirus

# Tühjendage ekraan
window.fill((0, 0, 0))

# Joonistage mängija
pygame.draw.rect (aken, (255, 255, 255), (mängija_x, mängija_y, 50, 50))

# Värskendage ekraani
pygame.display.flip()

# Lõpeta mäng
pygame.quit()

Mängu oleku ja andmete püsivuse haldamine

Enne salvestamise ja laadimise funktsiooni rakendamist peate looma viisi mängu oleku haldamiseks ja andmete säilitamiseks. Üks levinud lähenemisviis on kasutada Pythoni sõnastikku vastavate mänguandmete salvestamiseks. Siin on näide selle kohta, kuidas saate eelmist koodi muuta, et kaasata mängu oleku haldamine.

# Mängu muutujad
game_state = {
'mängija_x': 400,
'mängija_y': 500
}

# Mängutsükkel
jookseb = Tõsi
samal ajal jooksmine:
# ...

võtmed = pygame.key.get_pressed()
kui võtmed[pygame. K_LEFT]:
mängu olek['mängija_x'] -= mängija_kiirus
kui võtmed[pygame. K_RIGHT]:
mängu olek['mängija_x'] += mängija_kiirus

# ...

pygame.display.flip()

Salvestamise ja laadimise funktsiooni rakendamine

Mängu edenemise salvestamise ja laadimise lubamiseks saate kasutada Pythoni sisseehitatud funktsiooni hapukurk moodul, mis võimaldab meil Pythoni objekte serialiseerida ja deserialiseerida. Looge uus fail nimega save-game.py ja lisage kood koos allolevate värskendustega:

game_state = {
'mängija_x': mängija_x,
'mängija_y': mängija_y
}

# Salvesta mängu olek
defsalvesta_mängu_olek(mängu olek, faili_nimi):
proovige:
koos avatud (faili_nimi, 'wb') nagu fail:
pickle.dump (mängu olek, fail)
print("Mängu oleku salvestamine õnnestus!")
välja arvatud IOError:
print("Viga: mängu olekut ei saa salvestada.")

# Laadige mängu olek
defload_game_state(faili nimi):
proovige:
koos avatud (faili_nimi, "rb") nagu fail:
game_state = pickle.load (fail)
print("Mängu olek laaditi edukalt!")
tagasi mängu_olek
välja arvatud (IOError, hapukurk. UnpicklingError):
print("Viga: mängu olekut ei saa laadida.")

# Mängutsükkel
jookseb = Tõsi
samal ajal jooksmine:

# ...

võtmed = pygame.key.get_pressed()
kui võtmed[pygame. K_LEFT]:
mängija_x - = mängija_kiirus
mängu olek['mängija_x'] = mängija_x
kui võtmed[pygame. K_RIGHT]:
mängija_x += mängija_kiirus
mängu olek['mängija_x'] = mängija_x

kui võtmed[pygame. K_s]:
save_game_state (game_state, 'save_game.pickle')
kui võtmed[pygame. K_l]:
game_state = load_game_state('save_game.pickle')
mängija_x = mängu olek['mängija_x']

# ...

# ...

Allpool on väljund:

Salvestuspesade kasutajaliidese kujundamine

Salvestus- ja laadimisliidese pakkumiseks saate kuvada salvestuspesad, mis võimaldavad mängijal valida, millist pesa salvestada või laadida. Selle näite puhul kuvatakse valikud konsoolis, kuid saate neid kasutada Pythoni GUI raamistikud kasutajasõbralikuma liidese loomiseks.

Loo save_slots loend, mis esindab saadaolevaid salvestuspesasid. Samuti lisage a valitud_pesa muutuja, et jälgida mängija valitud pesa.

Näita saadaolevaid salvestuspesasid, kui mängija vajutab salvestamisnuppu (K_s). Mängija saab valida pesa, vajutades vastavat numbriklahvi (K_1, K_2, või K_3). Kui pesa on valitud, salvestatakse mängu olek valitud pesa järgi nimetatud faili.

Samamoodi, kui mängija vajutab laadimisnuppu (K_l), kuvage salvestuspesad. Mängija saab valida pesa, vajutades klahve K_a, K_b, või K_c mängu oleku laadimiseks. Teise võimalusena saate kasutage puutetundlikke sisendeid pesa valimiseks mõeldud klaviatuurisisendite asemel. Kui pesa on valitud, laaditakse mängu olek vastavast failist.

Looge uus fail nimega interface.py ja lisage kood koos allolevate värskendustega:

# Mängu muutujad
save_slots = ['pesa 1', 2. pesa, 3. pesa]
valitud_pesa = Mitte ühtegi

# Mängutsükkel
jookseb = Tõsi
samal ajal jooksmine:
jaoks sündmus sisse pygame.event.get():
kui event.type == mängumäng. VÄLJA:
jookseb = Vale

kui event.type == mängumäng. KEYDOWN:
kui event.key == mängumäng. K_s:
# Kuva salvestuspesad
valitud_pesa = Mitte ühtegi
jaoks mina, pesa sisse loetlema (save_slots):
print(f"Salvesta pesa {i+1}: {pesa}")
print("Mängu salvestamiseks valige pesa.")

kui event.key == mängumäng. K_l:
print("Valige pesa: - a - pesa 1, b - pesa 3, c - pesa 3")
# Kuva salvestuspesad
valitud_pesa = Mitte ühtegi
jaoks mina, pesa sisse loetlema (save_slots):
print(f"Salvesta pesa {i+1}: {pesa}")
print("Mängu laadimiseks valige pesa.")

kui sündmus.võti sisse [pygame. K_1, pygame. K_2, pygame. K_3]:
# Salvestage või laadige mäng valitud pesa alusel
slot_index = event.key – mängumäng. K_1
valitud_pesa = salvesta_pesad[pesa_indeks]

save_game_state (game_state, f"{selected_slot}.hapukurk")
print(f"Mäng salvestatud {selected_slot}!")

kui sündmus.võti sisse [pygame. K_a, pygame. K_b, pygame. K_c]:

slot_index = event.key – mängumäng. K_a
valitud_pesa = salvesta_pesad[pesa_indeks]
game_state = load_game_state(f"{selected_slot}.hapukurk")
mängija_x = mängu olek['mängija_x']
print(f"Mäng laaditi kohast {selected_slot}!")
# ...

pygame.display.flip()

# ...

Allpool on väljund:

Omistamist pole vaja: Imrani ekraanipilt

Ülekirjutamise valikute käsitlemine

Olemasolevate salvestuste ülekirjutamise valikute pakkumiseks saate rakendada hoiatusteate, mis palub mängijal enne salvestusfaili ülekirjutamist kinnitada. Looge uus fail nimega overwriting-save.py ja muutke koodi järgmiste värskendustega:

# Salvesta mängu olek
defsalvesta_mängu_olek(mängu olek, faili_nimi):
kui os.path.exists (faili_nimi):
# Küsi kinnitust olemasoleva salvestusfaili ülekirjutamiseks
overwrite = input("Salvestatav fail on juba olemas. Kas soovite üle kirjutada? (ja/n): ")
kui kirjuta üle.madalam() != 'y':
print("Salvestamine tühistati.")
tagasi

proovige:
koos avatud (faili_nimi, 'wb') nagu fail:
pickle.dump (mängu olek, fail)
print("Mängu oleku salvestamine õnnestus!")
välja arvatud IOError:
print("Viga: mängu olekut ei saa salvestada.")

# ...

# Laadige mängu olek
defload_game_state(faili nimi):
kuimitte os.path.exists (faili_nimi):
print("Viga: salvestusfaili pole olemas.")
tagasiMitte ühtegi

proovige:
koos avatud (faili_nimi, "rb") nagu fail:
game_state = pickle.load (fail)
print("Mängu olek laaditi edukalt!")
tagasi mängu_olek
välja arvatud (IOError, hapukurk. UnpicklingError):
print("Viga: mängu olekut ei saa laadida.")
tagasiMitte ühtegi

# ...

Ülaltoodud koodis kontrollite enne mängu oleku salvestamist, kas salvestusfail on juba olemas os.path.exists(). Kui see nii on, küsite mängijalt olemasoleva salvestusfaili ülekirjutamise kinnitust. Kui mängija otsustab mitte üle kirjutada, siis salvestamine tühistatakse.

Sarnaselt kontrollite enne mängu oleku laadimist, kas salvestusfail on olemas os.path.exists(). Kui seda ei juhtu, teavitate mängijat veateate abil.

Süsteemi salvestamise ja laadimise parimad tavad

PyGame'is või mõnes mänguarendusprojektis salvestamise ja laadimise süsteemi juurutamisel arvestage järgmiste parimate tavadega.

  • Kasutage mängu oleku esitamiseks täpselt määratletud andmestruktuuri ja seeriaseerige see serialiseerimisteegi abil hapukurk. See võimaldab teil kogu mängu olekut hõlpsalt salvestada ja laadida.
  • Salvestatud failide salvestamiseks looge spetsiaalne kataloog või kaust. See aitab korraldada salvestatud faile ja hoiab ära mängu põhikataloogi segamise.
  • Rakendage veakäsitlust ja esitage informatiivseid veateateid, mis aitavad silumisel ja tõrkeotsingul. See aitab mängijatel mõista kõiki probleeme, mis võivad salvestamise ja laadimise ajal tekkida.
  • Kaaluge mitme salvestuspesa rakendamist, et mängijad saaksid mitu mängu salvestada. See annab mängijatele paindlikkuse, et uurida erinevaid teid või mängida konkreetseid mänguosi, ilma et nad oma edusamme üle kirjutaksid.

Muutke mängud salvestamis- ja laadimissüsteemiga kaasahaaravamaks

Salvestus- ja laadimisfunktsiooni lisamine võib oluliselt suurendada mängu kaasatust ja naudingut. See võimaldab mängijatel salvestada oma edusamme ja naasta mängu neile sobival ajal. Lisaks avab see võimalused keerukate mängumaailmade loomiseks, kus mängija valikutel ja tegevustel on püsivad tagajärjed.

Salvestus- ja laadimissüsteemi rakendamisega saate oma mängijatele kaasahaaravama ja rahuldavama mängukogemuse anda.