Μάθετε πώς να ενσωματώνετε τη λειτουργία αποθήκευσης και φόρτωσης προόδου του παιχνιδιού για μια απρόσκοπτη εμπειρία παιχνιδιού.
Στη σύγχρονη ανάπτυξη παιχνιδιών, η δυνατότητα αποθήκευσης και φόρτωσης της προόδου του παιχνιδιού είναι ένα κρίσιμο χαρακτηριστικό που ενισχύει την εμπειρία και την αφοσίωση του χρήστη. Το PyGame, μια δημοφιλής βιβλιοθήκη για τη δημιουργία παιχνιδιών 2D στην Python, παρέχει τα απαραίτητα εργαλεία για την εφαρμογή της δυνατότητας αποθήκευσης και φόρτωσης χωρίς κόπο.
Δημιουργία ενός απλού παιχνιδιού
Πριν ξεκινήσετε, βεβαιωθείτε ότι έχετε pip εγκατεστημένο στη συσκευή σας. Αφού εγκαταστήσετε το pip, εκτελέστε την παρακάτω εντολή για να εγκαταστήσετε το pygame μονάδα μέτρησης:
pip εγκατάσταση pygame
Για να απεικονίσετε την εφαρμογή ενός συστήματος αποθήκευσης και φόρτωσης στο PyGame, ξεκινήστε δημιουργώντας ένα απλό παιχνίδι.
Ο κώδικας που χρησιμοποιείται σε αυτό το άρθρο είναι διαθέσιμος σε αυτό Αποθετήριο GitHub και είναι δωρεάν για χρήση βάσει της άδειας MIT.
Σε αυτό το παιχνίδι, ο παίκτης θα έχει τη δυνατότητα να κινείται αριστερά και δεξιά. Ακολουθεί ένα παράδειγμα αποσπάσματος κώδικα που δείχνει τη βασική δομή του παιχνιδιού:
εισαγωγή pygame
# Αρχικοποιήστε το Pygame
pygame.init()# Ρυθμίστε το παράθυρο του παιχνιδιού
Παράθυρο_πλάτος = 800
παράθυρο_ύψος = 600
παράθυρο = pygame.display.set_mode((πλάτος_παραθύρου, ύψος_παραθύρου))
pygame.display.set_caption("Εκμάθηση αποθήκευσης και φόρτωσης συστήματος")# Μεταβλητές παιχνιδιού
παίκτης_χ = 400
παίκτης_υ = 500
παίκτη_ταχύτητα = 5# Βρόχος παιχνιδιού
τρέξιμο = Αληθής
ενώ τρέξιμο:
Για Εκδήλωση σε pygame.event.get():
αν event.type == pygame. ΕΓΚΑΤΑΛΕΙΠΩ:
τρέξιμο = Ψευδήςkeys = pygame.key.get_pressed()
αν κλειδιά[pygame. K_LEFT]:
player_x -= player_speed
αν κλειδιά[pygame. K_RIGHT]:
player_x += player_speed# Καθαρίστε την οθόνη
window.fill((0, 0, 0))# Σχεδιάστε τον παίκτη
pygame.draw.rect (παράθυρο, (255, 255, 255), (player_x, player_y, 50, 50))# Ενημερώστε την οθόνη
pygame.display.flip()
# Κλείστε το παιχνίδι
pygame.quit()
Διαχείριση κατάστασης παιχνιδιού και επιμονής δεδομένων
Πριν εφαρμόσετε τη λειτουργία αποθήκευσης και φόρτωσης, πρέπει να δημιουργήσετε έναν τρόπο διαχείρισης της κατάστασης του παιχνιδιού και διατήρησης των δεδομένων. Μια κοινή προσέγγιση είναι να χρησιμοποιήστε ένα λεξικό Python για να αποθηκεύσετε τα σχετικά δεδομένα παιχνιδιού. Ακολουθεί ένα παράδειγμα για το πώς μπορείτε να τροποποιήσετε τον προηγούμενο κώδικα ώστε να συμπεριλάβει τη διαχείριση κατάστασης παιχνιδιού:
# Μεταβλητές παιχνιδιού
κατάσταση_παιχνιδιού = {
'player_x': 400,
'player_y': 500
}# Βρόχος παιχνιδιού
τρέξιμο = Αληθής
ενώ τρέξιμο:
# ...keys = pygame.key.get_pressed()
αν κλειδιά[pygame. K_LEFT]:
κατάσταση_παιχνιδιού['player_x'] -= player_speed
αν κλειδιά[pygame. K_RIGHT]:
κατάσταση_παιχνιδιού['player_x'] += player_speed# ...
pygame.display.flip()
Εφαρμογή της λειτουργίας αποθήκευσης και φόρτωσης
Για να ενεργοποιήσετε την αποθήκευση και τη φόρτωση της προόδου του παιχνιδιού, μπορείτε να αξιοποιήσετε το ενσωματωμένο Python πίκλα ενότητα, η οποία μας επιτρέπει να σειριοποιήσουμε και να αποσειροποιήσουμε αντικείμενα Python. Δημιουργήστε ένα νέο αρχείο με όνομα save-game.py και προσθέστε τον κωδικό με τις παρακάτω ενημερώσεις:
κατάσταση_παιχνιδιού = {
'player_x': player_x,
'player_y': player_y
}# Αποθήκευση κατάστασης παιχνιδιού
defsave_game_state(game_state, file_name):
δοκιμάστε:
με άνοιγμα (όνομα_αρχείου, 'wb') όπως και αρχείο:
pickle.dump (game_state, αρχείο)
Τυπώνω("Η κατάσταση του παιχνιδιού αποθηκεύτηκε με επιτυχία!")
εκτός Σφάλμα IO:
Τυπώνω("Σφάλμα: Δεν είναι δυνατή η αποθήκευση της κατάστασης του παιχνιδιού.")# Φόρτωση κατάστασης παιχνιδιού
defload_game_state(όνομα αρχείου):
δοκιμάστε:
με άνοιγμα (όνομα_αρχείου, 'rb') όπως και αρχείο:
game_state = pickle.load (αρχείο)
Τυπώνω("Η κατάσταση του παιχνιδιού φορτώθηκε με επιτυχία!")
ΕΠΙΣΤΡΟΦΗ game_state
εκτός (IOError, τουρσί. Unpickling Error):
Τυπώνω("Σφάλμα: Δεν είναι δυνατή η φόρτωση της κατάστασης του παιχνιδιού.")# Βρόχος παιχνιδιού
τρέξιμο = Αληθής
ενώ τρέξιμο:# ...
keys = pygame.key.get_pressed()
αν κλειδιά[pygame. K_LEFT]:
player_x -= player_speed
κατάσταση_παιχνιδιού['player_x'] = player_x
αν κλειδιά[pygame. K_RIGHT]:
player_x += player_speed
κατάσταση_παιχνιδιού['player_x'] = player_xαν κλειδιά[pygame. K_s]:
save_game_state (game_state, 'save_game.pickle')
αν κλειδιά[pygame. K_l]:
game_state = load_game_state('save_game.pickle')
παίκτη_χ = κατάσταση_παιχνιδιού['player_x']
# ...
# ...
Παρακάτω είναι η έξοδος:
Σχεδιασμός διεπαφής χρήστη για αποθήκευση κουλοχέρηδων
Για να παράσχετε μια διεπαφή αποθήκευσης και φόρτωσης, μπορείτε να εμφανίσετε υποδοχές αποθήκευσης που επιτρέπουν στη συσκευή αναπαραγωγής να επιλέξει ποια υποδοχή να αποθηκεύσει ή να φορτώσει. Για αυτό το παράδειγμα, οι επιλογές εμφανίζονται στην κονσόλα, αλλά μπορείτε να τις χρησιμοποιήσετε Τα πλαίσια GUI της Python για τη δημιουργία μιας πιο φιλικής διεπαφής.
Δημιουργώ ένα save_slots λίστα που αντιπροσωπεύει τις διαθέσιμες θέσεις αποθήκευσης. Επίσης, προσθέστε ένα επιλεγμένη_υποδοχή μεταβλητή για να παρακολουθείτε την υποδοχή που έχει επιλέξει ο παίκτης.
Εμφάνιση των διαθέσιμων θέσεων αποθήκευσης όταν η συσκευή αναπαραγωγής πατήσει το κουμπί αποθήκευσης (K_s). Ο παίκτης μπορεί να επιλέξει μια υποδοχή πατώντας το αντίστοιχο αριθμητικό πλήκτρο (K_1, K_2, ή K_3). Εάν επιλεγεί μια υποδοχή, η κατάσταση του παιχνιδιού αποθηκεύεται σε ένα αρχείο με το όνομα της επιλεγμένης υποδοχής.
Ομοίως, όταν η συσκευή αναπαραγωγής πατήσει το κουμπί φόρτωσης (K_l), εμφανίστε τις υποδοχές αποθήκευσης. Ο παίκτης μπορεί να επιλέξει μια υποδοχή πατώντας τα πλήκτρα K_a, K_b, ή K_c για να φορτώσετε την κατάσταση του παιχνιδιού. Εναλλακτικά, μπορείτε χρησιμοποιήστε εισόδους αφής αντί για εισόδους πληκτρολογίου για επιλογή υποδοχής. Εάν επιλεγεί μια υποδοχή, η κατάσταση του παιχνιδιού φορτώνεται από το αντίστοιχο αρχείο.
Δημιουργήστε ένα νέο αρχείο με όνομα interface.py και προσθέστε τον κωδικό με τις παρακάτω ενημερώσεις:
# Μεταβλητές παιχνιδιού
save_slots = ['Υποδοχή 1', 'Υποδοχή 2', 'Υποδοχή 3']
επιλεγμένη_σχισμή = Κανένας# Βρόχος παιχνιδιού
τρέξιμο = Αληθής
ενώ τρέξιμο:
Για Εκδήλωση σε pygame.event.get():
αν event.type == pygame. ΕΓΚΑΤΑΛΕΙΠΩ:
τρέξιμο = Ψευδήςαν event.type == pygame. KEYDOWN:
αν event.key == pygame. K_s:
# Εμφάνιση θέσεων αποθήκευσης
επιλεγμένη_σχισμή = Κανένας
Για i, υποδοχή σε απαρίθμηση (save_slots):
Τυπώνω(f"Αποθήκευση υποδοχής {i+1}: {θυρίδα}")
Τυπώνω("Επιλέξτε μια υποδοχή για να αποθηκεύσετε το παιχνίδι.")αν event.key == pygame. K_l:
Τυπώνω("Επιλογή υποδοχής:- a - Υποδοχή 1, b - Υποδοχή 3, γ - Υποδοχή 3")
# Εμφάνιση θέσεων αποθήκευσης
επιλεγμένη_σχισμή = Κανένας
Για i, υποδοχή σε απαρίθμηση (save_slots):
Τυπώνω(f"Αποθήκευση υποδοχής {i+1}: {θυρίδα}")
Τυπώνω("Επιλέξτε μια υποδοχή για να φορτώσετε το παιχνίδι.")αν συμβάν.κλειδί σε [pygame. K_1, pygame. K_2, pygame. K_3]:
# Αποθηκεύστε ή φορτώστε το παιχνίδι με βάση την επιλεγμένη υποδοχή
slot_index = event.key - pygame. K_1
Selected_slot = save_slots[slot_index]
save_game_state (game_state, φά"{selected_slot}.πίκλα")
Τυπώνω(f"Το παιχνίδι αποθηκεύτηκε {selected_slot}!")αν συμβάν.κλειδί σε [pygame. K_a, pygame. K_b, pygame. K_c]:
slot_index = event.key - pygame. K_a
Selected_slot = save_slots[slot_index]
game_state = load_game_state(φά"{selected_slot}.πίκλα")
παίκτη_χ = κατάσταση_παιχνιδιού['player_x']
Τυπώνω(f"Το παιχνίδι φορτώθηκε από {selected_slot}!")
# ...pygame.display.flip()
# ...
Παρακάτω είναι η έξοδος:
Χειρισμός επιλογών αντικατάστασης
Για να παρέχετε επιλογές για την αντικατάσταση υπαρχουσών αποθηκευμένων αρχείων, μπορείτε να εφαρμόσετε ένα προειδοποιητικό μήνυμα που ζητά από τη συσκευή αναπαραγωγής επιβεβαίωση πριν την αντικατάσταση ενός αρχείου αποθήκευσης. Δημιουργήστε ένα νέο αρχείο με όνομα overwriting-save.py και τροποποιήστε τον κώδικα με τις παρακάτω ενημερώσεις:
# Αποθήκευση κατάστασης παιχνιδιού
defsave_game_state(game_state, file_name):
αν os.path.exists (όνομα_αρχείου):
# Ζητήστε επιβεβαίωση για την αντικατάσταση του υπάρχοντος αρχείου αποθήκευσης
αντικατάσταση = εισαγωγή("Η αποθήκευση αρχείου υπάρχει ήδη. Θέλετε να αντικαταστήσετε; (y/n): ")
αν overwrite.lower() != 'εε':
Τυπώνω("Η αποθήκευση ακυρώθηκε.")
ΕΠΙΣΤΡΟΦΗδοκιμάστε:
με άνοιγμα (όνομα_αρχείου, 'wb') όπως και αρχείο:
pickle.dump (game_state, αρχείο)
Τυπώνω("Η κατάσταση του παιχνιδιού αποθηκεύτηκε με επιτυχία!")
εκτός Σφάλμα IO:
Τυπώνω("Σφάλμα: Δεν είναι δυνατή η αποθήκευση της κατάστασης του παιχνιδιού.")# ...
# Φόρτωση κατάστασης παιχνιδιού
defload_game_state(όνομα αρχείου):
ανδεν os.path.exists (όνομα_αρχείου):
Τυπώνω("Σφάλμα: Η αποθήκευση του αρχείου δεν υπάρχει.")
ΕΠΙΣΤΡΟΦΗΚανέναςδοκιμάστε:
με άνοιγμα (όνομα_αρχείου, 'rb') όπως και αρχείο:
game_state = pickle.load (αρχείο)
Τυπώνω("Η κατάσταση του παιχνιδιού φορτώθηκε με επιτυχία!")
ΕΠΙΣΤΡΟΦΗ game_state
εκτός (IOError, τουρσί. Unpickling Error):
Τυπώνω("Σφάλμα: Δεν είναι δυνατή η φόρτωση της κατάστασης του παιχνιδιού.")
ΕΠΙΣΤΡΟΦΗΚανένας
# ...
Στον παραπάνω κώδικα, πριν αποθηκεύσετε μια κατάσταση παιχνιδιού, ελέγχετε εάν το αρχείο αποθήκευσης υπάρχει ήδη χρησιμοποιώντας os.path.exists(). Εάν συμβεί αυτό, ζητάτε από τη συσκευή αναπαραγωγής επιβεβαίωση να αντικαταστήσει το υπάρχον αρχείο αποθήκευσης. Εάν η συσκευή αναπαραγωγής επιλέξει να μην αντικαταστήσει, η λειτουργία αποθήκευσης ακυρώνεται.
Ομοίως, πριν φορτώσετε μια κατάσταση παιχνιδιού, ελέγχετε εάν το αρχείο αποθήκευσης υπάρχει χρησιμοποιώντας os.path.exists(). Εάν όχι, ενημερώνετε τη συσκευή αναπαραγωγής με ένα μήνυμα σφάλματος.
Βέλτιστες πρακτικές για αποθήκευση και φόρτωση συστήματος
Κατά την εφαρμογή ενός συστήματος αποθήκευσης και φόρτωσης στο PyGame ή σε οποιοδήποτε έργο ανάπτυξης παιχνιδιών, λάβετε υπόψη τις ακόλουθες βέλτιστες πρακτικές:
- Χρησιμοποιήστε μια καλά καθορισμένη δομή δεδομένων για να αναπαραστήσετε την κατάσταση του παιχνιδιού και να τη σειριοποιήσετε χρησιμοποιώντας μια βιβλιοθήκη σειριοποίησης όπως πίκλα. Αυτό σας επιτρέπει να αποθηκεύσετε και να φορτώσετε ολόκληρη την κατάσταση του παιχνιδιού εύκολα.
- Δημιουργήστε έναν αποκλειστικό κατάλογο ή φάκελο για την αποθήκευση αποθηκευμένων αρχείων. Αυτό βοηθά στην οργάνωση των αποθηκευμένων αρχείων και αποτρέπει την ακαταστασία του κύριου καταλόγου του παιχνιδιού.
- Εφαρμόστε τη διαχείριση σφαλμάτων και παρέχετε ενημερωτικά μηνύματα σφάλματος για να βοηθήσετε στον εντοπισμό σφαλμάτων και την αντιμετώπιση προβλημάτων. Αυτό βοηθά τους παίκτες να κατανοήσουν τυχόν προβλήματα που μπορεί να προκύψουν κατά τη λειτουργία αποθήκευσης και φόρτωσης.
- Εξετάστε το ενδεχόμενο εφαρμογής πολλαπλών κουλοχέρηδων αποθήκευσης για να επιτρέψετε στους παίκτες να έχουν πολλαπλές αποθηκευμένες επιλογές παιχνιδιών. Αυτό δίνει στους παίκτες την ευελιξία να εξερευνήσουν διαφορετικά μονοπάτια ή να επαναλάβουν συγκεκριμένα τμήματα του παιχνιδιού χωρίς να αντικαταστήσουν την πρόοδό τους.
Κάντε τα παιχνίδια πιο ελκυστικά με το σύστημα αποθήκευσης και φόρτωσης
Η προσθήκη της δυνατότητας αποθήκευσης και φόρτωσης μπορεί να βελτιώσει σημαντικά την αφοσίωση και την απόλαυση ενός παιχνιδιού. Επιτρέπει στους παίκτες να αποθηκεύσουν την πρόοδό τους και να επιστρέψουν στο παιχνίδι όποτε τους βολεύει. Επιπλέον, ανοίγει δυνατότητες για τη δημιουργία πολύπλοκων κόσμων παιχνιδιών, όπου οι επιλογές και οι ενέργειες των παικτών έχουν μόνιμες συνέπειες.
Εφαρμόζοντας ένα σύστημα αποθήκευσης και φόρτωσης, μπορείτε να δώσετε τη δυνατότητα στους παίκτες σας να έχουν μια πιο καθηλωτική και ικανοποιητική εμπειρία παιχνιδιού.