Բովանդակություն:

Reckless Racer Arduino OLED խաղ, AdafruitGFX և Bitmaps հիմունքներ. 6 քայլ
Reckless Racer Arduino OLED խաղ, AdafruitGFX և Bitmaps հիմունքներ. 6 քայլ

Video: Reckless Racer Arduino OLED խաղ, AdafruitGFX և Bitmaps հիմունքներ. 6 քայլ

Video: Reckless Racer Arduino OLED խաղ, AdafruitGFX և Bitmaps հիմունքներ. 6 քայլ
Video: OLED дисплей с контроллером SH1106 подключение к Arduino и тесты 2024, Հուլիսի
Anonim
Անխոհեմ մրցարշավորդ Arduino OLED խաղ, AdafruitGFX և Bitmaps հիմունքներ
Անխոհեմ մրցարշավորդ Arduino OLED խաղ, AdafruitGFX և Bitmaps հիմունքներ
Անխոհեմ մրցարշավորդ Arduino OLED խաղ, AdafruitGFX և Bitmaps հիմունքներ
Անխոհեմ մրցարշավորդ Arduino OLED խաղ, AdafruitGFX և Bitmaps հիմունքներ

Այս ձեռնարկում մենք կանդրադառնանք, թե ինչպես օգտագործել bitmaps- ը ՝ օգտագործելով Adafruit_GFX.c գրադարանը ՝ որպես խաղերի սպիրտ: Ամենապարզ խաղը, որի մասին մենք կարող էինք մտածել, կողային ոլորման մեքենա փոխող խաղն է, ի վերջո, մեր բետա փորձարկողն ու օգնական կոդավորողը որոշեցին «Անխոհեմ մրցարշավորդը» որպես անուն, քանի որ մայրուղին սխալ ճանապարհով վարելը բավականին անխոհեմ է:

Մեր սխեմայի դիզայնը ներկայացված է վերը նշված նկարներում և մանրամասն նկարագրված է մեր վերջին նախագծում/ձեռնարկում Snake Instructables- ում, որը նկարագրում է, թե ինչպես է աշխատում միացումը:

մենք կպահանջենք

Adafruit_GFX

Paint.net

Arduino IDE windowslinux

և խնդրում ենք դիտել Օձի ձեռնարկը մնացած սարքավորումների համար:

Պարագաներ

Օձի խաղ

Քայլ 1: Paint.net- ի տեղադրում

Paint.net- ի տեղադրում
Paint.net- ի տեղադրում
Paint.net- ի տեղադրում
Paint.net- ի տեղադրում
Paint.net- ի տեղադրում
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 ֆայլ

BMP- ի փոխարկումը C- ի Bitmap ֆայլ
BMP- ի փոխարկումը C- ի Bitmap ֆայլ
BMP- ի փոխարկում C- ի Bitmap ֆայլ
BMP- ի փոխարկում C- ի Bitmap ֆայլ
BMP- ի փոխարկում C- ի Bitmap ֆայլ
BMP- ի փոխարկում C- ի Bitmap ֆայլ
BMP- ի փոխարկում C- ի Bitmap ֆայլ
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- ի միջոցով

Լոգոյի ցուցադրում DrawBitmap- ի միջոցով
Լոգոյի ցուցադրում DrawBitmap- ի միջոցով
Լոգոյի ցուցադրում DrawBitmap- ի միջոցով
Լոգոյի ցուցադրում DrawBitmap- ի միջոցով
Լոգոյի ցուցադրում DrawBitmap- ի միջոցով
Լոգոյի ցուցադրում DrawBitmap- ի միջոցով
Լոգոյի ցուցադրում DrawBitmap- ի միջոցով
Լոգոյի ցուցադրում 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- ի տեղափոխում

Image
Image
Տեղափոխում Bitmap Sprite
Տեղափոխում Bitmap Sprite
Տեղափոխում Bitmap Sprite
Տեղափոխում 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. Վարորդական խաղ պատրաստելը

Image
Image

Սկզբում մենք նկարում ենք մի քանի տարբեր մեքենաներ կամ խոչընդոտներ, ինչպես ձեռնարկի սկզբնական փուլերում `դրանք դարձնելով 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 (); }

և դա գրեթե այդպես է, ցանկացած փոփոխություն և արձագանք ողջունելի կլինի: Էկրանի թարթումը լուծելու համար մենք պետք է նայենք, թե ինչպես նվազեցնել այն, և թշնամու մեքենաները դեռ կարող են զբաղեցնել նույն տարածքը:

Խորհուրդ ենք տալիս: