- Oyun planı:
- Devre şeması:
- Ön koşullar:
- Uzay Yarışı Oyunu için Arduino Programlama:
- Arduino Space Racer Game çalışma:
Programlama her zaman eğlenceliydi ve Arduino gibi geliştirme platformlarıyla çok daha iyi hale geldi. Buradaki hemen hemen her programcı, öğrendikleri / uyguladıkları dili kullanarak bir tür oyun geliştirmeye çalışırdı. Bu, programlama becerilerini eğlenceli ama üretken bir şekilde ayarlamalarına yardımcı olur. Arduino ile tanıştığımdan beri büyük bir Arduino hayranıyım ve onunla her zaman harika bir şey denemek istedim, Arduino ile birlikte Nokia 5110 gibi bir Grafik LCD ile ne kadar havalı olabileceğini öğrendiğimde bir oyun geliştirme fikrim Başladı. Birkaç programlama becerisini ayarlamanın ve aynı anda eğlenmenin ilginç bir yoluydu, bu yüzden oyununuzu geliştirmekle de ilgilenebilirsiniz. Bu nedenle, bu eğitimde Arduino ve Grafik LCD'leri kullanarak Nasıl Decent Game oluşturabileceğimizi öğreneceğiz.
Arduino'yu kullanarak o eski moda Snake oyununu zaten yaptık, bu yüzden bu sefer yeni bir şey deniyoruz ve bu oyunu, joystick kullanarak geminizi düşman gemilerinden korumanız gereken Uzay Yarışı Oyunu olarak adlandırdık.
Oyun planı:
Başlamadan önce, oyunun gerçekte nasıl çalışacağını planlamak çok önemlidir. Donanım seçimim için Nokia5110 Grafik LCD ve Joystick ile gittim. Bu eğitimde sizin de aynısını seçtiğinizi varsayıyorum. Nokia 5110 çok fazla alana sahip olmadığından oyunumuzun tamamını ekranımızın 84 * 48 piksel çözünürlüğünde planladık. Nokia 5110 LCD ile Arduino ve Joystick ile Arduino arasında nasıl arayüz oluşturacağımız konusunda eğitimler hazırladık.
Bu alan içinde, skor gibi şeyleri gösterecek oyun alanına ve skor panosu alanına sıkıca sığmalıyız. Piksel konumlarını takip etmek ve bunları ekranda güncellemek için öğeleri yerleştirdiğiniz yerin piksel konumunu bilmek çok önemlidir.
Oyun ekranının görünümüne karar verildikten sonra oyunumuzdaki karakterlere karar vermemiz gerekiyor. Oyunum için sadece iki tane var, bir uzay gemisi olan oyuncu karakteri ve bir tür uzay gemisi gibi görünmesi gereken bir düşman karakter. Nokia LCD bit eşlem resimleri görüntüleyebildiğinden, uzay gemimi ve düşmanları görüntülemek için bu seçeneği kullanmaya karar verdim.
Bu yüzden, uzaylıların uzay gemileriyle yarışan bir uzay gemimiz olacak, bu uzay gemisinin uzaylılarla çarpışmayı önlemek için üç şeridi değişecek. Uzaylılar her zaman sadece iki yol tutabilir ve oyuncu ücretsiz parkurdan geçebilmelidir. Bu fikirler tamamlandıktan sonra Donanım ve ardından programlamaya geçebiliriz.
Devre şeması:
Bu Arduino oyununun devresi çok basit; Nokia 5110 LCD modülünü ve Joystick'i Arduino ile arayüzlememiz gerekiyor. Tam devre şeması aşağıda gösterilmiştir
Nokia 5110 LCD 3.3V ile çalışır ve Joystick modülü en son 5V ile çalışır, bu nedenle LCD'yi yalnızca 3.3V ile bağladığınızdan emin olun, çünkü 5V kalıcı olarak zarar görebilir. LCD, Arduino ile SPI protokolü üzerinden iletişim kurar ve Joystick, voltajdaki değişikliği okumak için yalnızca ADC'yi okur. Bağlantı kurulumu aşağıdaki gibi görünecek
Ön koşullar:
Programlama kısmına girmeden önce, sizin için Ekran modülü ve Joystick ile rahat olmanız önemlidir, böylece aşağıdaki eğitimleri kullanarak onlar hakkında daha fazla bilgi alabilir ve işlerin bizim gibi çalıştığından emin olmak için buraya geri dönebilirsiniz. buna ihtiyacım var!
- Nokia 5110 Arduino ile LCD Arayüz
- Arduino ile arayüz oluşturan joystick modülü
Uzay Yarışı Oyunu için Arduino Programlama:
Oyunun tam programı bu sayfanın sonunda bulunabilir; doğrudan Arduino IDE'nizde kullanabilir ve Panonuza yükleyebilirsiniz. Ancak kodun içinde gerçekte ne olduğunu bilmek istiyorsanız, daha fazla okuyun.
Her zaman olduğu gibi, programımıza kütüphane başlık dosyalarımızı ekleyerek başlıyoruz, bu proje için SPI kütüphanesinin varsayılan olarak IDE'nize eklendiği üç kütüphaneye ihtiyacımız var. Diğer iki kitaplığın Adafruit Github sayfasından indirilmesi gerekiyor. Kitaplığı nasıl ekleyeceğinizden emin değilseniz, ön koşullar bölümünde belirtilen LCD arabirimi eğitimini izleyin.
#Dahil etmek
Öğreticiyi takip ettiyseniz , bit eşlem görüntülerini LCD'de görüntülemenin mümkün olduğunu bilmelisiniz. Bu yüzden gerekli görüntüyü eğitimde bahsedilen yazılımı kullanarak bitmap koduna dönüştürmeliyiz, internetten herhangi bir görüntüyü seçebilir ve bunları bitmap koduna dönüştürerek kullanabilirsiniz. Görüntünün LCD ekranımızda görüntülenecek kadar basit olduğundan emin olun, LCD ekranda gerçekten denemeden önce önizlemeyi kontrol edin. Programımızda biri uzay gemisi ve diğeri düşman gemisi olmak üzere iki bitmap karakter kullandık, her ikisinin bitmap kodu aşağıda gösterildiği gibi kodumuza eklenmiştir.
// Bitmap Veri uzay gemisi için imzasız karakter PROGMEM geminin const statik = { B00000000, B00000000, B00000001, B00000000, B00000011, B10000000, B00000010, B10000000, B00000010, B11000000, B00000111, B11000000, B00001101, B11100000, B00011111, B11110000, B00111111, B11111000, B01111111, B11111100, B01111111, B11111100, B01111111, B11111100, B00011111, B11110000, B00000111, B11100000, B00000000, B00000000, }; // Düşman gemisi statik const unsigned char PROGMEM düşman için Bitmap Verileri = { 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, };
Biz zorundayız Nokia LCD 5110 ekran hangi işaretçilerine belirtmek bağlanır. Ekran, SPI iletişimi kullanılarak iletişim kurar, yukarıdaki devre şemasını takip ettiyseniz, LCD'yi başlatan kod aşağıdaki gibi değiştirmenize gerek yoktur.
Adafruit_PCD8544 ekran = Adafruit_PCD8544 (7, 6, 5, 4, 3); // LCD'nin bağlı olduğu pinleri belirtin
Kurulum işlevinin içinde Seri monitörü 9600 baud hızında başlatırız, böylelikle hata ayıklayabilir ve ardından LCD ekranı başlatabiliriz. Ayrıca LCD ekranın kontrastını da ayarlamamız gerekiyor, her bir ekran farklı bir kontrast seviyesinde en iyi şekilde çalışacak, bu yüzden sizin için hangisinin en uygun olduğunu kontrol etmek için değerle oynayın. Son olarak, yeni bir başlangıç yapmak için görüntü ekranını da temizliyoruz.
geçersiz kurulum () { Serial.begin (9600); // Hata Ayıklama için Seri İzleme display.begin (); // LCD iletişim ekranına başlayın. SetContrast (30); // display.clearDisplay (); // ekranı temizler ve yenisini başlatır }
Ekran temizlendiğinde döngü işlevine atlıyoruz ve orada oyun ekranını görüntülüyoruz. Oyun ekranı, puan ve hız seviyesi ile birlikte oyun için temel bir iskelet görüntülemekten başka bir şey değildir. Kenarlık olarak üç çizgi çizmek için çizgi işlevini kullandık ve sağda, eski retro el oyun cihazlarında olduğu gibi metin puanını ve hızını gösteriyoruz.
void gamescreen () { // Screen display.drawLine (0, 0, 0, 47, BLACK) için Kenarlığı Çizin ; display.drawLine (50, 0, 50, 47, SİYAH); display.drawLine (0, 47, 50, 47, BLACK); // Varsayılan Metinleri Girin display.setTextSize (1); display.setTextColor (SİYAH); display.setCursor (52,2); display.println ("Hız"); display.setCursor (54,12); display.println (game_speed); display.setCursor (52,25); display.println ("Puan"); display.setCursor (54,35); display.println (skor); }
Ardından , uzay gemisini kontrol etmesine izin vermek için kullanıcıdan girdi almalıyız. Giriş, pin A1'e bağlı olan Joystick modülünden alınacaktır. Sensörden gelen analog değer hareket ettirilmezse 512 olur ve X ekseni boyunca hareket ettirildiğinde artar ve azalır. Bu değerleri, kullanıcının sola mı sağa mı hareket etmek istediğini belirlemek için kullanırız. Aşağıdaki programı anlamakta zorlanıyorsanız, ön koşullarda belirtilen Arduino öğreticisi ile Joystick arayüzünü okumalısınız.
// Kullanıcıdan girdi alın Joy_X = analogRead (A1); // (Joy_X <312 && POS! = 1 && control == true) ise Joystick'ten X değerini okuyun // Joystick sağa hareket ederse {POS--; control = false;} // Uzay gemisinin konumunu, else if (Joy_X> 712 && POS! = 3 && control == true) azaltın // Joy stick sağa hareket ederse {POS ++; control = false;} // Uzay gemisinin konumunu, else if artırın (Joy_X> 502 && Joy_X <522) // Joystick ilk konuma geri dönerse control = true; // Bir sonraki hamle için hazırlayın // Kullanıcıdan girdi alındı
Kullanıcıdan uzay gemisinin konumunu aldıktan sonra uzay gemisini o yere yerleştirmemiz gerekiyor. Aşağıdaki işlevi kullanır ve konumun değerini bir parametre olarak geçiririz, ardından uzay gemisinin ilgili yoluna yerleştirildiği konuma bağlı olarak.
void player_car (char pos) // Uzay gemisini kullanıcının seçtiği konuma göre yerleştirin { if (pos == 1) display.drawBitmap (2, 32, ship, 15, 15, BLACK); eğer (pos == 2) display.drawBitmap (18, 32, ship, 15, 15, BLACK); eğer (pos == 3) display.drawBitmap (34, 32, ship, 15, 15, BLACK); }
Artık uzay gemimiz ekrana yerleştirildiğine ve yarışa hazır olduğuna göre, oyuncu ile yarışacak düşman gemilerini tanıtmamız gerekiyor. Bir düşman gemisi perdeyi her geçtiğinde öldüğünü varsayıyoruz ve öldüğünde yeni bir uzay gemisi yaratmamız gerekiyor. Aşağıdaki işlev aynı şeyi yapar. İki düşman gemisi için yeni bir konum oluşturur ve onları ekranın en üstüne yerleştirir.
if (düşman_dead) // Düşman gemilerinin ölü olup olmadığını kontrol edin {// Ölü iseler düşman_0_pos = POS; // düşman uzay gemisinin üzerinde ilk düşmanı yarat_1_pos = random (0,4); // başka bir rastgele yerde ikinci düşmanı yarat düşman_phase = 0; // Düşmanı en iyi düşmandan getirin_dead = false; // Düşman yaratıldı, böylece artık ölmemişler }
Düşman gemilerini ekranın üst kısmına yerleştirdikten sonra, oyuncumuz yukarı doğru yarışıyormuş gibi mızrak sesi çıkaracak şekilde onu aşağı indirmeliyiz, bunu yapmak için sadece aşamayı (görüntünün görüntülendiği yer) arttırmalıyız, böylece yavaşça iner. Aynısı, aşağıda gösterildiği gibi her iki düşman gemisi için de yapılır.
düşman_gemisi (düşman_0_pos, düşman_fazı); düşman_faz ++; // İlk düşmanı ekrana yerleştirin ve düşman gemisini aşağı sürün (düşman_1_pos, düşman_phase); düşman_faz ++; // İkinci düşmanını ekrana yerleştirin ve onu aşağıya itin
Düşman_gemisi işlevi aşağıda gösterilmiştir, oyuncu arabası işlevine çok benzer, ancak burada iki parametremiz var. Biri düşmanı bir yola yerleştirmek, diğeri ise düşmanı dibe doğru hareket ettirmek içindir.
void düşman_ship (int place, int phase) // Düşman gemisini yeni yere ve aşama { if (yer == 1) display.drawBitmap (2, phase, düşman, 15, 15, BLACK); eğer (yer == 2) display.drawBitmap (18, faz, düşman, 15, 15, SİYAH); eğer (yer == 3) display.drawBitmap (34, faz, düşman, 15, 15, SİYAH); }
Bir sonraki kod parçası, uzay gemisinin düşman gemisinden kaçıp kaçmadığını kontrol etmelidir. Bunu kontrol etmek için düşman gemilerinin ve oyuncunun uzay gemisinin konumunu bilmemiz gerekiyor. Her şeyi bildiğimiz için, uzay gemisinin pozisyonunun düşman gemisiyle aynı olup olmadığını kontrol etmemiz gerekiyor. Bunu sadece düşman gemisi uzay gemisinin yanına ulaştıysa kontrol ederiz. Oyuncu düşmandan kaçınmadıysa oyun biter demektir.
if (düşman_phase> 22 && ((düşman_0_pos == POS) - (düşman_1_pos == POS))) // Uzay Gemisi düşmanlardan herhangi birine dokunursa game_over (); // Oyunu bitirdikten sonra göster
Oyuncu düşmandan başarıyla kaçtıysa düşmanı öldürmeli ve oyuncuya bir puan vermeliyiz. Bunu yapmak için düşmanın ekranın altına ulaşıp ulaşmadığını kontrol ediyoruz ve ulaşırsa aşağıdaki kodu kullanarak onu öldürüyoruz
if (düşman_phase> 40) // Uzay gemisi düşmanlardan kaçarsa {düşman_dead = true; score ++;} // Puanı arttır ve düşmanları öldür
Yüksek puanlar aldıkça oyunun zorluğunu artırmasak ne eğlenceli olur. Bu nedenle , oyuncunun puanını izleyen ve puana bağlı olarak oyunun hızını artıran başka bir işlev kullanıyoruz. Hız, aslında gecikme işlevi kullanılarak kontrol edilir, bu, oyunun yenileme aralığını kontrol eder, böylece hızlı veya yavaş hale getirir.
void Level_Controller () // Puana bağlı olarak oyunun hızını artırın. { if (score> = 0 && score <= 10) // Skor 0-10 ise { game_speed = 0; gecikme (80); // oyunu 80 ms yavaşlat } if (score> 10 && score <= 20) // Skor 10-40 ise { game_speed = 1; gecikme (70); // oyunu 70 ms yavaşlat } if (score> 20 && score <= 30) // Skor 20-40 ise { game_speed = 2; gecikme (60); // oyunu 60 ms yavaşlat } if (score> 30 && score <= 40) // Skor 30-40 ise { game_speed = 3; gecikme (50); // oyunu 50 ms yavaşlat } }
Arduino Space Racer Game çalışma:
Donanımın ve programın anlaşıldığından emin olduktan sonra, sadece devreyi oluşturun ve kodu Arduino Board'a yükleyin. Oyunun aşağıda gösterildiği gibi başladığını fark etmelisiniz
Sola veya sağa hareket ederek düşman gemisinden kaçmak için joystick'i kullanın. Her bir düşmandan kaçınmak için puanınızı bir artıracaksınız. Skor yükseldiğinde oyunun hızı da artacaktır, yani attığınız her 10 puan için hız 10 ms artar. Devam edebilir ve yeni seviyeler tanıtmak için bu oyuna devam edebilir veya bir ivme ölçer kullanarak hareketi kontrol etmek için her biri bazı donanım değişiklikleri yapabilirsiniz. Yaratıcılık tek sınırdır. Referansınız için burada Arduino ile İvmeölçeri kullanmayı öğreneceksiniz.
Umarım projeyi anladınız ve inşa etmekten keyif aldınız. Bunu çalıştırmada herhangi bir sorunla karşılaştıysanız, lütfen sorunu aşağıdaki yorum bölümüne göndermekten çekinmeyin veya teknik yardım için forumları kullanın. Mutlu oyunlar !!
Kodun tamamını ve aşağıdaki Gösteri Videosunu kontrol edin.