Προγραμματισμός 2D παιχνιδιών στο C Tutorial: Φίδι

click fraud protection

Ο σκοπός αυτού του εκπαιδευτικού είναι να διδάξει τον προγραμματισμό 2D παιχνιδιών και τη γλώσσα C μέσω παραδειγμάτων. Ο συντάκτης χρησιμοποίησε για να προγραμματίσει παιχνίδια στα μέσα της δεκαετίας του '80 και ήταν ένας σχεδιαστής παιχνιδιών στο MicroProse για ένα χρόνο στη δεκαετία του '90. Παρόλο που ένα μεγάλο μέρος αυτού δεν έχει σημασία για τον προγραμματισμό των μεγάλων 3D παιχνιδιών του σήμερα, για τα μικρά casual παιχνίδια θα χρησιμεύσει ως μια χρήσιμη εισαγωγή.

Εφαρμογή του φιδιού

Τα παιχνίδια όπως το φίδι όπου τα αντικείμενα κινούνται πάνω σε ένα πεδίο 2D μπορούν να αντιπροσωπεύουν τα αντικείμενα του παιχνιδιού είτε σε ένα πλέγμα 2D είτε ως μία σειρά αντικειμένων διαστάσεων. "Αντικείμενο" εδώ σημαίνει οποιοδήποτε αντικείμενο παιχνιδιού, όχι αντικείμενο όπως χρησιμοποιείται σε αντικειμενοστραφή προγραμματισμό.

Έλεγχοι παιχνιδιών

Τα πλήκτρα κινούνται με W = up, A = αριστερά, S = κάτω, D = δεξιά. Πατήστε Esc για να τερματίσετε το παιχνίδι, f για εναλλαγή ρυθμού καρέ (αυτό δεν είναι συγχρονισμένο στην οθόνη έτσι μπορεί να είναι γρήγορο), πλήκτρο tab για εναλλαγή πληροφοριών debug και p για παύση. Όταν σταματήσει να αλλάζει η λεζάντα και το φίδι αναβοσβήνει,

instagram viewer

Στο φίδι τα κύρια αντικείμενα του παιχνιδιού είναι

  • Το φίδι
  • Παγίδες και φρούτα

Για σκοπούς παιχνιδιού, μια σειρά από ints θα κρατήσει κάθε αντικείμενο παιχνιδιού (ή μέρος για το φίδι). Αυτό μπορεί επίσης να βοηθήσει κατά την απόδοση των αντικειμένων στην προσωρινή μνήμη οθόνης. Έχω σχεδιάσει τα γραφικά για το παιχνίδι ως εξής:

  • Οριζόντια Φίδι Σώμα - 0
  • Κατακόρυφο Σώμα Φίδι - 1
  • Κεφάλι σε περιστροφές 4 x 90 μοίρες 2-5
  • Οπίσθια σε περιστροφές 4 x 90 μοίρες 6-9
  • Καμπύλες αλλαγής κατεύθυνσης. 10-13
  • Apple - 14
  • Φράουλα - 15
  • Μπανάνα - 16
  • Παγίδα - 17
  • Δείτε το αρχείο γραφικών snake snake.gif

Επομένως, έχει νόημα να χρησιμοποιούμε αυτές τις τιμές σε ένα τύπο πλέγματος που ορίζεται ως block [WIDTH * HEIGHT]. Επειδή υπάρχουν μόνο 256 τοποθεσίες στο δίκτυο, έχω επιλέξει να τις αποθηκεύσω σε έναν πίνακα διαστάσεων. Κάθε συντεταγμένη στο πλέγμα 16 x16 είναι ένας ακέραιος αριθμός 0-255. Έχουμε χρησιμοποιήσει ints έτσι θα μπορούσατε να κάνετε το πλέγμα μεγαλύτερο. Όλα ορίζονται από #defines με WIDTH και HEIGHT και τα 16. Δεδομένου ότι τα γραφικά φιδιών είναι 48 x 48 εικονοστοιχεία (GRWIDTH και GRHEIGHT #defines) το παράθυρο ορίζεται αρχικά ως 17 x GRWIDTH και 17 x GRHEIGHT για να είναι ελαφρώς μεγαλύτερο από το δίκτυο.

Αυτό έχει οφέλη στην ταχύτητα του παιχνιδιού καθώς η χρήση δύο δεικτών είναι πάντα πιο αργή από τη μία, αλλά σημαίνει ότι αντί να προσθέσετε ή αφαιρέσετε 1 από τις συντεταγμένες Υ του φιδιού για να μετακινηθείτε κάθετα, αφαιρείτε το WIDTH. Προσθέστε 1 για να μετακινηθείτε δεξιά. Παρόλα αυτά, ορίζουμε μια μακροεντολή l (x, y) η οποία μετατρέπει τις συντεταγμένες x και y στο χρόνο σύνταξης.

Τι είναι μια μακροεντολή;

 #define l (X, Y) (Y * WIDTH) + Χ

Η πρώτη σειρά είναι δείκτης 0-15, 2ο 16-31 κλπ. Εάν το φίδι βρίσκεται στην πρώτη στήλη και κινείται προς τα αριστερά, πρέπει να ελέγξετε αν η συντεταγμένη% WIDTH == 0 και το δεξιό τοίχωμα συντονίζονται% WIDTH == WIDTH-1. Το% είναι ο χειριστής συντελεστή C (όπως η αριθμητική ρολογιού) και επιστρέφει το υπόλοιπο μετά τη διαίρεση. 31 div 16 αφήνει ένα υπόλοιπο 15.

Διαχείριση του φιδιού

Υπάρχουν τρία μπλοκ (int συστοιχίες) που χρησιμοποιούνται στο παιχνίδι.

  • φίδι [], ένα προσωρινό buffer
  • shape [] - Κρατάει τους δείκτες γραφικών Snake
  • dir [] - Διατηρεί την κατεύθυνση κάθε τμήματος του φιδιού, συμπεριλαμβανομένου του κεφαλιού και της ουράς.

Κατά την έναρξη του παιχνιδιού, το φίδι είναι δύο τμήματα μακρύ με ένα κεφάλι και μια ουρά. Και οι δύο μπορούν να δείχνουν σε 4 κατευθύνσεις. Για το βορρά το κεφάλι είναι δείκτης 3, η ουρά είναι 7, για την ανατολική κεφαλή είναι 4, η ουρά είναι 8, για το νότιο κεφάλι είναι 5 και η ουρά είναι 9 και για τη δύση το κεφάλι είναι 6 και η ουρά είναι 10. Ενώ το φίδι είναι δύο τμήματα μακρύ το κεφάλι και η ουρά είναι πάντα 180 μοίρες μεταξύ τους, αλλά μετά το φίδι μεγαλώνει μπορούν να είναι 90 ή 270 βαθμούς.

Το παιχνίδι αρχίζει με το κεφάλι στραμμένο προς τα βόρεια στη θέση 120 και με την ουρά στραμμένη προς τα νότια στα 136, κατά προσέγγιση κεντρική. Με ένα μικρό κόστος περίπου 1.600 bytes αποθήκευσης, μπορούμε να αποκτήσουμε μια αισθητή βελτίωση της ταχύτητας στο παιχνίδι κρατώντας τις θέσεις του φιδιού στο ρυθμιστικό δακτυλιδιού [] του φιδιού που αναφέρεται παραπάνω.

Τι είναι ένα απομακρυσμένο buffer;

Ένα προσωρινό buffer είναι ένα μπλοκ μνήμης που χρησιμοποιείται για την αποθήκευση μιας ουράς που έχει σταθερό μέγεθος και πρέπει να είναι αρκετά μεγάλη ώστε να κρατά όλα τα δεδομένα. Σε αυτή την περίπτωση, είναι μόνο για το φίδι. Τα δεδομένα ωθούνται στην μπροστινή πλευρά της ουράς και αφαιρούνται από την πίσω πλευρά. Εάν το μπροστινό μέρος της ουράς χτυπά στο τέλος του μπλοκ, τότε τυλίγει. Όσο το μπλοκ είναι αρκετά μεγάλο, το μπροστινό μέρος της ουράς δεν θα καλύψει ποτέ την πλάτη.

Κάθε θέση του φιδιού (δηλαδή, η μοναδική συντεταγμένη int) από την ουρά έως την κεφαλή (δηλ., Προς τα πίσω) αποθηκεύεται στο προσωρινό buffer. Αυτό δίνει οφέλη ταχύτητας, επειδή δεν έχει σημασία πόσο καιρό το φίδι παίρνει, μόνο το κεφάλι, η ουρά και το πρώτο τμήμα μετά το κεφάλι (αν υπάρχει) πρέπει να αλλάξουν καθώς κινείται.

Η αποθήκευση του προς τα πίσω είναι επίσης επωφελής επειδή όταν το φίδι παίρνει φαγητό, το φίδι θα αυξηθεί όταν μετακινηθεί στη συνέχεια. Αυτό γίνεται με τη μετακίνηση της θέσης μιας κεφαλής στο buffer του δακτυλίου και την αλλαγή της παλιάς θέσης κεφαλής για να γίνει τμήμα. Το φίδι αποτελείται από ένα κεφάλι, 0-n τμήματα), και στη συνέχεια μια ουρά.

Όταν το φίδι τρώει φαγητό, η μεταβλητή αφαίρεσης τροφής ρυθμίζεται στο 1 και ελέγχεται στη λειτουργία DoSnakeMove ()

Μετακίνηση του φιδιού

Χρησιμοποιούμε δύο μεταβλητές δείκτη, headindex και tailindex για να δείξουμε τις θέσεις κεφαλής και ουράς στο buffer του δακτυλίου. Αυτές ξεκινούν από το 1 (headindex) και το 0. Έτσι, η θέση 1 στο buffer του δακτυλίου κρατά την θέση (0-255) του φιδιού στον πίνακα. Η θέση 0 κρατά την θέση της ουράς. Όταν το φίδι μετακινείται σε μία θέση προς τα εμπρός, τόσο η ουρά και η κεφαλή αυξάνεται κατά ένα, περιτυλίγοντας το γύρο στο 0 όταν φθάνουν τα 256. Έτσι τώρα η θέση που ήταν το κεφάλι είναι όπου βρίσκεται η ουρά.

Ακόμα και με ένα πολύ μακρύ φίδι που είναι τυλιγμένο και συρρικνωμένο λένε 200 τμήματα. μόνο το headindex, το τμήμα δίπλα στο κεφάλι και το tailindex αλλάζουν κάθε φορά που μετακινείται.

Σημείωση λόγω του τρόπου SDL έργα, πρέπει να σχεδιάσουμε ολόκληρο το φίδι σε κάθε πλαίσιο. Κάθε στοιχείο τραβιέται μέσα στην προσωρινή μνήμη του πλαισίου και στη συνέχεια ανασηκώνεται έτσι εμφανίζεται. Αυτό έχει ένα πλεονέκτημα αν και θα μπορούσαμε να σχεδιάσουμε το φίδι ομαλά κινούμενο μερικά pixel, όχι μια ολόκληρη θέση στο πλέγμα.

instagram story viewer