
Բովանդակություն:
2025 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2025-01-23 14:48


Այս ձեռնարկում մենք կանդրադառնանք, թե ինչպես օգտագործել bitmaps- ը ՝ օգտագործելով Adafruit_GFX.c գրադարանը ՝ որպես խաղերի սպիրտ: Ամենապարզ խաղը, որի մասին մենք կարող էինք մտածել, կողային ոլորման մեքենա փոխող խաղն է, ի վերջո, մեր բետա փորձարկողն ու օգնական կոդավորողը որոշեցին «Անխոհեմ մրցարշավորդը» որպես անուն, քանի որ մայրուղին սխալ ճանապարհով վարելը բավականին անխոհեմ է:
Մեր սխեմայի դիզայնը ներկայացված է վերը նշված նկարներում և մանրամասն նկարագրված է մեր վերջին նախագծում/ձեռնարկում Snake Instructables- ում, որը նկարագրում է, թե ինչպես է աշխատում միացումը:
մենք կպահանջենք
Adafruit_GFX
Paint.net
Arduino IDE windowslinux
և խնդրում ենք դիտել Օձի ձեռնարկը մնացած սարքավորումների համար:
Պարագաներ
Օձի խաղ
Քայլ 1: Paint.net- ի տեղադրում



Մենք օգտագործում ենք paint.net- ը, քանի որ ծրագրակազմն անվճար է, այնպես որ լիովին ազատ օգտագործման համար կարող եք ներբեռնել Paint. Net- ը այստեղ:
Paint.net- ը տեղադրելու համար կրկնակի կտտացրեք ներբեռնված ծրագրին և հաջորդաբար դրական պատասխանեք, այո, լավ, ես համաձայն եմ, և վերը նկարները ձեզ ուղղություններ կտան:
Քայլ 2: Նկարեք պարզ շաղ տալու էկրան



Երբ paint.net- ում եք, ստեղծեք նոր պատկեր ՝ կտտացնելով Ֆայլը, այնուհետև նորը, պատկերի չափը սահմանեք 1260x620 (տես առաջին նկարը) կտտացրեք լավ, երբ նոր էջ ունեք, նկարեք ցնցող էկրան ՝ օգտագործելով միայն 2 գույն սև և սպիտակ, մատիտի միջոցով: գործիք (նկար 2), երբ նկարում (կամ կպցնում եք) ձեր շաղ տալու էկրանի պատկերը, կտտացրեք պատկերի վրա, այնուհետև չափափոխեք (պատկերը 4), բացվող պատուհանում փոխեք չափը 1260x620- ից մինչև 126x62 (ձեր էկրանից 2 պիքսել փոքր) (նկար 5) Սեղմեք OK:
հաջորդ կտտացրեք Ֆայլի ընտրացանկին, այնուհետև պահեք որպես (pic6):
երբ ֆայլի տիպի բացվող ընտրացանկում հայտնվում է բացվող ընտրացանկը, ընտրեք BMP (bitmap): (pic7), մուտքագրեք ֆայլի անունը և կտտացրեք պահպանել:):
Քայլ 3. BMP- ի փոխարկում C- ի Bitmap ֆայլ




Այժմ մենք պետք է մեր պատկերը փոխարկենք այնպիսի ձևաչափի, որը arduino- ն կարող է հասկանալ, որ դրա համար կան բազմաթիվ գործիքներ, բայց իմ «գնալ» -ը այն է, որ marlin webs site bitmap փոխարկիչ գործիք է…
marlinfw.org/tools/u8glib/converter.html
Այսպիսով, մենք սկսում ենք այս բաժինը `օգտագործելով վերը նշված հղումը` բացելու համար կայքը, որը ցույց է տրված pic1- ում
կտտացրեք ընտրեք ֆայլը և ընտրեք ավելի վաղ ստեղծված bitmap- ը (նկար 2)
marlin bitmap փոխարկիչը ձեր պատկերը ինքնաբերաբար կվերածի c կոդի, ձախը կրկնակի կտտացրեք այն կոդի վրա, որը պետք է ընդգծի ծածկագիրը, այնուհետև աջ կտտացրեք և կտտացրեք պատճենը (նկար 3)
հաջորդ Մենք ստեղծում ենք աջ կտտոց և ստեղծում ենք նոր տեքստային փաստաթուղթ (նկար 4)
կրկնակի սեղմեք նոր փաստաթղթի վրա, երբ բացվի, աջ սեղմեք և տեղադրեք ծածկագիրը (նկար 5)
Հաջորդը, մենք պետք է ավելացնենք տողը #ծածկագրի վերևի մոտ, ինչը թույլ է տալիս մեզ պահպանել bitmap- ի տվյալները arduino- ի ֆլեշ հիշողության մեջ, այնուհետև վերանվանենք #սահմանել լայնությունը, բարձրությունը և անունը ինչ -որ ավելի հեշտ օգտագործման համար: նկար 6 -ում, մենք դրանք վերանվանում ենք պատահականորեն գեներացվող կերպարներից և դրանք վերանվանում ենք ստորև նշված ընդգծված օրինակին
#սահմանեք LOGOWIDTH- ը
#սահմանեք ԼՈԳՈEԱՅԻՆ
const unsigned char LOGOPIC PROGMEM
հաջորդ կտտացրեք ֆայլը, այնուհետև պահեք որպես, պահպանեք ֆայլը որպես logo.c փակեք նոթատետրը, աջ կտտացրեք logo.c- ին և կտտացրեք պատճենը:
Քայլ 4: Լոգոյի ցուցադրում DrawBitmap- ի միջոցով



