תכנות תמיד היה מהנה וזה פשוט השתפר הרבה יותר עם פלטפורמות פיתוח כמו Arduino. כמעט כל מתכנת כאן היה מנסה לפתח משחק כלשהו באמצעות השפה שהם לומדים / מתרגלים. זה עוזר להם לכוון את כישורי התכנות שלהם בצורה מהנה אך פרודוקטיבית. הייתי מעריץ גדול של Arduino מאז שהתוודעתי אליו ותמיד רציתי לנסות איתו משהו מגניב, כשגיליתי כמה זה יכול להיות מגניב עם LCD גרפי כמו Nokia 5110 יחד עם Arduino הרעיון שלי לפתח משחק בעט פנימה. זו הייתה דרך מעניינת לכוון כמה מיומנויות תכנות וליהנות בו זמנית, אז למרות שגם אתם עשויים להיות מעוניינים לפתח את המשחק שלכם. לפיכך, במדריך זה נלמד כיצד נוכל ליצור משחק הגון באמצעות ארדואינו ו- LCD גרפי.
בנינו כבר את משחק הנחש המיושן הזה באמצעות ארדואינו, אז הפעם אנחנו מנסים משהו חדש ושמנו את המשחק הזה כמשחק מירוץ החלל שבו אתה צריך לשמור על הספינה שלך מאוניות האויב באמצעות ג'ויסטיק.
תוכנית משחק:
לפני שנתחיל, חשוב מאוד לתכנן כיצד המשחק שלך באמת יעבוד. הלכתי עם ה- LCD הגרפי Nokia5110 וג'ויסטיק לבחירת החומרה שלי. אני מניח במדריך זה שגם בחרת אותו דבר. מכיוון שנוקיה 5110 אינו מגיע עם הרבה מקום, אנו מתכננים את כל המשחק שלנו ברזולוציית 84 * 48 פיקסלים של התצוגה שלנו. כבר הכנו הדרכות כיצד לממשק את נוקיה 5110 LCD עם ארדואינו וג'ויסטיק עם ארדואינו.
בתוך שטח זה עלינו להשתלב היטב באזור המשחקים ובאזור לוח הניקוד שיציג דברים כמו ניקוד ודברים. חשוב מאוד לדעת את מיקום הפיקסלים שבו אתה מציב דברים כדי לעקוב אחר מיקומי הפיקסלים ולעדכן אותם על המסך.
לאחר שהוחלט על מראה מסך המשחק עלינו להחליט על הדמויות במשחק שלנו. למשחק שלי יש לנו רק שניים, דמות השחקן שהיא ספינת חלל ודמות אויב שצריכה להיראות כמו חללית זרה. LCD ה- Nokia יכול להציג תמונות של מפת סיביות, אז החלטתי להשתמש באפשרות זו כדי להציג את ספינת החלל שלי ואת האויבים.
אז תהיה לנו ספינת חלל שתרצה דרך חלליות החייזרים, לחללית זו יהיו שלושה נתיבים לשינויים על מנת למנוע מכה עם החייזרים. בכל עת החייזרים יכולים לתפוס שני מסלולים בלבד והשחקן אמור להיות מסוגל לנסוע דרך המסלול החינמי. לאחר סיום רעיונות אלה אנו יכולים להמשיך עם החומרה ואז על התכנות.
תרשים מעגל:
המעגל למשחק ארדואינו זה פשוט מאוד; עלינו רק לממשק את מודול ה- Nokia 5110 LCD ואת הג'ויסטיק עם Arduino. תרשים המעגל המלא מוצג להלן
LCD 5110 של נוקיה עובד עם 3.3 וולט ומודול הג'ויסטיק עובד בן 5 וולט, אז וודא שאתה מחבר את ה- LCD עם 3.3 וולט בלבד, מכיוון ש -5 וולט עלול לפגוע בו לצמיתות. ה- LCD מתקשר עם Arduino באמצעות פרוטוקול SPI והג'ויסטיק קורא רק ADC כדי לקרוא את שינוי המתח. הגדרת החיבור תיראה ככה למטה
דרישות קדם:
לפני שנצלול לחלק התכנותי חשוב לכם להיות נוחים עם מודול התצוגה והג'ויסטיק, כך שתוכלו להשתמש בהדרכות הבאות כדי לדעת יותר עליהם ואז לחזור לכאן כדי לוודא שהדברים עובדים כמו שאנחנו צריך את זה!
- ממשק נוקיה 5110 LCD עם ארדואינו
- מודול ג'ויסטיק המתממשק עם Arduino
תכנות Arduino למשחק מירוץ החלל:
את התוכנית המלאה למשחק תוכלו למצוא בסוף עמוד זה; אתה יכול להשתמש בו ישירות ב- Arduino IDE שלך ולהעלות אותו ללוח שלך. אבל אם אתה רוצה לדעת מה באמת קורה בתוך הקוד אז קרא עוד.
כמו תמיד אנו מתחילים את התוכנית שלנו עם הוספת קבצי כותרת הספרייה שלנו, אנו זקוקים לשלוש ספריות לפרויקט זה, מתוכם ספריית SPI מתווספת ל- IDE כברירת מחדל. יש להוריד את שתי הספריות האחרות מדף Adafruit Github. עקוב אחר המדריך לממשקי LCD המוזכר בסעיף דרישות הקדם אם אינך בטוח כיצד להוסיף את הספרייה.
#לִכלוֹל
אם עקבת אחר ההדרכה, עליך לדעת כי ניתן להציג את תמונות מפת הסיביות על גבי LCD. לכן עלינו להמיר את התמונה הנדרשת לקוד מפת סיביות באמצעות תוכנה המוזכרת במדריך, תוכלו לבחור כל תמונה מהאינטרנט ולהשתמש בה על ידי המרתם לקוד מפת סיביות. וודא שהתמונה פשוטה דיה להצגתה על גבי מסך ה- LCD שלנו, בדוק את התצוגה המקדימה לפני שתנסה בפועל על מסך ה- LCD. בתוכנית שלנו השתמשנו בשתי תווי מפת סיביות האחת היא ספינת החלל והשנייה היא ספינת האויב, קוד מפת הסיביות לשניהם נוסף בקוד שלנו כמוצג להלן.
// נתוני מפת סיביות עבור ספינת PROSMEM חסרת חתימה const סטטית const = { B00000000, B00000000, B00000001, B00000000, B00000011 , B10000000, B00000010, B10000000, B00000010, B11000000, B00000111, B11000000, B00001101, B11100000, B11111111, B11111111 B01111111, B11111100, B01111111, B11111100, B01111111, B11111100, B00011111, B11110000, B00000111, B11100000, B00000000, B00000000, }; // נתוני מפת סיביות לאויבות סטטית const ללא חתום PROGMEM אויב = { B00000101, B11000000, B00001011, B11100000, B00000011, B11100000, B00110011, B11111000, B01111111, B11111100, B10111111, B11111010, B01110111, B11011100, B01111110, B11111100, B00111111, B11111100, B11101111, B11101110, B11000001, B00000110, B10000001, B00000010, B10000000, B00000010, B00000000, B00000000, };
עלינו לציין את הפינים אליהם מחובר צג ה- Nokia 5110. התצוגה מתקשרת באמצעות תקשורת SPI. אם עקבת אחר דיאגרמת המעגל לעיל, הקוד לאתחול ה- LCD יהיה כדלקמן, ואינך צריך לשנות אותו.
תצוגה של Adafruit_PCD8544 = Adafruit_PCD8544 (7, 6, 5, 4, 3); // ציין את הפינים אליהם מחובר ה- LCD
בתוך פונקציית ההתקנה, אנו פשוט מפעילים את המסך הסידורי בקצב שידור של 9600 כדי שנוכל לנקות באגים ואז לאתחל את תצוגת ה- LCD. עלינו גם להגדיר את הניגודיות של תצוגת ה- LCD, כל צג יעבוד הכי טוב ברמת ניגודיות שונה, אז שחקו עם הערך כדי לבדוק מה מתאים לכם ביותר. לבסוף אנו גם מנקים את מסך התצוגה כדי להתחיל טרי.
הגדרת חלל () { Serial.begin (9600); // צג סידורי לניפוי באגים display.begin (); // התחל את תצוגת התקשורת LCD.setContrast (30); // הגדר את הניגודיות של תצוגת התצוגה .clearDisplay (); // מנקה את המסך ומתחיל חדש }
ברגע שהמסך נוקה אנו קופצים לפונקציית הלולאה ושם אנו מציגים את מסך המשחק. מסך המשחק אינו אלא מציג שלד בסיסי למשחק יחד עם ציון ורמת המהירות. השתמשנו בפונקציית הקו כדי לצייר שלוש קווים כגבולות ולימין אנו מציגים את ציון הטקסט ואת המהירות בדיוק כמו מכשירי המשחק הרטרו הישנים.
מסך המשחקים הריק () { // צייר את הגבול לתצוגת המסך . DrawLine (0, 0, 0, 47, BLACK); display.drawLine (50, 0, 50, 47, BLACK); display.drawLine (0, 47, 50, 47, BLACK); // הזן טקסטים המוגדרים כברירת מחדל display.setTextSize (1); display.setTextColor (שחור); display.setCursor (52,2); display.println ("מהירות"); display.setCursor (54,12); display.println (משחק_מהירות); display.setCursor (52,25); display.println ("ציון"); display.setCursor (54,35); display.println (ניקוד); }
בשלב הבא עלינו לקבל את הקלט מהמשתמש כדי לאפשר לו / לה לשלוט בספינת החלל. הקלט יתקבל ממודול הג'ויסטיק המחובר לסיכה A1. הערך האנלוגי מהחיישן יהיה 512 אם הוא לא מועבר ויגדל וירד כאשר יועבר לאורך ציר ה- X. אנו משתמשים בערכים אלה כדי לקבוע אם המשתמש רוצה לעבור שמאלה או ימינה. עליך לקרוא את ממשק הג'ויסטיק למערך Arduino המוזכר בתנאים המוקדמים אם אתה מתקשה להבין את התוכנית שלהלן.
// קבל קלט מהמשתמש Joy_X = analogRead (A1); // קרא את ה- X vaue מ- Joystick if (Joy_X <312 && POS! = 1 && control == true) // אם מקל השמחה נע ימינה {POS--; שליטה = שקר;} // ירידה במיקום של חללית אחרת אם (Joy_X> 712 && POS! = 3 && control == true) // אם מקל השמחה נע ימינה {POS ++; control = false;} // מיקום תוספת של חללית אחרת אם (Joy_X> 502 && Joy_X <522) // אם ג'ויסטיק חוזר לבקרת מיקום ראשונית = true; // הכינו אותו למהלך הבא // קלט ממשתמש שהתקבל
לאחר קבלת מיקום החללית מהמשתמש עלינו למקם את ספינת החלל במקום המסוים הזה. אנו משתמשים בפונקציה שלהלן ומעבירים את ערך המיקום כפרמטר, ואז בהתבסס על המיקום שאוניית החלל ממוקמת במסלול שלה.
void player_car (char pos) // הצב את החללית על סמך המיקום שנבחר על ידי המשתמש { if (pos == 1) display.drawBitmap (2, 32, ship, 15, 15, BLACK); אם (pos == 2) display.drawBitmap (18, 32, ספינה, 15, 15, שחור); if (pos == 3) display.drawBitmap (34, 32, ship, 15, 15, BLACK); }
עכשיו כשחלליתנו מוצבת על המסך ומוכנה למרוץ עלינו להציג את ספינות האויב שיתמודדו יחד עם השחקן. בכל פעם שספינת אויב חוצה את המסך אנו מניחים שהוא מת וכשהוא מת עלינו ליצור ספינת חלל חדשה. הפונקציה שלהלן עושה בדיוק את אותו הדבר. זה יוצר עמדה חדשה לשתי ספינות אויב ומניח אותן בחלק העליון של המסך.
אם (אויב_מת) // בדיקת ספינות האויב מתות {// אם הן מתות אויב_0_pos = קופה; // ליצור אויב ראשון מעל ספינת החלל אויב_1_פו = אקראית (0,4); // ליצור אויב מבודד במקום אקראי אחר . // תביא את האויב מהאויב העליון = שקר; // האויב נוצר כך שהם כבר לא מתים }
לאחר הצבת ספינות האויב בחלקו העליון של המסך עלינו להפיל אותו כך שהוא יתחפר כאילו השחקן שלנו רץ מעלה, כדי לעשות זאת עלינו רק להגדיל את השלב (המקום בו מוצגת התמונה) כך זה יורד לאט. הדבר נעשה עבור שתי ספינות האויב כפי שמוצג להלן
ספינת אויב (אויב_0_pos, שלב_אויב); שלב_אויב ++; // הציבו את האויב הראשון על המסך והורידו אותו אל ספינת האויב (אויב_1_פוז, שלב האויב); שלב_אויב ++; // הציבו את האויב המבולבל על המסך והסיעו אותו למטה
הפונקציה אויב_ספינה מוצגת למטה, היא דומה מאוד לפונקציית מכונית השחקן אך כאן יש לנו שני פרמטרים. האחד נועד להצבת האויב על מסלול והשני הוא להנעת האויב לעבר הקרקעית.
בטל ספינת האויב (int מקום, int int) // הצב את ספינת האויב במקום ובשלב החדשים { if (place == 1) display.drawBitmap (2, phase, אויב, 15, 15, BLACK); אם (מקום == 2) display.drawBitmap (18, שלב, אויב, 15, 15, שחור); אם (מקום == 3) display.drawBitmap (34, שלב, אויב, 15, 15, שחור); }
פיסת הקוד הבאה צריכה לבדוק אם ספינת החלל התחמקה מספינת האויב. כדי לבדוק זאת עלינו לדעת את מיקומן של ספינות האויב ואת ספינת החלל של השחקן. מכיוון שאנו יודעים את כל זה עלינו רק לבדוק אם מיקום ספינת החלל זהה לספינת האויב. אנו בודקים זאת רק אם ספינת האויב הגיעה ליד ספינת החלל. אם השחקן לא התחמק מהאויב זה אומר המשחק נגמר.
אם (שלב האויב> 22 && ((אויב_0_pos == קופה) - (אויב_1_pos == קופה))) // אם ספינת החלל נוגעת במישהו מהאויב game_over (); // הצגת המשחק נגמרת
אם השחקן התחמק מהאויב בהצלחה, עלינו להרוג את האויב ולתת לשחקן נקודה. לשם כך אנו בודקים אם האויב הגיע לתחתית המסך ואם כן אנו הורגים אותו באמצעות הקוד שלמטה
אם (שלב האויב> 40) // אם ספינת החלל בורחת מהאויבים {אויב_מת = נכון; ניקוד ++;} // הגדל את הציון והרג את האויבים
איזה כיף זה יהיה, אם לא נגדיל את הקושי במשחק מכיוון שנקבל ציונים גבוהים. לכן אנו משתמשים בפונקציה אחרת אשר אחר כך עוקבת אחר ציון השחקן ועל סמך הציון היא תגדיל את מהירות המשחק. המהירות נשלטת למעשה באמצעות פונקציית ההשהיה זה ישלוט על מרווח הרענון של המשחק ובכך יהפוך אותו למהיר או איטי.
בטל Level_Controller () // הגדל את מהירות המשחק בהתבסס על הציון. { if (score> = 0 && score <= 10) // If score 0-10 { game_speed = 0; עיכוב (80); // להאט את המשחק 80ms } אם (ציון> 10 && ציון <= 20) // אם ציון 10-40 { game_speed = 1; עיכוב (70); // להאט את המשחק ב -70 ms } אם (ציון> 20 && ציון <= 30) // אם ניקוד 20-40 { game_speed = 2; עיכוב (60); // להאט את המשחק ב- 60ms } אם (ציון> 30 && ציון <= 40) // אם ניקוד 30-40 { game_speed = 3; עיכוב (50); // להאט את המשחק ב 50ms } }
משחק מירוץ החלל של ארדואינו:
לאחר שתוודא שהחומרה והתוכנית מובנים, פשוט בנה את המעגל והעלה את הקוד ללוח Arduino. עליך לשים לב למשחק שמתחיל כפי שמוצג להלן
השתמש בג'ויסטיק כדי לברוח מספינת האויב על ידי מעבר שמאלה או ימינה. על הימנעות מכל אויב תקבל את הציון שלך מוגדל באחד. כאשר הציון עולה גבוה גם מהירות המשחק תגדל, כלומר עליית המהירות ב- 10ms על כל 10 נקודות שתקלע. אתה יכול להמשיך ולבנות על המשחק הזה כדי להציג רמות חדשות או לבצע שינויים מסוימים בחומרה כדי לשלוט בו באמצעות תנועה באמצעות מד תאוצה. יצירתיות היא הגבול היחיד. לעיונך אתה לומד להשתמש במאיץ עם ארדואינו כאן.
מקווה שהבנתם את הפרויקט ונהניתם לבנות אותו. אם נתקלת בבעיה כלשהי בהפעלת פעולה זו, אל תהסס לפרסם את הבעיה בסעיף ההערות למטה או להשתמש בפורומים לעזרה טכנית. משחק שמח !!
בדוק את הקוד המלא ואת סרטון ההפגנה למטה.