- แผนเกม:
- แผนภูมิวงจรรวม:
- ข้อกำหนดเบื้องต้น:
- การเขียนโปรแกรม Arduino สำหรับเกม Space Race:
- การทำงานของเกม Arduino Space Racer:
การเขียนโปรแกรมเป็นเรื่องสนุกมาโดยตลอดและดีขึ้นมากเมื่อใช้แพลตฟอร์มการพัฒนาเช่น Arduino โปรแกรมเมอร์เกือบทุกคนที่นี่จะพยายามพัฒนาเกมบางประเภทโดยใช้ภาษาที่พวกเขาเรียนรู้ / ฝึกฝน สิ่งนี้ช่วยให้พวกเขาปรับแต่งทักษะการเขียนโปรแกรมได้อย่างสนุกสนานและมีประสิทธิผล ฉันเป็นแฟนตัวยงของ Arduino มาตั้งแต่ฉันได้รู้จักกับมันและอยากจะลองทำอะไรเจ๋ง ๆ กับมันอยู่เสมอเมื่อฉันพบว่ามันเจ๋งแค่ไหนกับจอ LCD แบบกราฟิกเช่น Nokia 5110 พร้อมกับ Arduino ความคิดในการพัฒนาเกม เตะเข้ามันเป็นวิธีที่น่าสนใจในการปรับแต่งทักษะการเขียนโปรแกรมเพียงเล็กน้อยและสนุกไปพร้อม ๆ กันดังนั้นแม้ว่าพวกคุณอาจสนใจที่จะพัฒนาเกมของคุณด้วยเช่นกัน ดังนั้นในการกวดวิชานี้เราจะได้เรียนรู้วิธีการที่เราสามารถสร้างเกมที่มีคุณค่าโดยใช้ Arduino และแอลซีดีแบบกราฟิก
เราได้สร้างเกมงูแบบเก่าโดยใช้ Arduino แล้วดังนั้นคราวนี้เรากำลังลองสิ่งใหม่ ๆ และเราตั้งชื่อเกมนี้ว่าSpace Race Gameที่คุณต้องทำให้เรือของคุณปลอดภัยจากเรือศัตรูโดยใช้จอยสติ๊ก
แผนเกม:
ก่อนที่เราจะเริ่มเกมเป็นสิ่งสำคัญมากที่จะต้องวางแผนว่าเกมของคุณจะทำงานอย่างไร ฉันใช้ Nokia5110 Graphical LCD และ Joystick สำหรับการเลือกฮาร์ดแวร์ของฉัน ฉันคิดว่าในบทช่วยสอนนี้คุณได้เลือกเช่นเดียวกัน เนื่องจาก Nokia 5110 มีพื้นที่ไม่มากเราจึงวางแผนเกมทั้งหมดของเราไว้ในความละเอียด 84 * 48 พิกเซลของจอแสดงผลของเรา เราได้ทำแบบฝึกหัดเกี่ยวกับวิธีการเชื่อมต่อ Nokia 5110 LCD กับ Arduino และจอยสติ๊กกับ Arduino แล้ว
ภายในพื้นที่นี้เราต้องพอดีกับพื้นที่เล่นเกมและพื้นที่กระดานคะแนนซึ่งจะแสดงสิ่งต่างๆเช่นคะแนนและสิ่งของต่างๆ เป็นสิ่งสำคัญมากที่จะต้องทราบตำแหน่งพิกเซลของตำแหน่งที่คุณวางสิ่งของเพื่อติดตามตำแหน่งพิกเซลและอัปเดตบนหน้าจอ
เมื่อกำหนดลักษณะหน้าจอเกมแล้วเราต้องตัดสินใจเลือกตัวละครในเกมของเรา สำหรับเกมของฉันเรามีเพียงสองตัวละครผู้เล่นซึ่งเป็นยานอวกาศและตัวละครศัตรูซึ่งควรมีลักษณะเหมือนยานอวกาศของมนุษย์ต่างดาว Nokia LCD สามารถแสดงภาพบิตแมปได้ดังนั้นฉันจึงตัดสินใจใช้ตัวเลือกนั้นเพื่อแสดงยานอวกาศของฉันและศัตรู
ดังนั้นเราจะมียานอวกาศที่กำลังแล่นผ่านยานอวกาศของมนุษย์ต่างดาวยานอวกาศนี้จะมีสามช่องทางในการเปลี่ยนแปลงเพื่อหลีกเลี่ยงการตีกับเอเลี่ยน ตลอดเวลาที่เอเลี่ยนสามารถครอบครองแทร็กได้เพียงสองแทร็กและผู้เล่นควรจะขับรถผ่านแทร็กฟรีได้ เมื่อแนวคิดเหล่านี้ได้ข้อสรุปแล้วเราสามารถดำเนินการกับฮาร์ดแวร์แล้วจึงทำการเขียนโปรแกรม
แผนภูมิวงจรรวม:
วงจรสำหรับเกม Arduinoนี้ง่ายมาก เราต้องเชื่อมต่อโมดูล LCD Nokia 5110 และจอยสติ๊กกับ Arduino แผนภาพวงจรทั้งหมดแสดงอยู่ด้านล่าง
Nokia 5110 LCD ทำงานร่วมกับ 3.3V และโมดูลจอยสติ๊กทำงานได้ลูกชาย 5V ดังนั้นตรวจสอบให้แน่ใจว่าคุณเชื่อมต่อ LCD กับ 3.3V เท่านั้นเนื่องจาก 5V อาจทำให้เกิดความเสียหายอย่างถาวร LCD สื่อสารกับ Arduino ผ่านโปรโตคอล SPI และ Joystick จะอ่าน ADC เพื่ออ่านการเปลี่ยนแปลงของแรงดันไฟฟ้าเท่านั้น การตั้งค่าการเชื่อมต่อจะมีลักษณะดังนี้ด้านล่าง
ข้อกำหนดเบื้องต้น:
ก่อนที่เราจะดำดิ่งลงไปในส่วนของการเขียนโปรแกรมเป็นสิ่งสำคัญสำหรับคุณที่จะต้องสะดวกกับโมดูลการแสดงผลและจอยสติ๊กดังนั้นคุณสามารถใช้บทช่วยสอนต่อไปนี้เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับพวกเขาจากนั้นกลับมาที่นี่เพื่อให้แน่ใจว่าสิ่งต่างๆทำงานได้ตามที่เรา จำเป็นต้องใช้!
- Nokia 5110 LCD เชื่อมต่อกับ Arduino
- โมดูลจอยสติ๊กที่เชื่อมต่อกับ Arduino
การเขียนโปรแกรม Arduino สำหรับเกม Space Race:
โปรแกรมที่สมบูรณ์สำหรับการเล่นเกมที่สามารถพบได้ในตอนท้ายของหน้านี้; คุณสามารถใช้งานได้โดยตรงบน Arduino IDE ของคุณและอัปโหลดไปยังบอร์ดของคุณ แต่ถ้าคุณอยากรู้ว่าเกิดอะไรขึ้นในโค้ดก็อ่านเพิ่มเติม
เช่นเคยเราเริ่มโปรแกรมด้วยการเพิ่มไฟล์ส่วนหัวไลบรารีของเราเราต้องการไลบรารีสามไลบรารีสำหรับโปรเจ็กต์นี้ซึ่งไลบรารี SPI จะถูกเพิ่มลงใน IDE ของคุณโดยค่าเริ่มต้น ต้องดาวน์โหลดอีกสองไลบรารีจากหน้า Adafruit Github ทำตามบทช่วยสอนการเชื่อมต่อ LCD ที่กล่าวถึงในส่วนข้อกำหนดเบื้องต้นหากคุณไม่แน่ใจว่าจะเพิ่มไลบรารีได้อย่างไร
# รวม
หากคุณทำตามบทช่วยสอนคุณควรทราบว่าสามารถแสดงภาพบิตแมปใน LCDได้ ดังนั้นเราจึงต้องแปลงภาพที่ต้องการเป็นรหัสบิตแมปโดยใช้ซอฟต์แวร์ที่กล่าวถึงในบทช่วยสอนคุณสามารถเลือกภาพใดก็ได้จากอินเทอร์เน็ตและใช้โดยการแปลงเป็นรหัสบิตแมป ตรวจสอบให้แน่ใจว่าภาพนั้นเรียบง่ายเพียงพอที่จะแสดงบนหน้าจอ LCD ของเราตรวจสอบภาพตัวอย่างก่อนที่จะลองบนหน้าจอ LCD ในโปรแกรมของเราเราได้ใช้อักขระบิตแมปสองตัวตัวหนึ่งคือยานอวกาศและอีกตัวคือเรือรบศัตรูรหัสบิตแมปสำหรับทั้งสองจะถูกเพิ่มในโค้ดของเราดังที่แสดงด้านล่าง
// ข้อมูลบิตแมปสำหรับ SpaceShip คงที่ไม่ได้ลงนามถ่าน PROGMEM ship = { B00000000, B00000000, B00000001, B00000000, B00000011, B10000000, B00000010, B10000000, B00000010, B11000000, B00000111, B11000000, B00001101, B00000001, B00000000, B00000011, B10000000, B00000010, B10000000, B00000010, B11000000, B00000111, B11000000, B00001101, B00000001, B00000000, B00000011, B10000000, B00000010, B10000000, B00000010, B11000000, B00000111, B11000000, B00001101, B11100000, B000111111, B110000, B110000 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, };
เราต้องระบุหมุดที่ 5110 จอแสดงผลแอลซีดีโนเกีย จะเชื่อมต่อกับจอแสดงผลมีการสื่อสารโดยใช้การสื่อสาร SPI หากคุณทำตามแผนภาพด้านบนรหัสสำหรับเริ่มต้น LCD จะเป็นดังนี้คุณไม่จำเป็นต้องเปลี่ยน
Adafruit_PCD8544 display = Adafruit_PCD8544 (7, 6, 5, 4, 3); // specifiy หมุดที่จอแอลซีดีมีการเชื่อมต่อ
ภายในฟังก์ชั่น การตั้งค่า เราเพียงแค่เริ่ม Serial monitor ที่อัตรารับส่งข้อมูล 9600เพื่อให้เราสามารถแก้จุดบกพร่องจากนั้นเริ่มต้นจอแสดงผล LCD นอกจากนี้เรายังต้องตั้งค่าความคมชัดของจอแสดงผล LCD ด้วยซึ่งจอแสดงผลแต่ละจอจะทำงานได้ดีที่สุดในระดับคอนทราสต์ที่แตกต่างกันดังนั้นควรใช้ค่าเพื่อตรวจสอบว่าเหมาะสมกับคุณ ในที่สุดเราก็ล้างหน้าจอแสดงผลเพื่อเริ่มต้นใหม่
การตั้งค่าเป็นโมฆะ () { Serial.begin (9600); // Serial Monitor สำหรับการดีบัก display.begin (); // เริ่มการสื่อสาร LCD display.setContrast (30); // ตั้งค่าความคมชัดของ display.clearDisplay (); // ล้างหน้าจอแล้วเริ่มใหม่ }
ทันทีที่หน้าจอจะถูกล้างเรากระโดดลงไปใน วง ฟังก์ชั่นและมีเราแสดงหน้าจอเกมหน้าจอเกมไม่มีอะไรนอกจากจะแสดงโครงกระดูกพื้นฐานของเกมพร้อมกับคะแนนและระดับความเร็ว เราได้ใช้ฟังก์ชันเส้นเพื่อลากเส้นสามเส้นเป็นเส้นขอบและทางด้านขวาเราจะแสดงคะแนนข้อความและความเร็วเช่นเดียวกับอุปกรณ์เล่นเกมมือถือย้อนยุครุ่นเก่า
เป็นโมฆะ gamescreen () { // วาดเส้นขอบสำหรับหน้าจอ display.drawLine (0, 0, 0, 47, BLACK); display.drawLine (50, 0, 50, 47, ดำ); display.drawLine (0, 47, 50, 47, ดำ); // ป้อนข้อความเริ่มต้น display.setTextSize (1); display.setTextColor (สีดำ); display.setCursor (52,2); display.println ("ความเร็ว"); display.setCursor (54,12); display.println (game_speed); 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--; control = false;} // ลดตำแหน่งของยานอวกาศ อื่นถ้า (Joy_X> 712 && POS! = 3 && control == true) // ถ้าจอยสติ๊กเคลื่อนที่ไปทางขวา {POS ++; control = false;} // ตำแหน่งที่เพิ่มขึ้นของยานอวกาศ อื่นถ้า (Joy_X> 502 && Joy_X <522) // ถ้าจอยสติ๊กกลับไปที่ตำแหน่งเริ่มต้น control = true; // เตรียมไว้ล่วงหน้าสำหรับการย้ายครั้งต่อไป // อินพุตจากผู้ใช้ที่ได้รับ
หลังจากได้รับตำแหน่งของยานอวกาศจากผู้ใช้เราจะต้องวางยานอวกาศไว้ที่สถานที่นั้น เราใช้ฟังก์ชันด้านล่างและส่งผ่านค่าของตำแหน่งเป็นพารามิเตอร์จากนั้นขึ้นอยู่กับตำแหน่งที่ยานอวกาศวางอยู่ในรางตามลำดับ
เป็นโมฆะ player_car (char pos) // วางยานอวกาศตามตำแหน่งที่ผู้ใช้เลือก { if (pos == 1) display.drawBitmap (2, 32, ship, 15, 15, BLACK); ถ้า (pos == 2) display.drawBitmap (18, 32, ship, 15, 15, BLACK); ถ้า (pos == 3) display.drawBitmap (34, 32, ship, 15, 15, BLACK); }
ตอนนี้ยานอวกาศของเราวางอยู่บนหน้าจอและพร้อมสำหรับการแข่งแล้วเราต้องแนะนำเรือรบศัตรูที่จะแข่งขันพร้อมกับผู้เล่น ทุกครั้งที่เรือศัตรูข้ามหน้าจอเราจะถือว่าเขาตายและเมื่อเขาตายเราต้องสร้างยานอวกาศใหม่ ฟังก์ชันด้านล่างจะเหมือนกัน สร้างตำแหน่งใหม่สำหรับเรือรบศัตรูสองลำและวางไว้ที่ด้านบนของหน้าจอ
ถ้า (ศัตรู_dead) // ตรวจสอบเรือรบศัตรูตาย {// ถ้าพวกมันเป็น ศัตรูที่ ตายแล้ว_0_pos = POS; // สร้างศัตรูตัวแรกเหนือเรืออวกาศศัตรู_1_pos = สุ่ม (0,4); // สร้างศัตรูที่แยกตัวออกมาในสถานที่สุ่มอื่น ๆ ศัตรู _ เฟส = 0; // นำศัตรูมาสร้าง top ศัตรู _dead = false; // ศัตรูถูกสร้างขึ้นดังนั้นพวกเขาจึงไม่ตายอีกต่อไป }
หลังจากวางเรือรบศัตรูไว้ที่ด้านบนของหน้าจอแล้วเราจะต้องนำมันลงมาเพื่อให้หอกราวกับว่าผู้เล่นของเรากำลังแข่งขึ้นไปโดยเราต้องเพิ่มระยะ (ตำแหน่งที่แสดงภาพ) เพื่อให้ มันลงมาอย่างช้าๆ เช่นเดียวกันกับเรือรบศัตรูทั้งสองลำดังที่แสดงด้านล่าง
ศัตรู _ เรือรบ (ศัตรู _0_pos, ศัตรู _ เฟส); ศัตรู _ เฟส ++; // วางศัตรูตัวแรกบนหน้าจอและขับไล่เขาลง ศัตรู (ศัตรู_1_pos, ศัตรู _ เฟส); ศัตรู _ เฟส ++; // วางศัตรูที่อยู่บนหน้าจอและไล่เขาลง
ฟังก์ชัน ศัตรู _ship แสดงไว้ด้านล่างซึ่งคล้ายกับฟังก์ชันรถของผู้เล่นมาก แต่ที่นี่เรามีพารามิเตอร์สองตัว หนึ่งคือการวางศัตรูในการติดตามและอีกอันคือการเคลื่อนย้ายศัตรูไปทางด้านล่าง
เป็นโมฆะ enemy_ship (สถานที่ int เฟส int) // เพลส enemy_ship ในสถานที่ใหม่และเฟส { if (สถาน == 1) display.drawBitmap (2 เฟส, ศัตรู, 15, 15, สีดำ); ถ้า (สถานที่ == 2) display.drawBitmap (18, เฟส, ศัตรู, 15, 15, BLACK); ถ้า (สถานที่ == 3) display.drawBitmap (34, เฟส, ศัตรู, 15, 15, BLACK); }
โค้ดชิ้นต่อไปควรตรวจสอบว่ายานอวกาศหลบหลีกเรือศัตรูหรือไม่ ในการตรวจสอบสิ่งนี้เราจำเป็นต้องทราบตำแหน่งของเรือรบศัตรูและยานอวกาศของผู้เล่น เนื่องจากเรารู้ทุกอย่างแล้วเราจึงต้องตรวจสอบว่าตำแหน่งเรืออวกาศเหมือนกับเรือศัตรูหรือไม่ เราตรวจสอบสิ่งนี้เฉพาะในกรณีที่เรือของศัตรูเข้าใกล้ยานอวกาศเท่านั้น หากผู้เล่นไม่ได้หลีกเลี่ยงศัตรูนั่นหมายถึงเกมจบ
ถ้า (ศัตรู _ เฟส> 22 && ((ศัตรู _0_pos == POS) - (ศัตรู_1_pos == POS))) // ถ้ายานอวกาศสัมผัสกับศัตรูคนใดคนหนึ่ง game_over (); // แสดงเกมจบ
หากผู้เล่นมีการหลีกเลี่ยงศัตรูประสบความสำเร็จแล้วเราควรฆ่าศัตรูและให้ผู้เล่นจุดในการทำเช่นนี้เราเพียงแค่ตรวจสอบว่าศัตรูมาถึงด้านล่างของหน้าจอหรือไม่และถ้าเราฆ่าโดยใช้รหัสด้านล่าง
ถ้า (ศัตรู _ เฟส> 40) // ถ้าเรืออวกาศหนีศัตรูออกไป { ศัตรู_dead = จริง; คะแนน ++;} // เพิ่มคะแนนและฆ่าศัตรู
มันจะสนุกขนาดไหนถ้าเราไม่เพิ่มความยากของเกมเพราะเราได้คะแนนสูง ๆ ดังนั้นเราจะใช้ฟังก์ชั่นอื่นซึ่งจากนั้นจะตรวจสอบคะแนนของผู้เล่นและขึ้นอยู่กับคะแนนก็จะเพิ่มความเร็วของเกมความเร็วถูกควบคุมโดยใช้ฟังก์ชันหน่วงเวลาซึ่งจะควบคุมช่วงเวลาการรีเฟรชของเกมจึงทำให้เร็วหรือช้า
เป็นโมฆะ Level_Controller () // เพิ่มความเร็วของเกมตามคะแนน { if (คะแนน> = 0 && คะแนน <= 10) // ถ้าคะแนน 0-10 { game_speed = 0; ล่าช้า (80); // ทำให้เกมช้าลง 80ms } if (score> 10 && score <= 20) // If score 10-40 { game_speed = 1; ล่าช้า (70); // ทำให้เกมช้าลง 70ms } if (score> 20 && score <= 30) // If score 20-40 { game_speed = 2; ล่าช้า (60); // ทำให้เกมช้าลง 60ms } if (score> 30 && score <= 40) // If score 30-40 { game_speed = 3; ล่าช้า (50); // ทำให้เกมช้าลง 50ms } }
การทำงานของเกม Arduino Space Racer:
หลังจากแน่ใจว่าเข้าใจฮาร์ดแวร์และโปรแกรมแล้วเพียงแค่สร้างวงจรและอัปโหลดรหัสไปยังบอร์ด Arduino คุณควรสังเกตว่าเกมเริ่มต้นตามที่แสดงด้านล่าง
ใช้จอยสติ๊กเพื่อหลบหนีเรือศัตรูโดยเลื่อนไปทางซ้ายหรือขวา เพื่อหลีกเลี่ยงศัตรูแต่ละคนคุณจะได้รับคะแนนเพิ่มขึ้นทีละคน เมื่อคะแนนสูงขึ้นความเร็วของเกมก็จะเพิ่มขึ้นด้วยนั่นคือความเร็วที่เพิ่มขึ้น 10ms สำหรับทุกๆ 10 คะแนนที่คุณทำคะแนนได้ คุณสามารถดำเนินการต่อและสร้างเกมนี้เพื่อแนะนำระดับใหม่ ๆ หรือทำการเปลี่ยนแปลงฮาร์ดแวร์บางอย่างเพื่อควบคุมเกมแม้ว่าจะเคลื่อนไหวโดยใช้มาตรความเร่ง ความคิดสร้างสรรค์คือขีด จำกัด เดียว สำหรับการอ้างอิงคุณเรียนรู้การใช้ Accelerometer กับ Arduino ที่นี่
หวังว่าคุณจะเข้าใจโครงการและสนุกกับการสร้างมัน หากคุณประสบปัญหาในการทำให้สิ่งนี้ใช้งานได้โปรดโพสต์ปัญหาในส่วนความคิดเห็นด้านล่างหรือใช้ฟอรัมเพื่อขอความช่วยเหลือด้านเทคนิค มีความสุขในการเล่นเกม !!
ตรวจสอบรหัสที่สมบูรณ์และการสาธิตวิดีโอด้านล่าง