Այժմ մենք բեռնում ենք arduino IDE- ն և ստեղծում նոր ուրվագիծ և պահում այն որպես logoexample.ino, այնուհետև arduino ide- ում խաբեությամբ կտտացրեք ֆայլի ընտրացանկին, այնուհետև պահեք որպես, վերադառնաք ծրագրի թղթապանակին աջ սեղմեք և տեղադրեք.c ֆայլում (նկ. 2), այնուհետև կտտացրեք չեղարկել, սա փրկում է ձեզ ՝ ֆայլում տեղադրելու համար թերթել թղթապանակը:
arduino IDE- ում մուտքագրեք հետևյալ կոդը կամ ներբեռնեք ino- ում:
(խորհուրդ ենք տալիս մուտքագրել ոչ թե պատճենել և տեղադրել կամ օգտագործել ստորև ներկայացված ֆայլերը սովորելու լավագույն միջոցն է)
#ներառել /* սա կտարբերվի ՝ կախված պահեստավորման վայրից
ino- ն սովորաբար C: / Users / ~ username / Documents / Arduino / project ~ անունը
և ահա թե ինչպես ենք մենք կապում մեր bitmap- ին */
#ներառում
#ներառում
uint8_t bmpX, bmpY = 0; /* պահեստավորել հիշողությունը 2 X 8 բիթ ամբողջ թվերի համար, մեզ անհրաժեշտ է ընդամենը 8 բիթ ինտեր
քանի որ արժեքը երբեք չի գերազանցում 128 -ը (պիքսել), այնպես որ մենք կարող ենք տարածք խնայել ՝ օգտագործելով 8 բիթ ինտենսիվություն (որն ունի առավելագույն արժեքը 255) */
դատարկ կարգավորում ()
{ուշացում (100); // ցուցադրմանը և այլն ժամանակ տվեք ցուցադրմանը միացնելու համար: սկսել (SSD1306_SWITCHCAPVCC, 0x3C); // սա նախաստորագրելու է ցուցադրման էկրանը: clearDisplay (); // սկսել դատարկ էկրանով}
/* խնդրում ենք նկատի ունենալ, որ պետք չէ մուտքագրել այս մեկնաբանությունները, քանի որ դրանք հղման համար են …………..
հրամանը, որի վրա մենք կենտրոնանալու ենք, display.drawBitmap- ն է, սա այն է, ինչ ձգում է մեր շաղ տալու էկրանը: (bmpX, էկրանին X առանցքի արժեքն է, որտեղ կլինի bitmap- ի X խարիսխի կետը, և bmpX և bmpY այն արժեքներն են, որոնք մեզ հետաքրքրում են շարժում ստեղծելու համար (bmpY, Y առանցքի արժեքն է էկրանին, որտեղ Y խարիսխը bitmap- ի կետը կլինի այն, որ մենք ստանում ենք տեղեկատուի անունները, ինչպես դրանք սահմանել ենք logo.c- ում (LOGOPIC, bitmap- ի անունն է #ներառված ֆայլի logo.c- ում (LOGOWIDTH, քանի՞ պիքսել է (X) ՝ նկարելու համար bitmap խարիսխի կետից (LOGOHEIGHT, քանի՞ պիքսել ներքև (Y) է, որ խարիսխի կետից bitmap- ը քաշվի, X և Y պիքսելները կարող են ձեռքով մուտքագրվել, բայց ավելի հեշտ է օգտագործել կանխորոշվածները, քան բոլորը հիշել (1, վերջին արժեքը գույնն է, քանի որ էկրանը մոնո է 0 սև 1 սպիտակ: լավ սկսեք մուտքագրել հաջորդ տողից ՝ ¬D lol*/ void loop () {display.clearDisplay (); // դատարկել էկրանը // bitmap վերև ձախ, x, y, bitmap- ի անուն, լայնություն X, բարձրություն Y, գույնի ցուցադրում: նկարել bitmap (bmpX, bmpY, LOGOPIC, LOGOWIDTH, LOGOHEIGHT, 1); ցուցադրում: ցուցադրում (); // սա իրականում բուֆերը ձգում է ցուցադրման երբևէ}
վերբեռնեք ձեր arduino կոդը և հաստատեք, որ այն աշխատում է (նկար 3):
Քայլ 5. Bitmap Sprite- ի տեղափոխում




Օգտագործելով ավելի վաղ հրահանգները, օգտագործեք paint.net- ը և ստեղծեք նոր ֆայլ ՝ այն դարձնելով 30x15 պիքսել (նկար 1) և նկարեք կոպիտ մեքենա, որը մեր երիտասարդ դիզայները նախ սկսում է դիմապակուց (նկարներ 2 և 3):
կրկին պահեք այն որպես windows bmp ֆայլ (ինչպես քայլ 2 -ում), փոխարկեք C բիթ քարտեզի (քայլ 3) և տեղադրեք car.c ֆայլը (կամ այն, ինչ որոշեք) նույն թղթապանակում, ինչպես նորաստեղծ arduino ino- ն (էսքիզ) ֆայլը:
(պ.
Նախ կապեք ձեր համարժեք մեքենային: c
#ներառում
#ներառել #ներառել Adafruit_GFX.h> // https://github.com/adafruit/Adafruit-GFX-Library #include Adafruit_SSD1306 //
Adafruit_SSD1306 էկրան (128, 64); // սահմանել ցուցադրման լուծաչափը
/* bmpX/bmpY մենք պետք է դրանք փոփոխական լինենք, քանի որ փոխում ենք այս արժեքները և վերագծում
էկրանն այն է, թե ինչպես ենք մենք ստեղծում շարժման անիմացիոն էֆեկտ: hitSide և hitTop այն է, թե ինչպես ենք մենք սպրիտ պահում էկրանին */ uint8_t bmpX, bmpY = 0; // պահեստավորել հիշողություն 2 8 բիթանոց (0-255) համար, մեզ պետք չէ ավելի մեծ 128-ը կլինի ամենամեծ թիվը, որն օգտագործվում է bool hitSide = 0; bool hitTop = 0;
դատարկ կարգավորում ()
{ուշացում (100); // ցուցադրմանը և այլն ժամանակ տվեք ցուցադրմանը միացնելու համար: սկսել (SSD1306_SWITCHCAPVCC, 0x3C); // սա նախաստորագրել ցուցադրման էկրանը: clearDisplay (); // սկսել դատարկ էկրանով
}
դատարկ շրջան ()
{display.clearDisplay (); // դատարկեք էկրանը // վերևից ձախ գծված bitmap, x, y, bitmap- ի անուն, լայնություն X, բարձրություն Y, գունավոր ցուցադրում: drawBitmap (bmpX, bmpY, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // display.display (); // սա իրականում ձգում է բուֆերը էկրանին երբևէ/ * ահա թե ինչպես ենք մենք հետևում էկրանի եզրին և որոշում, ավելացնել պիքսել տեղափոխել վերևից ներքև), թե հեռացնել պիքսել (տեղափոխել ներքևից վերև) */ անջատիչ (hitSide) // սա ընտրում է մեքենայի ուղղությունը ՝ հիմնվելով բուլայի վրա (դեպք 0: bmpX ++; ընդմիջում;
դեպք 1:
bmpX--; ընդմիջում; } // այս 2 if հայտարարությունները bool- ը ճշմարիտ կամ սխալ են դնում if (bmpX == 0) {hitSide = 0; } if (bmpX == 96) // էկրանի լայնությունը հանած մեքենան {hitSide = 1; } // նույնը, ինչ վերևում է Y առանցքի դեպքում, եթե (bmpY == 0) {hitTop = 0; } if (bmpY == 49) // էկրանի բարձրությունը հանած մեքենայի բարձրությունը {hitTop = 1; } անջատիչ (hitTop) {դեպք 0: bmpY ++; ընդմիջում; դեպք 1: bmpY--; ընդմիջում; }
}
ծրագիրը կարող եք տեսնել կից տեսանյութում
Քայլ 6. Վարորդական խաղ պատրաստելը


Սկզբում մենք նկարում ենք մի քանի տարբեր մեքենաներ կամ խոչընդոտներ, ինչպես ձեռնարկի սկզբնական փուլերում `դրանք դարձնելով 30x15 պիքսել: Այնուհետև դրանք փոխակերպում ենք c բիթ քարտեզների և կապում կոդի մեջ:
#ներառել // այս ուղիները պետք է փոխվեն կախված
// որտեղ եք պահում ֆայլերը // խմբագրել. ես նոր եմ իմացել, եթե //- ը փոխարինում եք "" -ով, դուք չեք պահանջում ամբողջական ուղին // ձեր սեփական գրադարաններով #ներառել
#ներառում
#ներառել #ներառել
#ներառում
#ներառել // https://github.com/adafruit/Adafruit-GFX-Library #include <Adafruit_SSD1306 //
Adafruit_SSD1306 էկրան (128, 64); // սահմանել ցուցադրման պարամետրերը
սահմանել փոփոխականներն ու ֆիքսված արժեքները
// սահմանել մուտքային կապեր դրանք arduino- ի քորոցներն են, որոնք երբեք չեն փոխվում, այնպես որ #սահմանել #սահմանել INTPIN 3 // միայն 2 և 3 կապում կարող է լինել UNO #սահմանել UPPIN 4 // սրանք կապեր են tp համապատասխան անջատիչ #սահմանել DWNPIN 5 #սահմանել LFTPIN 6 #սահմանել RHTPIN 7 #սահմանել SND 9 // սահմանել ուղղություններ
#սահմանեք DIRUP 1 // այս արժեքներն են որոշում «օձը»-
#սահմանել IRԱՆIR 2 // ուղղությունը, որով կանցնի օձը #սահմանեք ԱՆԱԽԱԴԵՊ 3 #սահմանեք IRԻՇՏ 4
uint8_t dirPressed = 0; // արժեքը գրանցելու ուղղություն, որի վրա շարժվում է այն քորոցը, որը բարձրացել է
// բուլյան խանութ, որի քորոցը բարձրացավ
bool BUTUP = 0; բուլ BUTDWN = 0; բուլ BUTLFT = 0; բուլ BUTRHT = 0; // մեքենաներ մեքենայի դիրքի համար uint8_t carPosX = 1; uint8_t carPosY = {0, 16, 32, 48}; // կարիք ունի արժեքի, որը ծածկում է զանգվածը
uint8_t lanePosArr = {0, 16, 32, 48}; // զանգված `պահելու համար, որտեղ յուրաքանչյուր գոտի է
uint8_t carPosYCnt = 0; uint8_t մեքենաYTmp = 0; // փոփոխականներ ճանապարհի տողերի համար uint8_t roadLineX1 = 51; // դրանք նախապես որոշված են սկզբում, ապա գծերը հայտնվում են անթերի uint8_t roadLineX2 = 102; uint8_t roadLineX3 = 153; uint8_t roadLineX4 = 254; uint8_t roadLineX5 = 200;
// սա միաժամանակ քանի պիքսել է շարժվում խաղային տարածքը
uint8_t drawSpeed = 4;
// վարսեր թշնամու համար 0
uint8_t թշնամի0PosX = 255; uint8_t թշնամի0PosY = 0; uint8_t թշնամի 1PosX = 255; uint8_t թշնամի 1PosY = 0; uint8_t թշնամի 2PosX = 255; uint8_t թշնամի 2PosY = 0;
// varialble to random նշանակել խոչընդոտներին գոտու համարը
uint8_t գոտի Gen = 0;
uint8_t laneGen0 = 0; uint8_t laneGen1 = 0; uint8_t laneGen2 = 0;
// միավորների հաշվիչ
երկար հաշիվ = 0; // սա հաշիվն է./ lol long համեմատել = 0; // սա պահպանում է հաշիվը վերջին մակարդակի վրա ՝ համեմատելով երկար բարձր գնահատականի հետ = 25; uint8_t metreCnt = 0;
այստեղ մենք սկսում ենք գործառույթները
// սա հրամանների ամբողջությունն է, եթե ընդհատումն ակտիվացված է void interruptressed () {հետաձգում (150); updateDirection (); } // թարմացնել, թե որ արժեքն է var ուղղությամբ ՝ ստուգելով DIR բուլղարական տվյալները // -------------------------- UPDATE DIRECTION (նվագարկիչ)- ------------------------- անվավեր updateDirection () {//Serial.println("updateDirection Called "); BUTUP = digitalRead (UPPIN); BUTDWN = digitalRead (DWNPIN); BUTLFT = digitalRead (LFTPIN); BUTRHT = digitalRead (RHTPIN); եթե (BUTUP == true) {dirPressed = DIRUP; } if (BUTDWN == true) {dirPressed = DIRDOWN; } if (BUTLFT == true) {dirPressed = DIRLEFT; } if (BUTRHT == true) {dirPressed = DIRRIGHT; }
}
// ----------------------------------- ՇԱՐVEԵԼ ՄԵՔԵՆԱ --------------- -------------------------
// սա կթարմացնի էկրանի շարժիչը մեքենայի սփրեյթով
դատարկ moveCar ()
{switch (dirPressed) {case DIRUP: carPosYCnt--; carPosY [carPosYCnt]; տոնայնություն (SND, 100, 100); եթե (carPosYCnt == 255) {carPosYCnt = 0; } carYTmp = carPosY [carPosYCnt]; dirPressed = 0; // Serial.println ("carPosY up"); // Serial.println (carPosYCnt); ընդմիջում; պատյան DIRDOWN: carPosYCnt ++; տոնայնություն (SND, 100, 100); եթե (carPosYCnt == 4) {carPosYCnt = 3; } // Serial.println ("carPosY"); // Serial.println (carPosYCnt); carYTmp = carPosY [carPosYCnt]; dirPressed = 0; ընդմիջում; // մեկնաբանեց մեքենան, որը կարող է տեղաշարժել ձախ և աջ բախումների հայտնաբերումը դեռևս այդքան էլ լավ չէ** դեպք ՇՆՈՐՀԱՎՈՐ: carPosX--; եթե (carPosX == 0) {carPosX = 1; } // Serial.println ("carPosX"); // Serial.println (carPosX); dirPressed = 0; ընդմիջում; */ դեպք DIRRIGHT: // պարզապես հաճույքի համար, եթե աջ սեղմեք, խաղը աղմուկի ազդանշան կհանի (SND, 100, 50); // carPosX ++; // եթե (carPosX == 128) // {// carPosX = 127; //} // Serial.println ("carPosX"); // Serial.println (carPosX); // dirPressed = 0; ընդմիջում; } updateDisplay (); }
// -------------------------- Պատահական POS X ------------------- -----------
uint8_t randomPosX () // այս 2 ռեժիմները պարզապես պատահական դիրք են ստեղծում խոչընդոտների համար
{uint8_t posValTmp = 0; posValTmp = պատահական (129, 230); //Serial.println(" պատահական x "); //Serial.println(posValTmp); վերադարձ (posValTmp); }
// ------------------------------- Պատահական POS Y ------------------ ------------------
uint8_t randomPosY ()
{uint8_t laneVal = 0; laneVal = պատահական (0, 4); // ավելացրեք լրացուցիչ գոտի պատահականության համար, այսինքն ՝ էկրանին ոչ մի օբյեկտ այդ գոտում գտնվելու ընթացքում //Serial.println("RandomY "); //Serial.println(lanePosArr [laneVal]); վերադարձ (lanePosArr [laneVal]); }// ----------------------------------- ԿԱՌԱՎԱՐԵԼ ԽԱԻԸ -------------- -------------- void setGameSpeed () // սա կանգնեցնում է 20-ից բարձր մակարդակի բարձրացումը ՝ խաղը չխաղարկելով {եթե (drawSpeed <21) {drawSpeed = drawSpeed+2; }}// ---------------------------------------- ԲԱԱՀԱՅՏԵԼ CRԱՆAS ----------------------- անվավեր deteCrash () {
եթե (թշնամի 0PosX = 0 && թշնամի 0 Պոսյ == carYTmp)
{// Serial.println ("Game Over CRAASSSSHHHHHEEEEDD Traffic 0"); խաղն ավարտված է(); } if (dijmin1PosX = 0 && dijmin1PosY == carYTmp) {//Serial.println("Game Over CRAASSSSHHHHHHEEEDDD երթևեկության մեջ 1 "); խաղն ավարտված է(); } if (dijmin2PosX = 0 && dijmin2PosY == carYTmp) {//Serial.println("Game Over CRAASSSSHHHHHHEEEDED երթևեկության մեջ 2 "); խաղն ավարտված է(); }}
դրանք այն ռեժիմներն են, որոնք ձգում են էկրանը:
// ------------------------------- ՔԱԱՔԱԿԱՆ ADԱՆԱՊԱՐՀ --------------- --------------------- անվավեր drawRoad () // X, Y, երկարություն, լայնություն {display.fillRect (roadLineX1, 15, 30, 4, WHITE); display.fillRect (roadLineX1, 30, 30, 4, WHITE); display.fillRect (roadLineX1, 45, 30, 4, WHITE); display.fillRect (roadLineX2, 15, 30, 4, WHITE); display.fillRect (roadLineX2, 30, 30, 4, WHITE); display.fillRect (roadLineX2, 45, 30, 4, WHITE); display.fillRect (roadLineX3, 15, 30, 4, WHITE); display.fillRect (roadLineX3, 30, 30, 4, WHITE); display.fillRect (roadLineX3, 45, 30, 4, WHITE); display.fillRect (roadLineX4, 15, 30, 4, WHITE); display.fillRect (roadLineX4, 30, 30, 4, WHITE); display.fillRect (roadLineX4, 45, 30, 4, WHITE); display.fillRect (roadLineX5, 15, 30, 4, WHITE); display.fillRect (roadLineX5, 30, 30, 4, WHITE); display.fillRect (roadLineX5, 45, 30, 4, WHITE);
roadLineX1 = roadLineX1-drawSpeed;
roadLineX2 = roadLineX2-drawSpeed; roadLineX3 = roadLineX3-drawSpeed; roadLineX4 = roadLineX4-drawSpeed; roadLineX5 = roadLineX5-drawSpeed; display.display (); } // -------------------------------------------- Թշնամիներ նկարել ---- ------------------------------------------- անվավեր enemysDraw () {// X, Y, bmp անունը, լայնությունը, բարձրությունը, գունավոր ցուցադրումը: drawBitmap (dijmin0PosX, թշնամի0PosY, Թշնամի 0, թշնամի 0_WIDTH, Թշնամի 0_ՀԱՅՈԹՅՈՆ, 1); թշնամի 0 ՊոսԽ = թշնամի 0 ՊոսԽ-ոչ-արագություն; display.drawBitmap (հակառակորդ 1 Պոսխ, թշնամի 1 Պոսյ, ԹՇՆԱՄ 1, ԹՇՆԱՄ 1_WIDTH, ԹՇՆԱՄ 1_ՀԱՅԹ, 1); հակառակորդ 1 Պոս X = թշնամի 1 Պոս X-drawSpeed; display.drawBitmap (dijmin2ՓոսՔ, թշնամի 2Պոսյ, ԹՇՆԱՄ 2, ԹՇՆԱՄ2_WIDTH, ԹՇՆԱՄԱՅԻՆ_ՀԱՅՈIGHԹՅՈՆ, 1); հակառակորդ2ՓոսՔ = թշնամի2ՊոսԽ-ձգում արագություն; display.display (); եթե (թշնամի0ՊոսՔ> 231 && թշնամիՊոսԽ231 && թշնամի 1 ՊոսԽ <255) {թշնամի 1 ՊոսԽ = պատահական ՊոսԽ (); հակառակորդ 1PosY = randomPosY (); checkDuplicate (); }
եթե (թշնամի 2 ՊոսԽ> 231 && թշնամի 2 ՊոսԽ <255) {թշնամի 2 ՊոսԽ = պատահական ՊոսԽ (); թշնամի 2PosY = randomPosY (); }} // ------------------------------------- Թարմացնել ցուցադրումը -------- -------------------------------------------- անվավեր updateDisplay () {display.clearDisplay (); display.drawBitmap (carPosX, carPosY [carPosYCnt], CARSPRITE, 30, 15, 1); display.fillRect (100, 0, 28, 10, ՍԵՎ); display.setCursor (100, 0); display.setTextColor (Սպիտակ, Սև); display.println (հաշիվ); display.display ();
}
// ------------------------- սպասեք սեղմումների հանգույցին ------------------- ------
// սա հիմնական էկրանի կոդը void waitForPress () {splashScreen (); բուլ սպասում = 0; // հանգույցն ավարտվում է, երբ դա ճշմարիտ display.clearDisplay (); մինչ (սպասում == 0) {
display.fillRect (19, 20, 90, 32, ՍԵՎ); // դատարկ ֆոն տեքստի համար
display.setTextColor (ՍՊԻՏԱԿ); display.setCursor (23, 24); display.setTextSize (0); display.println («Անխոհեմ»); display.setCursor (36, 34); display.println («Վազորդ»); display.drawBitmap (74, 24, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // x y w h r col display.drawRoundRect (21, 21, 86, 23, 4, ՍՊԻՏԱԿ); // եզրագիծ Snake display.drawRect (19, 20, 90, 33, WHITE); // սահմանային տուփ - 3 display.setCursor (25, 43); display.setTextSize (0); // տառատեսակը վերադառնալ նորմալ ցուցադրման: println («սեղմել ցանկացած ստեղն»); display.fillRect (0, 0, 127, 8, ՍԵՎ); display.setCursor (10, 0); display.print ("Բարձր գնահատական."); // ցուցադրել բարձր գնահատական display.print (highScore); display.display (); սպասում = digitalRead (INTPIN); // ստուգեք ՝ արդյոք ստեղնը սեղմած սպասումը կփոխվի 1 ավարտի, մինչ dirPressed = 0; // վերականգնել կոճակը սեղմել դեպի ոչ մի ուղղություն}} // ------------------------------------------ ----- Թարմացնել խաղը --------------------------------------------- անվավեր updateGame () {moveCar (); drawRoad (); enemysDraw (); // dijmin 1 Դար (); // dijmin2Դար (); metreCnt ++; deteCrash (); եթե (metreCnt == 5) // յուրաքանչյուր 10 ցիկլից միավոր է ավելացնում հաշիվը բարձրացնելու համար {metreCnt = 0; միավոր ++; } if (score == համեմատել+5) // յուրաքանչյուր 5 միավոր արագացնում է խաղը մինչև 20 արագություն {համեմատել = հաշիվ; setGameSpeed (); } noTone (SND); updateDisplay ();
}
// ------------------------------ ԽԱՂՆ ԱՎԱՐՏՎԱԾ Է---------------- ----------------------------------
// այս ռեժիմը գծեր է գծում մահացած հերոս մեքենայի շուրջը, այնուհետև ցուցադրում խաղը էկրանին
դատարկ խաղ Over ()
{տոն (SND, 200, 200); // նվագարկել ձայնը uint8_t linePosX, linePosY, pixwidth, pixheight = 0; // սահմանել վարսեր ՝ տուփեր գծելու մեքենայի գծի շուրջըPosX = carPosY; linePosY = carYTmp; pixwidth = 30; pixheight = 15; display.drawRect (linePosX, linePosY, pixwidth, pixheight, WHITE); display.display (); for (int i = 0; i <= 26; i ++) // սա մեքենան շրջապատում է պայթյունը մոդելավորող ուղղանկյուններով {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); display.display (); տոնայնություն (SND, i*20, 50); ուշացում (10); } display.setTextSize (2); display.setTextColor (Սպիտակ, Սև); display.setCursor (10, 23); տոնայնություն (SND, 50, 500); display.print («ԽԱAME»); display.display (); ուշացում (500); տոնայնություն (SND, 40, 500); display.print ("OVER"); display.setTextSize (0); display.display (); ուշացում (3000); restartGame (); waitForPress (); }
// ------------------------------------ ------------------------------------------------------ -----
void restartGame () // սա պատճենում է բարձր գնահատականը և զրոյացնում է բոլոր վիճակագրությունը և ստեղծում պատահական դիրքեր
{if (score> = highScore) // ստուգեք ՝ արդյոք բարձր միավորից բարձր միավոր կա՞ {highScore = հաշիվ; // միայնակ, եթե բարձր գնահատականը թարմացնելու համար}
հաշիվ = 0;
drawSpeed = 4; metreCnt = 0; carPosYCnt = 0; թշնամի 0PosX = randomPosX (); թշնամի0PosY = randomPosY (); հակառակորդ 1PosX = randomPosX (); հակառակորդ 1PosY = randomPosY (); թշնամի 2PosX = randomPosX (); թշնամի 2PosY = randomPosY (); noTone (SND);
checkDuplicate ();
}
// ---------------------------------------------------- -ՇՏԱՊԵԼ Կրկնօրինակ --------------------------------------------------- ------ void checkDuplicate () // սրանք ստուգեք ՝ տեսնելու, թե արդյոք խոչընդոտները զբաղեցնում են նույն խաղի տարածքը {// Serial.println («կրկնօրինակը ստուգված է»); if (dijmin2PosX> 230 && dijmin2PosX <255) {իսկ (թշնամի2Պոսյ == թշնամի 1 Պոսյ || թշնամի 2 ՊոսՅ == թշնամի 0 Պոսյ) {թշնամի 2 Պոսյ = պատահական Պոսյ (); }}
եթե (թշնամի 0PosX> 230 && թշնամի0PosX230 && dijmin2PosXenemy1PosX && dijmin2PosX230 && dijmin0PosXenemy1PosX && dijmin0PosX
//------------------------------------------- ՋՈՒՐ ՇԱՂ ՏԱԼ ԷԿՐԱՆԻՆ --- ------------------------------------
void splashScreen ()
{display.clearDisplay (); display.drawBitmap (0, 0, CRASH, CRASHWIDTH, CRASHHEIGHT, 1); display.display (); ուշացում (2000); } // --------------------------------------------------- ԿԱՐԳԱՎՈՐՈՄ ----------------------------------------------------- ----------- void setup () {հետաձգում (100); // թող ամեն ինչ սկսվի // Serial.begin (9600); // մեկնաբանել այս և ամբողջ Սերիալը: սխալների դիագրամի ցուցադրման հրամաններ. սկիզբ (SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay (); display.setTextColor (Սպիտակ, Սև); display.setTextWrap (կեղծ); display.dim (0); pinMode (INTPIN, INPUT); pinMode (UPPIN, INPUT); pinMode (DWNPIN, INPUT); pinMode (LFTPIN, INPUT); pinMode (RHTPIN, INPUT);
attachInterrupt (digitalPinToInterrupt (INTPIN), ընդհատված, RISING);
// պատահականորեն տեղադրեք խոչընդոտներ հակառակորդ0 թշնամի0PosY = randomPosY (); հակառակորդ 1PosX = randomPosX (); հակառակորդ 1PosY = randomPosY (); թշնամի 2PosX = randomPosX (); թշնամի 2PosY = randomPosY (); checkDuplicate (); // ստուգեք կրկնվող վայրերի առկայությունը // Serial.println ("setup Complete"); ջուր շաղ տալ էկրանին(); waitForPress (); } // --------------------------------------------------- ----- ՀԱՅՏՆԵԼ ------------------------------------------------ ----------
դատարկ շրջան ()
{updateGame (); }
և դա գրեթե այդպես է, ցանկացած փոփոխություն և արձագանք ողջունելի կլինի: Էկրանի թարթումը լուծելու համար մենք պետք է նայենք, թե ինչպես նվազեցնել այն, և թշնամու մեքենաները դեռ կարող են զբաղեցնել նույն տարածքը:
Խորհուրդ ենք տալիս:
Էլեկտրոնային խաղ Tic-Tac-Toe խաղ փայտե տուփի մեջ. 5 քայլ

Էլեկտրոնային խաղ Tic-Tac-Toe- ը փայտե տուփի մեջ
Interfacing Pushbutton - Arduino հիմունքներ. 3 քայլ

Ինտերֆեյսի կոճակ - Arduino հիմունքներ. Սեղմման կոճակը մի բաղադրիչ է, որը միացնելիս միացնում է շրջանի երկու կետերը: Երբ կոճակը բաց է (չճնշված), կոճակի երկու ոտքերի միջև կապ չկա, ուստի քորոցը միացված է 5 -ին: վոլտ (ձգվող ռեսուրի միջոցով
Aruduino LED խաղ Արագ կտտացնելով երկու խաղացողի խաղ. 8 քայլ

Aruduino LED խաղ Արագ սեղմում երկու խաղացողի խաղ. Այս նախագիծը ոգեշնչված է @HassonAlkeim- ից: Եթե պատրաստ եք խորը հայացք նետել, այստեղ կա մի հղում, որը կարող եք ստուգել https://www.instructables.com/id/Arduino-Two-Player-Fast-Button-Clicking-Game/: Այս խաղը Alkeim's- ի կատարելագործված տարբերակն է: Դա է
Arduino TFT ինտերֆեյս հիմունքներ. 10 քայլ (նկարներով)

Arduino TFT Interfacing հիմունքներ. TFT սենսորային էկրանները զարմանալի գրաֆիկական ինտերֆեյս են, որը կարող է օգտագործվել միկրոկոնտրոլերների հետ, ինչպիսիք են Atmel, PIC, STM, քանի որ այն ունի գունային լայն տեսականի, լավ գրաֆիկական ունակություն և պիքսելների լավ քարտեզավորում: Այսօր մենք գնում ենք դեպի ինտերֆեյս 2.4 դյույմանոց TFT
Arduino Esplora հիմունքներ. 4 քայլ

Arduino Esplora- ի հիմունքները. Ես քեզ այնտեղ չտեսա! Դուք պետք է ցանկանաք սովորել մեծ Esplora տախտակի հիմունքները: Դե, ներս եկեք, ներս մտեք: Այս ձեռնարկը ձեզ կսովորեցնի մի քանի կոկիկ հնարքների մասին, որոնք կարող եք անել ձեր Esplora- ի հետ: