תכנות משחק דו מימדי במדריך C: נחש

click fraud protection

מטרת הדרכה זו היא ללמד תכנות משחק דו מימדי ושפת C באמצעות דוגמאות. הכותב נהג לתכנת משחקים באמצע שנות השמונים והיה מעצב משחק ב- MicroProse במשך שנה בשנות ה -90. למרות שחלק גדול מכך אינו רלוונטי לתכנות של משחקי תלת מימד גדולים של ימינו, עבור משחקים מזדמנים קטנים זה ישמש מבוא שימושי.

הטמעת נחש

משחקים כמו נחש שבהם אובייקטים נעים מעל שדה דו מימדי יכולים לייצג את חפצי המשחק או ברשת 2D או כמערך ממדים יחיד של אובייקטים. "אובייקט" פירוש כאן כל אובייקט משחק, לא אובייקט כפי שהוא משמש בתכנות מונחה עצמים.

בקרות משחק

המקשים נעים עם W = למעלה, A = שמאל, S = למטה, D = ימין. לחץ על Esc כדי לצאת מהמשחק, f כדי להחליף את קצב הפריימים (זה לא מסונכרן לתצוגה כך שיכול להיות מהיר), לחץ על מקש הכרטיסייה כדי להחליף מידע על ניפוי באגים ו- p כדי להשהות אותו. כאשר מושהה הכיתוב משתנה והנחש מהבהב,

בנחש אובייקטים המשחק העיקריים הם

  • הנחש
  • מלכודות ופירות

למטרות משחק, מערך של אינצים יחזיק כל חפץ משחק (או חלק לנחש). זה יכול לעזור גם בעת העברת האובייקטים למאגר המסך. עיצבתי את הגרפיקה של המשחק באופן הבא:

  • גוף נחש אופקי - 0
  • גוף נחש אנכי - 1
  • instagram viewer
  • ראש בסיבובים 4 x 90 מעלות 2-5
  • זנב בסיבובים של 4X90 מעלות 6-9
  • עקומות למטרות שינוי. 10-13
  • אפל - 14
  • תות - 15
  • בננה - 16
  • מלכודת - 17
  • צפה בקובץ הגרפיקה של הנחש snake.gif

אז הגיוני להשתמש בערכים אלה בסוג רשת המוגדר כבלוק [WIDTH * HEIGHT]. מכיוון שיש רק 256 מיקומים ברשת שבחרתי לאחסן אותה במערך ממדי יחיד. כל קואורדינטה ברשת 16 x16 היא מספר שלם 0-255. השתמשנו בניירות כדי שתוכל להגדיל את הרשת. הכל מוגדר על ידי # מוגדר עם WIDTH וגובה שניהם 16. מאחר שגרפיקה של הנחש היא 48X48 פיקסלים (GRWIDTH ו- GRHEIGHT #defines), החלון מוגדר בתחילה כ- 17 x GRWIDTH ו- 17 x GRHEIGHT כך שיהיה פשוט מעט גדול יותר מהרשת.

יש לכך יתרונות במהירות המשחק מכיוון ששימוש בשני אינדקסים הוא איטי תמיד מאחד, אבל זה אומר במקום להוסיף או לחסר 1 מקואורדינטות ה- Y של הנחש כדי לנוע בצורה אנכית, אתם מחסירים את הרוחב. הוסף 1 כדי לזוז ימינה. עם זאת בהיותנו ערמומיים הגדרנו גם מאקרו l (x, y) שממיר את קואורדינטות ה- x ו- y בזמן הקומפילציה.

מהו מאקרו?

 # הגדר l (X, Y) (Y * WIDTH) + X

השורה הראשונה היא אינדקס 0-15, השנייה 16-31 וכו '. אם הנחש נמצא בעמודה הראשונה ונעה שמאלה אז הסימון לפגיעה בקיר, לפני שתעבור שמאלה, צריך לבדוק אם קואורדינטות% WIDTH == 0 ולגבי הקואורדינטה של ​​הקיר הימני% WIDTH == WIDTH-1. ה-% הוא מפעיל המודולוס C (כמו חשבון אבן שעון) ומחזיר את יתרת לאחר חלוקה. 31 div 16 משאיר שארית של 15.

ניהול הנחש

ישנם שלושה בלוקים (מערכי int) המשמשים במשחק.

  • נחש [], מאגר טבעות
  • צורה [] - מחזיקה באינדקסים גרפיים של נחש
  • dir [] - שומר על הכיוון של כל קטע בנחש כולל ראש וזנב.

בתחילת המשחק, הנחש הוא שני מקטעים עם ראש וזנב. שניהם יכולים להצביע בארבעה כיוונים. עבור צפון הראש הוא אינדקס 3, הזנב הוא 7, עבור הראש המזרחי הוא 4, הזנב הוא 8, עבור הראש הדרומי הוא 5 והזנב הוא 9, ולמערב, הראש הוא 6 והזנב הוא 10. בעוד שהנחש הוא שני קטעים, הראש והזנב הם תמיד 180 מעלות זה מזה, אך לאחר שהנחש גדל הם יכולים להיות 90 או 270 מעלות.

המשחק מתחיל כשהראש פונה צפונה במיקום 120 והזנב פונה דרומה ב 136, בערך מרכזי. בעלות קלה של כ -1,600 בתים של אחסון, אנו יכולים להשיג שיפור מהירות מורגש במשחק על ידי החזקת מיקומי הנחש במאגר הטבעת של הנחש [] שהוזכר לעיל.

מהו מאגר טבעות?

מאגר צלצולים הוא גוש זיכרון המשמש לאחסון תור בגודל קבוע ועליו להיות גדול מספיק כדי להחזיק את כל הנתונים. במקרה זה, זה רק בשביל הנחש. הנתונים נדחפים בקדמת התור ומורידים את הגב. אם חזית התור פוגעת בסוף הבלוק, אז היא מתעטפת. כל עוד החסימה גדולה מספיק, חזית התור לעולם לא תדביק את הגב.

כל מיקום הנחש (כלומר, קואורדינטת האינטציה היחידה) מהזנב לראש (כלומר לאחור) מאוחסן במאגר הטבעת. זה נותן יתרונות מהירות מכיוון שלא משנה כמה זמן ייקח הנחש, צריך לשנות רק את הראש, הזנב והקטע הראשון אחרי הראש (אם הוא קיים) תוך כדי תנועה.

אחסון זה לאחור מועיל גם מכיוון שכאשר הנחש מקבל אוכל, הנחש יגדל כאשר הוא יעבור לאחר מכן. זה נעשה על ידי הזזת מיקום אחד במאגר הטבעת ושינוי מיקום הראש הישן להפוך לקטע. הנחש מורכב מראש, מקטעי 0-n) ואז זנב.

כאשר הנחש אוכל אוכל, משתנה ההגנה מוגדר ל- 1 ונבדק בפונקציה DoSnakeMove ()

העברת הנחש

אנו משתמשים בשני משתני אינדקס, headindex ו- tailindex כדי להצביע על מיקומי הראש והזנב במאגר הטבעת. אלה מתחילים ב -1 (headindex) ו- 0. אז מיקום 1 במאגר הטבעת מחזיק את המיקום (0-255) של הנחש על הלוח. מיקום 0 מחזיק את מיקום הזנב. כאשר הנחש זז מיקום אחד קדימה, הן הזנב והראש האינדקס מצטברים על ידי אחד, עוטפים את הסיבוב ל 0 כאשר הם מגיעים ל 256. אז עכשיו המיקום שהיה הראש הוא היכן שהזנב נמצא.

אפילו עם נחש ארוך מאוד המתפתל ומפותל במילים 200 קטעים. רק ראש האינדקס, הקטע לצד הראש והזנב הזנב משתנים בכל פעם שהוא זז.

שימו לב בגלל הדרך SDL עובד, עלינו לצייר את כל הנחש בכל מסגרת. כל אלמנט נמשך למאגר המסגרת ואז מועבר כך שהוא מוצג. יש לכך יתרון אחד בכך שנוכל לצייר את הנחש בצורה חלקה המניע כמה פיקסלים, ולא מיקום שלם של רשת.

instagram story viewer