Isi kandungan:
- Bekalan
- Langkah 1: Memasang Paint.net
- Langkah 2: Melukis Skrin Splash Mudah
- Langkah 3: Menukar BMP ke C Bitmap File
- Langkah 4: Memaparkan LOGO Menggunakan DrawBitmap
- Langkah 5: Menggerakkan Bitmap Sprite
- Langkah 6: Membuat Permainan Memandu
Video: Reckless Racer Arduino OLED Game, AdafruitGFX dan Asas Bitmaps: 6 Langkah
2024 Pengarang: John Day | [email protected]. Diubah suai terakhir: 2024-01-30 11:07
Dalam tutorial ini kita akan melihat bagaimana menggunakan bitmap menggunakan perpustakaan Adafruit_GFX.c sebagai semacam sprite dalam permainan. Permainan paling mudah yang dapat kita fikirkan adalah permainan kereta lorong bergulir sisi, pada akhirnya penguji beta dan pembantu pengkod kami memutuskan "Reckless Racer" sebagai nama, kerana ia sangat melulu untuk memandu dengan cara yang salah di lebuh raya !!.
Reka bentuk litar kami terdapat dalam gambar yang disertakan di atas dan diperincikan dalam projek / tutorial terakhir kami di sini Snake Instructables yang menerangkan bagaimana litar berfungsi.
kami akan memerlukan
Adafruit_GFX
Paint.net
Arduino IDE windowslinux
dan sila lihat tutorial Ular untuk peralatan yang lain.
Bekalan
Permainan Ular
Langkah 1: Memasang Paint.net
Kami menggunakan paint.net kerana perisian ini percuma sehingga anda boleh memuat turun Paint. Net di sini.
Untuk memasang paint.net, klik dua kali program yang dimuat turun dan jawab dengan positif seperti itu seterusnya, ya, ok, saya setuju dan gambar di atas akan memberi anda petunjuk.
Langkah 2: Melukis Skrin Splash Mudah
Semasa anda berada di paint.net buat gambar baru dengan mengklik File kemudian baru, tetapkan ukuran gambar menjadi 1260x620 (lihat gambar pertama) klik ok apabila anda mempunyai halaman baru melukis skrin percikan menggunakan hanya 2 warna hitam putih menggunakan pensil alat (gambar2), apabila anda telah melukis (atau ditempelkan) gambar layar percikan anda, klik pada gambar kemudian ubah ukurannya (gambar4), pada pop timbul ubah ukuran dari 1260x620 menjadi 126x62 (2 piksel lebih kecil dari paparan anda) (gambar5) Klik OK.
seterusnya klik menu Fail kemudian simpan sebagai (gambar6).
apabila pop timbul muncul di menu drop down jenis fail pilih BMP (bitmap). (pic7), ketik nama fail dan klik simpan, ketika pop up muncul set dithering ke 0 dan set ke 8 bit, klik ok (pic8)).
Langkah 3: Menukar BMP ke C Bitmap File
Sekarang kita perlu menukar gambar kita ke format yang dapat difahami oleh arduino bahawa terdapat banyak alat yang tersedia untuk melakukan ini tetapi "pergi ke" tempat saya adalah alat penukar bitmap laman web marlin…
marlinfw.org/tools/u8glib/converter.html
Oleh itu, kita mulakan bahagian ini dengan menggunakan pautan di atas untuk membuka laman web yang ditunjukkan dalam gambar1
klik pilih file dan pilih bitmap yang anda buat tadi (gambar2)
penukar bitmap marlin secara automatik akan menukar gambar anda menjadi kod c klik dua kali kiri kod yang harus menyerlahkan kod tersebut, kemudian klik kanan dan klik salin (gambar3)
seterusnya Kami membuat klik kanan dan membuat dokumen teks baru (gambar4)
klik dua kali dokumen baru, apabila dibuka klik kanan dan tampal kodnya (pic5)
seterusnya kita harus menambahkan baris di dekat bahagian atas kod #sertakan ini membolehkan kita menyimpan data bitmap ke memori flash di arduino, kemudian kita menamakan semula #define lebar, tinggi dan nama menjadi sesuatu yang lebih mudah untuk digunakan diserlahkan dalam gambar 6, kami menamakannya dari watak yang dihasilkan secara rawak yang kami namakan semula menjadi contoh yang digarisbawahi di bawah
#tentukan LOGOWIDTH
#tentukan LOGOHEIGHT
const unsigned char LOGOPIC PROGMEM
klik seterusnya fail kemudian simpan sebagai, simpan fail sebagai logo.c tutup notepad, klik kanan pada logo.c dan klik salin.
Langkah 4: Memaparkan LOGO Menggunakan DrawBitmap
Sekarang kita memuatkan arduino IDE dan membuat sketsa baru dan menyimpannya bernama logoexample.ino, seterusnya sebagai cheat di ide arduino klik menu fail kemudian simpan sebagai, kembali ke folder projek klik kanan dan tampal di fail.c (gambar2) kemudian klik batal, ini menjimatkan anda perlu melihat ke folder untuk ditampal dalam fail.
taipkan kod berikut ke dalam arduino IDE atau muat turun ino.
(kami mengesyorkan untuk menaip daripada menyalin dan menampal atau menggunakan fail di bawah ini cara terbaik untuk belajar)
#include / * ini akan berbeza bergantung pada tempat anda menyimpan
ino biasanya dalam folder C: / Users / ~ username / Documents / Arduino / project ~ name
dan ini adalah bagaimana kami menghubungkan ke bitmap kami * /
#sertakan
#sertakan
uint8_t bmpX, bmpY = 0; / * simpan memori untuk bilangan bulat 2 X 8 bit, kita hanya memerlukan int 8 bit
kerana nilainya tidak pernah lebih tinggi daripada 128 (piksel) jadi kita dapat menjimatkan ruang menggunakan int 8 bit (yang mempunyai nilai maksimum 255) * /
persediaan tidak sah ()
{kelewatan (100); // berikan paparan dll masa untuk menghidupkan display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // ini untuk memulakan tampilan paparan.clearDisplay (); // mulakan dengan skrin kosong}
/ * harap maklum bahawa anda tidak perlu menaip komen ini kerana ia adalah rujukan …………..
arahan yang akan kita fokuskan adalah display.drawBitmap, inilah yang menarik layar percikan kita. (bmpX, adalah nilai sumbu X pada layar di mana titik sauh X dari bitmap akan menjadi dan bmpX dan bmpY adalah nilai yang kita berminat untuk membuat pergerakan (bmpY, adalah nilai sumbu Y pada skrin di mana penanda Y titik bitmap akan kita dapatkan nama rujukan seperti yang kita tetapkan dalam logo.c (LOGOPIC, adalah nama bitmap dalam # file file yang disertakan.c (LOGOWIDTH, adalah berapa banyak piksel di seberang (X) untuk menarik bitmap dari titik jangkar (LOGOHEIGHT, ialah berapa piksel ke bawah (Y) untuk menarik bitmap dari titik jangkar piksel X dan Y di seberang boleh dimasukkan secara manual tetapi lebih mudah untuk menggunakan yang sudah ditentukan daripada mengingat semuanya (1, nilai terakhir adalah warna kerana skrin mono 0 hitam 1 putih. okey mulakan menaip dari baris seterusnya: ¬D lol * / gelung kosong () {display.clearDisplay (); // kosongkan skrin // bitmap diambil dari kiri atas, x, y, nameof bitmap, width X, height Y, color display.drawBitmap (bmpX, bmpY, LOGOPIC, LOGOWIDTH, LOGOHEIGHT, 1); display.display (); // ini sebenarnya menarik penyangga ke paparan yang pernah ada}
memuat naik kod anda arduino dan mengesahkan bahawa ia berfungsi (gambar3).
Langkah 5: Menggerakkan Bitmap Sprite
menggunakan arahan sebelumnya gunakan paint.net dan buat fail baru menjadikannya 30x15 piksel (gambar1) dan lukis kereta kasar pereka muda kita bermula dengan kaca depan terlebih dahulu (gambar 2 & 3).
sekali lagi simpan sebagai fail bmp windows (seperti pada langkah2), ubah menjadi peta bit C (langkah3) dan letakkan fail car.c (atau apa sahaja yang anda putuskan) dalam folder yang sama dengan arduino ino (lakaran) yang baru dibuat fail.
(hlm. ingat untuk menambah baris #masuk di dalam kereta. c ini biasa digunakan untuk menarik perhatian kita)
Pertama pautkan setara dengan kereta anda. C
#sertakan
#include #include Adafruit_GFX.h> // https://github.com/adafruit/Adafruit-GFX-Library #include Adafruit_SSD1306 //
Paparan Adafruit_SSD1306 (128, 64); // tetapkan resolusi paparan
/ * bmpX / bmpY kita memerlukan ini menjadi pemboleh ubah seperti mengubah nilai-nilai ini dan menggambar semula
skrin adalah bagaimana kita membuat kesan animasi pergerakan. hitSide dan hitTop adalah bagaimana kita terus melakukan sprite di skrin * / uint8_t bmpX, bmpY = 0; // simpan memori untuk 2 8 bit ints (0-255) kita tidak memerlukan lebih besar 128 akan menjadi bilangan terbesar bool hitSide = 0; bool hitTop = 0;
persediaan tidak sah ()
{kelewatan (100); // berikan paparan dll masa untuk menghidupkan display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // ini untuk memulakan tampilan paparan.clearDisplay (); // mulakan dengan skrin kosong
}
gelung kosong ()
{display.clearDisplay (); // kosongkan skrin // bitmap yang diambil dari kiri atas, x, y, nama bitmap, lebar X, tinggi Y, paparan warna.drawBitmap (bmpX, bmpY, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // paparan.display (); // ini sebenarnya menarik penyangga ke paparan yang pernah ada / * ini adalah bagaimana kita melacak tepi layar dan memutuskan sama ada untuk menambah piksel bergerak dari atas ke bawah) atau mengeluarkan piksel (bergerak dari bawah ke atas) * / beralih (tekanSide) // ini memilih arah kereta berdasarkan boole {case 0: bmpX ++; rehat;
kes 1:
bmpX--; rehat; } // ini 2 jika pernyataan menetapkan bool menjadi benar atau salah jika (bmpX == 0) {hitSide = 0; } jika (bmpX == 96) // lebar skrin tolak kereta {hitSide = 1; } // sama seperti di atas untuk paksi Y jika (bmpY == 0) {hitTop = 0; } jika (bmpY == 49) // ketinggian skrin tolak ketinggian kereta {hitTop = 1; } tukar (hitTop) {kes 0: bmpY ++; rehat; kes 1: bmpY--; rehat; }
}
anda dapat melihat program berfungsi dalam video yang dilampirkan
Langkah 6: Membuat Permainan Memandu
Pertama Kita mulakan dengan melukis beberapa kereta atau halangan yang berbeza seperti pada peringkat awal tutorial menjadikannya 30x15 piksel. Kemudian kami menukarnya menjadi c bitmap dan memautkan kodnya.
#masuk // jalan ini mesti berubah bergantung
// di tempat anda menyimpan fail // edit: saya baru mengetahui jika anda mengganti // dengan "" anda tidak memerlukan jalan penuh // dengan perpustakaan anda sendiri #include
#sertakan
#sertakan #sertakan
#sertakan
#include // https://github.com/adafruit/Adafruit-GFX-Library #include <Adafruit_SSD1306 //
Paparan Adafruit_SSD1306 (128, 64); // tentukan parameter paparan
tentukan pemboleh ubah dan nilai tetap
// tentukan pin input ini adalah pin di arduino yang tidak pernah mereka ubah jadi # define #efinisikan INTPIN 3 // hanya pin 2 dan 3 boleh menjadi pin interupt pada UNO #define UPPIN 4 // ini adalah pin yang disambungkan tp suis yang berkaitan #define DWNPIN 5 #define LFTPIN 6 #define RHTPIN 7 #define SND 9 // tentukan arah
#define DIRUP 1 // nilai-nilai inilah yang dilihat oleh "ular" untuk memutuskan-
#define DIRDOWN 2 // arah yang akan dilalui oleh ular #define DIRLEFT 3 #define DIRRIGHT 4
uint8_t dirTekanan = 0; // nilai untuk mendaftarkan arah untuk bergerak pin mana yang tinggi
// booleans menyimpan pin mana yang tinggi
bool BUTUP = 0; bool BUTDWN = 0; bool BUTLFT = 0; bool BUTRHT = 0; // vars untuk kedudukan kereta uint8_t carPosX = 1; uint8_t carPosY = {0, 16, 32, 48}; // memerlukan nilai merangkumi array
uint8_t lanePosArr = {0, 16, 32, 48}; // array untuk menyimpan di mana setiap lorong berada
uint8_t carPosYCnt = 0; uint8_t carYTmp = 0; // pemboleh ubah untuk garis di jalan uint8_t roadLineX1 = 51; // ini telah ditentukan pada permulaan maka garis-garisnya kelihatan lancar uint8_t roadLineX2 = 102; uint8_t roadLineX3 = 153; uint8_t roadLineX4 = 254; uint8_t roadLineX5 = 200;
// ini adalah berapa piksel kawasan permainan bergerak pada satu masa
uint8_t drawSpeed = 4;
// vars untuk musuh0
uint8_t musuh0PosX = 255; uint8_t musuh0PosY = 0; uint8_t musuh1PosX = 255; uint8_t musuh1PosY = 0; uint8_t musuh2PosX = 255; uint8_t musuh2PosY = 0;
// varialble untuk secara rawak memberikan nombor jalur untuk halangan
uint8_t laneGen = 0;
uint8_t laneGen0 = 0; uint8_t laneGen1 = 0; uint8_t laneGen2 = 0;
// pembilang skor
skor panjang = 0; // ini adalah skor: / lol panjang membandingkan = 0; // ini menyimpan skor pada tahap terakhir hingga dibandingkan dengan skor tinggi yang panjang = 25; uint8_t metreCnt = 0;
di sinilah kita memulakan fungsi
// ini adalah himpunan perintah jika interrupt diaktifkan void interruptressed () {delay (150); kemas kiniDirection (); } // kemas kini nilai mana yang berada di arah var dengan memeriksa bool DIR // -------------------------- KEMASKINI ARAHAN (pemain) - ------------------------- batal updateDirection () {//Serial.println("updateDirection Called "); BUTUP = digitalRead (UPPIN); BUTDWN = digitalRead (DWNPIN); BUTLFT = digitalRead (LFTPIN); BUTRHT = digitalRead (RHTPIN); jika (BUTUP == true) {dirPressed = DIRUP; } jika (BUTDWN == true) {dirPressed = DIRDOWN; } jika (BUTLFT == true) {dirPressed = DIRLEFT; } jika (BUTRHT == true) {dirPressed = DIRRIGHT; }
}
// ------------------------------- Pindahkan KERETA --------------- -------------------------
// ini akan mengemas kini layar penggerak sprite kereta
kereta kosong ()
{switch (dirPressed) {case DIRUP: carPosYCnt--; carPosY [carPosYCnt]; nada (SND, 100, 100); jika (carPosYCnt == 255) {carPosYCnt = 0; } carYTmp = carPosY [carPosYCnt]; dirTekanan = 0; // Serial.println ("carPosY up"); // Serial.println (carPosYCnt); rehat; kes DIRDOWN: carPosYCnt ++; nada (SND, 100, 100); jika (carPosYCnt == 4) {carPosYCnt = 3; } // Serial.println ("carPosY"); // Serial.println (carPosYCnt); carYTmp = carPosY [carPosYCnt]; dirTekanan = 0; rehat; // mengulas kereta yang dapat menggerakkan pengesan perlanggaran kiri dan kanan belum begitu baik / * kes DIRLEFT: carPosX--; jika (carPosX == 0) {carPosX = 1; } // Serial.println ("carPosX"); // Serial.println (carPosX); dirTekanan = 0; rehat; * / case DIRRIGHT: // hanya untuk bersenang-senang jika anda menekan kanan permainan akan mengeluarkan nada suara (SND, 100, 50); // carPosX ++; // if (carPosX == 128) // {// carPosX = 127; //} // Serial.println ("carPosX"); // Serial.println (carPosX); // dirTekanan = 0; rehat; } kemas kini Paparan (); }
// -------------------------- RANDOM POS X ------------------- -----------
uint8_t randomPosX () // 2 rutin ini hanya menghasilkan kedudukan rawak untuk rintangan
{uint8_t posValTmp = 0; posValTmp = rawak (129, 230); //Serial.println("random x "); //Serial.println(posValTmp); pulangan (posValTmp); }
// --------------------------- RANDOM POS Y ------------------ ------------------
uint8_t randomPosY ()
{uint8_t laneVal = 0; laneVal = rawak (0, 4); // tambahkan jalur tambahan untuk keacakan iaitu tidak ada objek di layar semasa berada di jalur itu //Serial.println("RandomY "); //Serial.println(lanePosArr[laneVal]); kembali (lanePosArr [laneVal]); }// ------------------------------- SET PERMAINAN -------------- -------------- void setGameSpeed () // ini menghentikan tahap yang lebih tinggi daripada 20 menjadikan permainan tidak dapat dimainkan {jika (drawSpeed <21) {drawSpeed = drawSpeed + 2; }}// ------------------------------------ DETECT CRASH ---------- ----------------------- kekosongan mendeteksiCrash () {
jika (musuh0PosX = 0 && musuh0PosY == carYTmp)
{// Serial.println ("Game Over CRAASSSSHHHHHHHEEEEDDD ke Traffic 0"); permainan tamat(); } jika (musuh1PosX = 0 && musuh1PosY == carYTmp) {//Serial.println("Game Over CRAASSSSHHHHHHHEEEEDDD ke dalam trafik 1 "); permainan tamat(); } jika (musuh2PosX = 0 && musuh2PosY == carYTmp) {//Serial.println("Game Over CRAASSSSHHHHHHHEEEEDDD ke dalam trafik 2 "); permainan tamat(); }}
ini adalah rutin yang menarik paparan.
// ------------------------------- JALAN GAMBAR --------------- --------------------- batal drawRoad () // X, Y, panjang, lebar {display.fillRect (roadLineX1, 15, 30, 4, WHITE); display.fillRect (roadLineX1, 30, 30, 4, PUTIH); display.fillRect (roadLineX1, 45, 30, 4, PUTIH); display.fillRect (roadLineX2, 15, 30, 4, PUTIH); display.fillRect (roadLineX2, 30, 30, 4, PUTIH); display.fillRect (roadLineX2, 45, 30, 4, PUTIH); display.fillRect (roadLineX3, 15, 30, 4, PUTIH); display.fillRect (roadLineX3, 30, 30, 4, PUTIH); display.fillRect (roadLineX3, 45, 30, 4, PUTIH); display.fillRect (roadLineX4, 15, 30, 4, PUTIH); display.fillRect (roadLineX4, 30, 30, 4, PUTIH); display.fillRect (roadLineX4, 45, 30, 4, PUTIH); display.fillRect (roadLineX5, 15, 30, 4, PUTIH); display.fillRect (roadLineX5, 30, 30, 4, PUTIH); display.fillRect (roadLineX5, 45, 30, 4, PUTIH);
roadLineX1 = roadLineX1-drawSpeed;
roadLineX2 = roadLineX2-drawSpeed; roadLineX3 = roadLineX3-drawSpeed; roadLineX4 = roadLineX4-drawSpeed; roadLineX5 = roadLineX5-drawSpeed; paparan.display (); } // ----------------------------------------- LUKISAN musuh ---- --------------------------------------- kosongkan enysDraw () {// X, Y, nama bmp, lebar, tinggi, paparan warna.drawBitmap (musuh0PosX, musuh0PosY, ENEMY0, ENEMY0_WIDTH, ENEMY0_HEIGHT, 1); musuh0PosX = musuh0PosX-drawSpeed; display.drawBitmap (musuh1PosX, musuh1PosY, ENEMY1, ENEMY1_WIDTH, ENEMY1_HEIGHT, 1); musuh1PosX = musuh1PosX-drawSpeed; display.drawBitmap (musuh2PosX, musuh2PosY, ENEMY2, ENEMY2_WIDTH, ENEMY2_HEIGHT, 1); musuh2PosX = musuh2PosX-drawSpeed; paparan.display (); jika (musuh0PosX> 231 && musuh0PosX231 && musuh1PosX <255) {musuh1PosX = randomPosX (); musuh1PosY = randomPosY (); semakDuplikasi (); }
jika (musuh2PosX> 231 && musuh2PosX <255) {musuh2PosX = randomPosX (); musuh2PosY = randomPosY (); }} // ------------------------------------ TAMPILKAN KEMASKINI -------- ---------------------------------------- batal updateDisplay () {display.clearDisplay (); display.drawBitmap (carPosX, carPosY [carPosYCnt], CARSPRITE, 30, 15, 1); display.fillRect (100, 0, 28, 10, HITAM); display.setCursor (100, 0); display.setTextColor (PUTIH, HITAM); display.println (skor); paparan.display ();
}
// ------------------------- tunggu loop tekan ------------------- ------
// ini adalah kod skrin utama batal waitForPress () {splashScreen (); bool menunggu = 0; // gelung berakhir apabila ini adalah display.clearDisplay (); sementara (menunggu == 0) {
display.fillRect (19, 20, 90, 32, HITAM); // latar belakang kosong untuk teks
display.setTextColor (PUTIH); display.setCursor (23, 24); display.setTextSize (0); display.println ("Tidak peduli"); display.setCursor (36, 34); display.println ("Racer"); display.drawBitmap (74, 24, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // x y w h r col display.drawRoundRect (21, 21, 86, 23, 4, PUTIH); // perbatasan Snake display.drawRect (19, 20, 90, 33, WHITE); // kotak sempadan - 3 display.setCursor (25, 43); display.setTextSize (0); // fon kembali ke paparan normal.println ("tekan sebarang kekunci"); display.fillRect (0, 0, 127, 8, HITAM); display.setCursor (10, 0); display.print ("Skor Tinggi:"); // paparkan paparan skor tinggi.cetak (markah tinggi); paparan.display (); menunggu = digitalRead (INTPIN); // periksa untuk melihat apakah penekanan tombol yang ditekan akan berubah menjadi 1 akhir sementara dirPressed = 0; // butang reset tekan tanpa arah}} // -------------------------------------- ----- UPDATE GAME ----------------------------------------- batal updateGame () {moveCar (); drawRoad (); enysDraw (); // musuh1Draw (); // musuh2Draw (); metreCnt ++; mengesanCrash (); jika (metreCnt == 5) // menambah mata untuk setiap 10 kitaran untuk mencatat skor {metreCnt = 0; skor ++; } jika (skor == bandingkan + 5) // mempercepat permainan setiap 5 mata hingga maksimum 20 kelajuan {bandingkan = skor; setGameSpeed (); } noTone (SND); kemas kini Paparan ();
}
// ------------------------------ PERMAINAN TAMAT---------------- ------------------------------
// rutin ini menarik garis di sekitar kereta wira yang mati kemudian memaparkan permainan di atas skrin
permainan batalLebih ()
{nada (SND, 200, 200); // mainkan suara uint8_t linePosX, linePosY, pixwidth, pixheight = 0; // tetapkan vars untuk melukis kotak di sekitar garisan keretaPosX = carPosY; linePosY = carYTmp; lebar piksel = 30; pixheight = 15; display.drawRect (linePosX, linePosY, pixwidth, pixheight, WHITE); paparan.display (); untuk (int i = 0; i <= 26; i ++) // ini mengelilingi kereta dalam bentuk segi empat tepat yang mensimulasikan letupan {linePosX = linePosX-2; linePosY = linePosY-2; pixwidth = pixwidth + 4; pixheight = pixheight + 4; display.drawRect (linePosX, linePosY, pixwidth, pixheight, BLACK); display.drawRect (linePosX, linePosY, pixwidth, pixheight, WHITE); paparan.display (); nada (SND, i * 20, 50); kelewatan (10); } display.setTextSize (2); display.setTextColor (PUTIH, HITAM); display.setCursor (10, 23); nada (SND, 50, 500); display.print ("PERMAINAN"); paparan.display (); kelewatan (500); nada (SND, 40, 500); display.print ("OVER"); display.setTextSize (0); paparan.display (); kelewatan (3000); mulakan semulaGame (); tungguForPress (); }
// ----------------------------------------- RESTART GAME ----- -------------------------------------------------- -----
void restartGame () // ini menyalin skor tinggi dan menetapkan semula semua statistik dan menghasilkan kedudukan rawak
{if (skor> = skor tinggi) // periksa untuk melihat apakah skor lebih tinggi daripada skor tinggi {skor tinggi = skor; // tunggal jika penyataan untuk mengemas kini skor tinggi}
skor = 0;
drawSpeed = 4; metreCnt = 0; keretaPosYCnt = 0; musuh0PosX = randomPosX (); musuh0PosY = randomPosY (); musuh1PosX = randomPosX (); musuh1PosY = randomPosY (); musuh2PosX = randomPosX (); musuh2PosY = randomPosY (); noTone (SND);
semakDuplikasi ();
}
// ------------------------------------------------ - CHECK DUPLICATE ----------------------------------------------- ------ void checkDuplicate () // periksa ini untuk melihat apakah halangan memenuhi ruang permainan yang sama {// Serial.println ("duplicate check"); jika (musuh2PosX> 230 && musuh2PosX <255) {manakala (musuh2PosY == musuh1PosY || musuh2PosY == musuh0PosY) {musuh2PosY = randomPosY (); }}
jika (musuh0PosX> 230 && musuh0PosX230 && musuh2PosXenemy1PosX && musuh2PosX230 && musuh0PosXenemy1PosX && musuh0PosX
// ------------------------------------------- LAYAR SPLASH --- --------------------------------
batal percikan Skrin ()
{display.clearDisplay (); display.drawBitmap (0, 0, CRASH, CRASHWIDTH, CRASHHEIGHT, 1); paparan.display (); kelewatan (2000); } // ----------------------------------------------- PENYEDIAAN ------------------------------------------------- ----------- batal persediaan () {kelewatan (100); // biarkan perkara bermula // Serial.begin (9600); // melepaskan ini dan semua Seri. arahan untuk kesalahan diag display.begin (SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay (); display.setTextColor (PUTIH, HITAM); display.setTextWrap (palsu); display.dim (0); pinMode (INTPIN, INPUT); pinMode (UPPIN, INPUT); pinMode (DWNPIN, INPUT); pinMode (LFTPIN, INPUT); pinMode (RHTPIN, INPUT);
attachInterrupt (digitalPinToInterrupt (INTPIN), interruptressed, RISING);
// secara rawak letakkan halangan musuh0PosX = randomPosX (); musuh0PosY = randomPosY (); musuh1PosX = randomPosX (); musuh1PosY = randomPosY (); musuh2PosX = randomPosX (); musuh2PosY = randomPosY (); semakDuplikasi (); // periksa lokasi pendua // Serial.println ("persediaan Selesai"); skrin percikan (); tungguForPress (); } // ----------------------------------------------- ----- LOOP -------------------------------------------- ----------
gelung kosong ()
{updateGame (); }
dan cukup banyak, pengubahsuaian dan maklum balas akan diterima. Isu-isu yang perlu kita atasi kelipan skrin kita perlu melihat bagaimana cara mengurangkannya dan kereta musuh masih dapat menempati ruang yang sama.
Disyorkan:
Perolehan, Amplifikasi, dan Reka Bentuk Litar Penapisan Elektrokardiogram Asas: 6 Langkah
Perolehan, Amplifikasi, dan Reka Bentuk Litar Penapisan Elektrokardiogram Asas: Untuk menyelesaikan petunjuk ini, satu-satunya perkara yang diperlukan adalah komputer, akses internet, dan beberapa perisian simulasi. Untuk tujuan reka bentuk ini, semua litar dan simulasi akan dijalankan di LTspice XVII. Perisian simulasi ini mengandungi
Asas VBScript - Memulakan Skrip, Kelewatan dan Banyak Lagi !: 5 Langkah
Asas VBScript - Memulakan Skrip, Kelewatan dan Banyak Lagi !: Selamat datang ke tutorial pertama saya tentang cara membuat VBScript dengan notepad. Dengan fail.vbs, anda boleh membuat beberapa lelucon lucu atau virus yang mematikan. Dalam tutorial ini, saya akan menunjukkan kepada anda arahan asas seperti memulakan skrip anda, membuka fail dan banyak lagi. Pada t
Pemasa 555 Dengan Kaunter Dekad dan LEDS dan Piezo Buzzer; Penerangan asas Litar: 6 Langkah
555 Pemasa Dengan Pembilang Dekad dan LEDS dan Piezo Buzzer; Penerangan asas Litar: Litar ini terdiri daripada tiga bahagian. Mereka adalah buzzer piezo yang menghasilkan bunyi. Kod (program) akan dimainkan " Selamat Hari Lahir " oleh Arduino melalui piezo. Langkah seterusnya adalah pemasa 555 yang akan menghasilkan denyutan yang bertindak sebagai jam
Membaiki Masalah Perisian Keras Komputer Asas (Kegagalan Cakera sistem dan PSU Pecah dan Fail Hilang / rosak): 4 Langkah
Membaiki Masalah Perisian Keras Komputer Asas (Kegagalan Cakera sistem dan PSU Pecah dan Fail yang Hilang / rosak): PANDUAN INI TIDAK AKAN SELESAI, SAYA AKAN MENAMBAH MAKLUMAT LANJUT KETIKA SAYA MENDAPAT Peluang. Sekiranya anda memerlukan pertolongan untuk memperbaiki komputer atau jika anda mempunyai sebarang pertanyaan untuk menghantar mesej kepada saya " Dalam arahan ini, saya akan memberitahu anda bagaimana membaiki asas
Asas Yang Sangat Asas dari Laman Web berasaskan Div: 7 Langkah
Asas Yang Sangat Asas dari Laman web yang berasaskan Div: Arahan ini akan menunjukkan kepada anda asas bagaimana membina laman web dengan div. Kerana jadual yang digunakan untuk susun atur adalah jahat !: pUntuk memahami arahan ini, anda perlu mengetahui html dan css asas. Sekiranya anda tidak memahami sesuatu, sila