- Rancangan Permainan:
- Rajah Litar:
- Prasyarat:
- Memprogram Arduino untuk Space Race Game:
- Arduino Space Racer Game berfungsi:
Pengaturcaraan selalu menyeronokkan dan hanya menjadi lebih baik dengan platform pembangunan seperti Arduino. Hampir setiap pengaturcara di sini akan berusaha mengembangkan beberapa jenis permainan menggunakan bahasa yang mereka pelajari / praktikkan. Ini membantu mereka menyesuaikan kemahiran pengaturcaraan mereka dengan cara yang menyeronokkan namun produktif. Saya menjadi peminat Arduino sejak saya diperkenalkan dan selalu ingin mencuba sesuatu yang keren dengannya, apabila saya mengetahui betapa hebatnya ia dengan LCD Grafik seperti Nokia 5110 bersama dengan Arduino idea saya untuk mengembangkan permainan ditendang masuk. Ini adalah cara yang menarik untuk menyesuaikan sedikit kemahiran pengaturcaraan dan bersenang-senang pada masa yang sama, jadi walaupun anda mungkin juga berminat untuk mengembangkan permainan anda Oleh itu Dalam tutorial ini kita akan belajar bagaimana kita dapat membuat Permainan Layak menggunakan LCD Arduino dan Grafik.
Kami telah membina permainan Ular kuno itu menggunakan Arduino sehingga kali ini kami mencuba sesuatu yang baru dan kami menamakan permainan ini sebagai Space Race Game di mana anda perlu memastikan kapal anda selamat dari kapal musuh menggunakan kayu bedik.
Rancangan Permainan:
Sebelum kita memulakan, sangat penting untuk merancang bagaimana permainan anda akan berfungsi. Saya menggunakan LCD Grafik Nokia5110 dan Joystick untuk pemilihan perkakasan saya. Saya menganggap dalam tutorial ini bahawa anda juga telah memilih yang sama. Oleh kerana Nokia 5110 tidak dilengkapi dengan banyak ruang, kami telah merancang seluruh permainan kami dengan resolusi 84 * 48 piksel paparan kami. Kami telah membuat tutorial mengenai bagaimana untuk menghubungkan Nokia 5110 LCD dengan Arduino dan Joystick dengan Arduino.
Di dalam ruang ini kita harus pas di kawasan permainan dan kawasan papan skor yang akan memaparkan perkara seperti skor dan barang. Adalah sangat penting untuk mengetahui lokasi piksel di mana anda meletakkan barang untuk mengesan lokasi piksel dan mengemas kini di layar.
Setelah penampilan skrin permainan diputuskan, kita harus menentukan watak-watak dalam permainan kita. Untuk permainan saya, kami hanya mempunyai dua, watak pemain yang merupakan kapal angkasa dan watak musuh yang seharusnya kelihatan seperti kapal angkasa asing. LCD Nokia dapat memaparkan gambar bitmap, jadi saya memutuskan untuk menggunakan pilihan itu untuk memaparkan kapal angkasa saya dan musuh.
Jadi kita akan memiliki kapal angkasa yang berlumba-lumba melalui kapal angkasa alien, kapal angkasa ini akan memiliki tiga jalur perubahan untuk mengelakkan serangan dengan makhluk asing. Sepanjang masa alien hanya dapat menempati dua trek dan pemain harus dapat melalui trek bebas. Setelah idea-idea ini disimpulkan, kita boleh meneruskan Perkakasan dan kemudian pengaturcaraan.
Rajah Litar:
Litar untuk permainan Arduino ini sangat mudah; kita hanya perlu menghubungkan antara modul Nokia 5110 LCD dan Joystick dengan Arduino. Gambarajah litar lengkap ditunjukkan di bawah
Nokia 5110 LCD berfungsi dengan 3.3V dan modul Joystick berfungsi sebagai anak lelaki 5V, jadi pastikan anda menyambungkan LCD dengan 3.3V sahaja, kerana 5V mungkin merosakkannya secara kekal. LCD berkomunikasi dengan Arduino melalui protokol SPI dan Joystick hanya membaca ADC untuk membaca perubahan voltan. Penyediaan sambungan akan kelihatan seperti ini di bawah
Prasyarat:
Sebelum kita menyelami bahagian pengaturcaraan, penting bagi anda untuk bersesuaian dengan modul Display dan Joystick, jadi anda boleh menggunakan tutorial berikut untuk mengetahui lebih lanjut mengenai mereka dan kemudian kembali ke sini untuk memastikan semuanya berjalan seperti kita memerlukannya untuk!
- Nokia 5110 LCD Berinteraksi dengan Arduino
- Modul Joystick berinteraksi dengan Arduino
Memprogram Arduino untuk Space Race Game:
Program lengkap untuk permainan boleh didapati di hujung halaman ini; anda boleh menggunakannya terus di Arduino IDE anda dan memuat naiknya ke Board anda. Tetapi jika anda ingin mengetahui apa yang sebenarnya berlaku di dalam kod tersebut, baca lebih lanjut.
Seperti biasa kami memulakan program kami dengan menambahkan fail header perpustakaan kami, kami memerlukan tiga perpustakaan untuk projek ini, di mana perpustakaan SPI ditambahkan ke IDE anda secara lalai. Dua perpustakaan yang lain mesti dimuat turun dari halaman Adafruit Github. Ikuti tutorial antara muka LCD yang disebutkan di bahagian pra-syarat jika anda tidak pasti bagaimana menambahkan perpustakaan.
#sertakan
Sekiranya anda mengikuti tutorial, anda harus tahu bahawa memaparkan gambar bitmap di LCD adalah mungkin. Oleh itu, kita harus menukar gambar yang diperlukan menjadi kod bitmap dengan menggunakan perisian yang disebutkan dalam tutorial, anda dapat memilih gambar apa pun dari internet dan menggunakannya dengan menukarnya menjadi kod bitmap. Pastikan gambar cukup sederhana untuk dipaparkan di layar LCD kami, periksa pratonton sebelum benar-benar mencuba di layar LCD. Dalam program kami, kami telah menggunakan dua watak bitmap satu adalah kapal angkasa dan yang lain adalah kapal musuh, kod bitmap untuk keduanya ditambahkan dalam kod kami seperti yang ditunjukkan di bawah.
// Data Bitmap untuk kapal PROGMEM kapal angkasa static const yang tidak ditandatangani = { B00000000, B00000000, B00000001, B00000000, B00000011, B10000000, B00000010, B10000000, B00000010, B11000000, B00000111, B11000000, B11001, B110000, B11001, B110000, B110000, B110000, B110000 B01111111, B11111100, B01111111, B11111100, B01111111, B11111100, B00011111, B11110000, B00000111, B11100000, B00000000, B00000000, }; // Data Bitmap untuk musuh static const unsigned char PROGMEM musuh = { 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, };
Kita harus menentukan pin yang dihubungkan dengan paparan Nokia LCD 5110. Paparan dikomunikasikan dengan menggunakan komunikasi SPI, jika anda mengikuti rajah litar di atas, kod untuk menginisialisasi LCD akan seperti berikut, anda tidak perlu mengubahnya.
Paparan Adafruit_PCD8544 = Adafruit_PCD8544 (7, 6, 5, 4, 3); // Tentukan pin yang disambungkan LCD
Di dalam fungsi penyediaan, kita hanya memulakan monitor Serial pada kadar baud 9600 sehingga kita dapat men-debug barang dan kemudian menginisialisasi paparan LCD. Kami juga harus menetapkan kontras paparan LCD, setiap paparan akan berfungsi paling baik dalam tahap kontras yang berbeza, jadi mainkan dengan nilai untuk memeriksa mana yang paling sesuai untuk anda. Akhirnya kami juga membersihkan skrin paparan untuk mula segar.
persediaan tidak sah () { Serial.begin (9600); // Serial Monitor untuk debugging display.begin (); // Mulakan paparan komunikasi LCD.setContrast (30); // Tetapkan kontras paparan paparan.clearDisplay (); // membersihkan skrin dan mula baru }
Sebaik sahaja skrin dikosongkan kami melompat ke fungsi gelung dan di sana kami memaparkan layar permainan. Skrin permainan tidak lain dan tidak bukan hanya menampilkan kerangka asas untuk permainan bersama dengan skor dan tahap kelajuan. Kami telah menggunakan fungsi garis untuk melukis tiga garis sebagai sempadan dan di sebelah kanan kami memaparkan skor dan kelajuan teks sama seperti alat permainan retro lama.
batal permainan skrin () { // Lukiskan Sempadan untuk paparan Skrin.drawLine (0, 0, 0, 47, HITAM); display.drawLine (50, 0, 50, 47, HITAM); display.drawLine (0, 47, 50, 47, HITAM); // Masukkan Teks Lalai display.setTextSize (1); display.setTextColor (HITAM); display.setCursor (52,2); display.println ("Kelajuan"); display.setCursor (54,12); display.println (game_speed); display.setCursor (52,25); display.println ("Skor"); display.setCursor (54,35); display.println (skor); }
Seterusnya kita harus mendapatkan input dari pengguna untuk membolehkannya mengawal kapal angkasa. Input akan diterima dari modul Joystick yang disambungkan ke pin A1. Nilai analog dari sensor akan menjadi 512 jika tidak digerakkan dan akan meningkat dan menurun ketika digerakkan di sepanjang paksi-X. Kami menggunakan nilai-nilai ini untuk menentukan sama ada pengguna mahu bergerak ke kiri atau ke kanan. Anda harus membaca tutorial Joystick interfacing dengan Arduino yang disebutkan dalam pra-syarat sekiranya anda sukar memahami program di bawah ini.
// Dapatkan input dari pengguna Joy_X = analogRead (A1); // Baca X vaue dari Joystick jika (Joy_X <312 && POS! = 1 && control == true) // Jika tongkat kegembiraan bergerak ke kanan {POS--; control = false;} // Penurunan kedudukan kapal angkasa lain jika (Joy_X> 712 && POS! = 3 && control == true) // Jika tongkat kegembiraan bergerak ke kanan {POS ++; control = false;} // Peningkatan kedudukan kapal angkasa yang lain jika (Joy_X> 502 && Joy_X <522) // Sekiranya joystick kembali ke kedudukan awal kawalan = true; // Siapkan untuk langkah seterusnya // Input dari pengguna diterima
Setelah mendapat kedudukan kapal angkasa dari pengguna kita harus meletakkan kapal angkasa di tempat tersebut. Kami menggunakan fungsi di bawah ini dan meneruskan nilai posisi sebagai parameter, kemudian berdasarkan posisi kapal angkasa diletakkan di trek masing-masing.
void player_car (char pos) // Letakkan kapal angkasa berdasarkan kedudukan pengguna yang dipilih { if (pos == 1) display.drawBitmap (2, 32, ship, 15, 15, BLACK); jika (pos == 2) display.drawBitmap (18, 32, kapal, 15, 15, HITAM); jika (pos == 3) display.drawBitmap (34, 32, kapal, 15, 15, HITAM); }
Sekarang kapal angkasa kita diletakkan di layar dan siap untuk berlumba, kita harus memperkenalkan kapal musuh yang akan bersaing dengan pemain. Setiap kali kapal musuh melintasi layar kita menganggap dia sudah mati dan ketika dia mati kita harus membuat kapal angkasa baru. Fungsi di bawah sama sahaja. Ini mewujudkan kedudukan baru untuk dua kapal musuh dan meletakkannya di bahagian atas skrin.
if (fili_dead) // Pemeriksaan kapal musuh sudah mati {// Sekiranya mereka mati musuh_0_pos = POS; // buat musuh pertama di atas kapal angkasa musuh_1_pos = rawak (0,4); // buat musuh yang kuat di beberapa tempat lain yang rawak musuh_phase = 0; // Bawa musuh membentuk musuh_dead = palsu; // Musuh diciptakan supaya mereka tidak mati lagi }
Setelah meletakkan kapal musuh di bahagian atas layar kita harus menjatuhkannya sehingga tombak seolah-olah pemain kita berlari ke atas, untuk melakukan itu kita hanya perlu meningkatkan fasa (tempat di mana gambar ditampilkan) sehingga ia turun dengan perlahan. Perkara yang sama dilakukan untuk kedua kapal musuh seperti yang ditunjukkan di bawah
fili_ship (musuh_0_pos, musuh_fasa); musuh_fasa ++; // Letakkan musuh pertama di skrin dan hantar dia ke musuh_ship (musuh_1_pos, musuh_phase); musuh_fasa ++; // Letakkan musuh yang kuat di layar dan halau dia ke bawah
Fungsi musuh_ship ditunjukkan di bawah, ia sangat serupa dengan fungsi pemain pemain tetapi di sini kita mempunyai dua parameter. Salah satunya adalah untuk menempatkan musuh di trek dan yang lain adalah untuk menggerakkan musuh ke bawah.
batal musuh_ship (int place, int phase) // Letakkan musuh_ship di tempat baru dan fasa { if (place == 1) display.drawBitmap (2, phase, musuh, 15, 15, BLACK); jika (tempat == 2) display.drawBitmap (18, fasa, musuh, 15, 15, HITAM); jika (tempat == 3) display.drawBitmap (34, fasa, musuh, 15, 15, HITAM); }
Bahagian kod seterusnya harus memeriksa sama ada kapal angkasa telah mengelakkan kapal musuh. Untuk memeriksa ini, kita perlu mengetahui kedudukan kapal musuh dan kapal angkasa pemain. Oleh kerana kita tahu semua itu kita hanya perlu memeriksa sama ada kedudukan kapal angkasa sama dengan kapal musuh. Kami memeriksa ini hanya jika kapal musuh telah sampai di dekat kapal angkasa. Sekiranya pemain tidak dapat mengelakkan musuh, ini bermakna permainan berakhir.
if (musuh_phase> 22 && ((musuh_0_pos == POS) - (musuh_1_pos == POS))) // Sekiranya kapal angkasa menyentuh salah satu daripada permainan_over musuh (); // Paparkan permainan selesai
Sekiranya pemain berjaya mengelakkan musuh dengan jayanya, maka kita harus membunuh musuh dan memberi mata kepada pemain. Untuk melakukan ini, kita periksa sama ada musuh telah sampai ke bahagian bawah skrin dan jika ia berjaya kita membunuhnya menggunakan kod di bawah
if (fili_phase> 40) // Sekiranya kapal jarak jauh melarikan diri dari musuh {musuh_dead = true; skor ++;} // Tingkatkan skor dan bunuh musuh
Alangkah seronoknya, jika kita tidak meningkatkan kesukaran permainan kerana kita mendapat markah tinggi. Oleh itu, kami menggunakan fungsi lain yang kemudian memantau skor pemain dan berdasarkan skor itu akan meningkatkan kelajuan permainan. Kelajuan sebenarnya dikawal dengan menggunakan fungsi kelewatan ini akan mengawal selang penyegaran permainan sehingga menjadikannya cepat atau lambat.
batal Level_Controller () // Meningkatkan kelajuan permainan berdasarkan skor. { if (skor> = 0 && skor <= 10) // Jika skor 0-10 { game_speed = 0; kelewatan (80); // perlahankan permainan dengan 80ms } jika (skor> 10 && skor <= 20) // Jika skor 10-40 { game_speed = 1; kelewatan (70); // perlahankan permainan sebanyak 70ms } jika (skor> 20 && skor <= 30) // Jika skor 20-40 { game_speed = 2; kelewatan (60); // perlahankan permainan dengan 60ms } jika (skor> 30 && skor <= 40) // Jika skor 30-40 { game_speed = 3; kelewatan (50); // perlahankan permainan sebanyak 50ms } }
Arduino Space Racer Game berfungsi:
Setelah memastikan perkakasan dan program difahami, cukup buat litar dan muat naik kod tersebut ke Arduino Board. Anda harus melihat permainan bermula seperti yang ditunjukkan di bawah
Gunakan kayu bedik untuk melarikan diri dari kapal musuh dengan bergerak ke kiri atau kanan. Untuk mengelakkan setiap musuh, skor anda akan bertambah satu. Apabila skor meningkat tinggi, kelajuan permainan juga akan meningkat, iaitu peningkatan kelajuan sebanyak 10ms untuk setiap 10 mata yang anda peroleh. Anda boleh terus maju dan memanfaatkan permainan ini untuk memperkenalkan tahap baru atau membuat perubahan perkakasan untuk mengawalnya walaupun bergerak menggunakan pecutan. Kreativiti adalah satu-satunya had. Untuk rujukan anda, anda belajar menggunakan Accelerometer dengan Arduino di sini.
Harap anda memahami projek ini dan seronok membinanya. Sekiranya anda menghadapi masalah untuk membuat ini berfungsi, jangan hantarkan masalah di bahagian komen di bawah atau gunakan forum untuk bantuan teknikal. Selamat bermain !!
Lihat kod lengkap dan Video Demonstrasi di bawah.